【Go言語学習|実務向け】Go開発の生産性を劇的に向上させる:go test -shortによるテスト時間短縮術

導入

Go言語での開発において、テストの実行速度は開発サイクル全体の生産性に直結します。プロジェクトが成長するにつれ、データベース接続や外部API呼び出しを伴う「重いテスト」が増え、ローカル環境でのテスト実行に時間がかかることは珍しくありません。結果として「テストを回すのが億劫になり、修正後の確認が疎かになる」という悪循環に陥ります。この課題を解決するのが、Go標準の `-short` フラグです。本記事では、この機能を活用してフィードバック速度を維持しつつ、テストの網羅性を両立させる方法を解説します。

基礎知識

`go test -short` とは、Goのテストツールが提供するフラグの一つです。このフラグ単体ではテストの挙動は変わりませんが、コード内で `testing.Short()` 関数と組み合わせることで、「短い時間で終わるテスト」と「時間のかかるテスト」を論理的に切り分けることができます。`testing.Short()` は、`-short` フラグが指定された場合に `true` を返し、指定されていない場合は `false` を返します。これにより、開発時のローカル実行では高速な単体テストのみを実行し、CI環境では全てのテストを実行するといった制御が可能になります。

実装/解決策

実装の基本方針は、時間がかかる処理や外部リソースを必要とするテストケースに対し、`testing.Short()` をチェックするガード句を挿入することです。これにより、開発者はターミナルで `go test -short ./…` を実行するだけで、時間のかかる重い処理を即座にスキップできます。

サンプルプログラム

以下は、外部APIへのリクエストのような「重いテスト」を適切に制御する実装例です。

package main

import (
“testing”
“time”
)

// 重い処理をシミュレートする関数
func performHeavyTask() bool {
// 実際にはDB接続や外部API通信などが入る
time.Sleep(5 time.Second)
return true
}

func TestHeavyProcess(t testing.T) {
// testing.Short() を使い、-short フラグが立っている場合はテストをスキップする
if testing.Short() {
t.Skip(“短縮モードのため、重いテストをスキップします”)
}

// 実際の重いテスト処理
result := performHeavyTask()
if !result {
t.Error(“期待した結果が得られませんでした”)
}
}

func TestFastProcess(t testing.T) {
// このテストは短いため、-short フラグの有無に関わらず実行される
if 1+1 != 2 {
t.Error(“単純な計算が間違っています”)
}
}

応用・注意点

現場で運用する際の注意点がいくつかあります。

1. CI/CDパイプラインの設定: CI環境では `-short` を付けずに実行するように構成してください。そうしないと、重要な統合テストやエンドツーエンドテストが実行されず、バグが本番環境へ混入するリスクが高まります。
2. デフォルトの判断基準: どの程度の時間を「重い」と定義するか、チーム内で基準(例:1秒以上かかるものはスキップ対象とする等)を設けることが重要です。
3. テストの独立性: `-short` を使用する場合でも、スキップされたテストが他のテストに副作用を与えないよう、テストの独立性を保つ設計(Setup/Teardownの適切な管理)を徹底してください。

適切な使い分けを行うことで、開発の快適さとコードの堅牢性を両立させることが可能になります。ぜひ今日からの開発フローに取り入れてみてください。

コメント

タイトルとURLをコピーしました