【Go言語学習|実務向け】go test -list=. を使いこなす:テスト実行を効率化する開発エコシステムの構築術

1. 導入:なぜテスト名の一覧取得が必要なのか

Goで開発を進めていると、プロジェクト規模の拡大に伴い「テスト実行に時間がかかる」という課題に直面します。CI/CDパイプラインを最適化する際、すべてのテストを一括実行するのではなく、特定のテストだけを抽出・分割して並列実行したいケースは多いはずです。今回紹介する「go test -list=.」コマンドは、実際にテストを実行することなく、パッケージ内の全テスト関数名を高速に一覧表示できる機能です。このTipsを知ることで、テストの自動分割や、特定のテストをターゲットにしたCI構成が容易になります。

2. 基礎知識:go testコマンドの仕組み

通常、go testコマンドを実行すると、指定されたパッケージ内のテスト関数(TestXxx形式)がコンパイルされ、実行されます。しかし、-listフラグを利用することで、テストの実行フェーズをスキップし、パッケージのメタデータからテスト関数名のリストだけを抽出することが可能です。このコマンドは、シェルスクリプトやCIツール(GitHub ActionsやCircleCIなど)と連携する際の「前処理」として非常に強力な武器となります。

3. 実装/解決策:リスト抽出の論理

-list=.という引数は、正規表現を用いてテスト名をフィルタリングする機能を利用しています。「.(ドット)」は「任意の文字」を意味するため、実質的に「すべてのテスト名を表示する」という動作になります。
この出力をテキスト処理ツール(grepやawkなど)と組み合わせることで、特定の命名規則を持つテストだけを抽出したり、テストの総数を計測して複数のコンテナに動的に振り分けるといった高度なオーケストレーションが可能になります。

4. サンプルプログラム:テスト抽出と動的実行

以下のコードは、現在のパッケージ内のテスト名を一覧取得し、それを元に特定のテストだけを個別に実行するスクリプトの概念です。

package example

import “testing”

// テスト関数例1
func TestLoginFeature(t testing.T) {
// ログインロジックのテスト
}

// テスト関数例2
func TestPaymentGateway(t testing.T) {
// 決済ロジックのテスト
}

/
【利用方法】
ターミナルで以下のコマンドを実行してください。

1. 全テスト名のリストを表示
go test -list=.

2. リストを加工して特定のテストだけを実行する例(シェル)
“Login”を含むテストのみを抽出し、実行する
go test -v $(go test -list=. | grep “Login”)
/

5. 応用・注意点:現場で陥りやすい罠

現場でこの機能を利用する際、以下の点に注意してください。

出力形式の解釈:
go test -list=. の出力には、パッケージ名やヘッダーが含まれることがあります。CIスクリプトで利用する場合は、出力の不要な行を削除するために、grep “^Test” のように、テスト関数の命名規則(Testで始まる)にマッチさせるフィルタリングを必ず行いましょう。

ビルドタグの考慮:
リスト表示されるテストは、現在のビルドタグやOS環境で有効なものに限定されます。もしCI環境とローカル環境で異なるOSやタグを使用している場合、表示されるテストリストに差異が出る可能性があるため、オーケストレーター側で環境変数を統一しておくのが無難です。

パフォーマンス:
このコマンドはテストの実行を伴わないため非常に高速ですが、パッケージ数が多い大規模モノレポ構成では、全パッケージに対してループ処理を行うとそれなりの時間がかかります。必要に応じてパッケージ単位で実行する設計を心がけてください。

コメント

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