【Go言語学習|実務向け】go test -list でテストの実行効率を最大化する:開発者のためのTips

導入

Go言語での開発において、テストコードの肥大化は避けて通れない課題です。特に数百〜数千のテストケースを持つプロジェクトでは、「今どのテストが実行対象になっているのか」「特定のテストだけを素早く特定したい」といったニーズが高まります。そこで活用したいのが go test -list コマンドです。本記事では、このコマンドを使ってテスト実行の効率を高め、CI/CDや開発フローを最適化する方法を解説します。

基礎知識

go test -list は、指定した正規表現にマッチするテスト関数、ベンチマーク関数、例(Example)関数の一覧を標準出力に表示するコマンドです。
重要な点は、このコマンドはテストを実行しない(コンパイルと解析のみを行う)という点です。そのため、重いリソースを必要とするテストが含まれていても、瞬時に一覧を取得できます。

実装/解決策

開発現場でこのコマンドが重宝されるのは、主に「テストのフィルタリング」と「外部ツールとの連携」のシーンです。
例えば、特定のモジュールに関連するテストだけを抽出してCIパイプラインのテスト実行対象リストを作成したり、IDEやエディタのプラグインでテスト選択UIを構築する際のバックエンドとして活用できます。
基本的な使い方は、以下の通りです。

go test -list ‘Regexパターン’ ./…

サンプルプログラム

以下のコードは、あるパッケージ内のテスト構成を想定した例です。このコードに対して -list を使用する手順を示します。

// math_test.go
package math

import “testing”

// 足し算のテスト
func TestAdd(t testing.T) { … }

// 引き算のテスト
func TestSubtract(t testing.T) { … }

// データベースのセットアップが必要な重いテスト
func TestDatabaseIntegration(t testing.T) { … }


実行手順:

1. 特定の文字を含むテストを探す場合:
go test -list “Add” ./math
// 出力例:
// ok example.com/math 0.001s
// TestAdd

2. “Test” で始まる全てのテスト一覧を取得する場合:
go test -list “Test” ./math

// このように実行することで、実際にテストコードを走らせることなく
// テストスイートの構成を把握することが可能です。

応用・注意点

注意点:
go test -list が出力する結果は、パッケージのコンパイル結果に基づいています。そのため、ビルドエラーが発生しているパッケージに対して実行すると、一覧の取得に失敗します。テスト名を確認する前に、まずは正常にビルドできる状態であることを確認してください。

応用テクニック:
現場では、以下のようなシェルスクリプトと組み合わせることで、自動化が加速します。

特定のパターンに一致するテストだけを抽出して実行する例
TEST_NAMES=$(go test -list “Integration” ./… | grep “Test”)
for t in $TEST_NAMES; do
go test -v -run “^$t$” ./…
done

このように、go test -list をパイプラインの「前処理」として組み込むことで、動的に実行対象を制御する柔軟なCI環境を構築できます。ぜひ日々の開発で活用してみてください。

コメント

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