1. 導入
Go言語で開発をしていると、「特定の環境でだけ実行したいテスト」や「テスト実行時にDBの接続先やAPIキーを切り替えたい」といったケースに直面することがあります。通常、go testは完結した環境で実行されますが、テストのたびにコードを書き換えるのは非効率です。今回紹介する「go test -args」を使えば、テスト実行時に外部から引数を渡して、柔軟にテストの挙動を制御できるようになります。これにより、CI/CD環境やローカル環境でのテストの切り分けがスムーズになります。
2. 基礎知識
Goのテストにおいて、実行時にパラメータを受け取る仕組みは、標準ライブラリのflagパッケージを利用します。Goのテストコマンドであるgo testには、–argsというフラグが用意されています。このフラグ以降に記述された内容は、すべてテストプログラム側の引数として渡されます。テストコード内でflag.Parse()を呼び出すことで、シェルから渡された値をプログラム内の変数としてキャプチャできる仕組みです。
3. 実装/解決策
実装のロジックは非常にシンプルです。まず、テストファイル内でフラグを定義します。重要なのは、flag.Parse()を呼び出すタイミングです。テストコードの実行フローにおいて、フラグの解析が完了していなければ値は取得できません。一般的には、テスト関数内ではなく、init関数やTestMain関数で解析を行うのが定石です。
4. サンプルプログラム
以下のコードをtest_sample_test.goとして保存してください。
package main
import (
“flag”
“fmt”
“testing”
)
// 外部から受け取るための変数を定義
var targetEnv string
// テスト実行前にフラグを解析する
func init() {
// flag.StringVarでフラグ名、デフォルト値、説明を登録
flag.StringVar(&targetEnv, “env”, “development”, “テスト対象の環境名”)
// flag.Parseを呼び出すことで、go test -argsで渡された値が格納される
flag.Parse()
}
func TestEnvironment(t testing.T) {
// 渡された引数を使ってロジックを分岐させる
if targetEnv == “production” {
fmt.Println(“本番環境用のテストを実行します”)
} else {
fmt.Printf(“現在の環境は %s です\n”, targetEnv)
}
}
実行方法:
コマンドラインから以下のコマンドを入力してください。
go test -v test_sample_test.go -args -env=production
5. 応用・注意点
現場で活用する際の注意点が2つあります。
一つ目は、flag.Parse()の二重呼び出しです。テストフレームワークが内部的にフラグを解析している場合があるため、TestMain関数内で呼び出すのが最も安全で推奨される構成です。
二つ目は、テストの独立性です。引数によってテストの挙動が変わる場合、引数を変えるだけでテストの結果が成功・失敗に入れ替わる可能性があります。CI環境では「引数なしでもデフォルト値で安全に動く」ように設計し、特定の引数が必要な場合は明示的にドキュメントを残すようにしましょう。この仕組みを使いこなせば、モックサーバーのURLを動的に切り替えるなど、より高度なテスト自動化が実現できます。

コメント