「go test」を実行するときに、別の構成ファイルを使用したいと考えています。テスト コンテキスト内で実行しているか、通常のコンテキスト内で実行しているかを、コード内でどのように知ることができますか? チェックする環境変数はありますか?
10 に答える
1 つの可能性は、ビルドの制約を使用することです。次のように実行する場合go test
:
go test -tags testing pkgname
次に、そのタグを使用して、パッケージの標準ビルドに含めるファイルと、テストに使用するファイルを選択できます。
標準構成を独自のファイルに入れる場合、次のような行を先頭に追加すると、それがテストに使用されないことが保証されます。
// +build !testing
次に、テスト構成をファイルの 1 つ、またはタグ*_test.go
の設定が必要な他のファイルに含めることができます。testing
コード例が役立ちます。しかし、あなたの質問からは、おそらく代わりにパスを渡したいときに、構成ファイルへのパスをどこかにハードコードしたように思えます。
テストしている関数を変更して、構成ファイルを定義するパラメーターを取得し、テストコードで、非テストコードで使用するものとは異なるパスを渡します。テスト時と本番環境でコードのパスが異なるのは悪い習慣です。
このflag.Lookup("test.v")
ソリューションは私にとっても機能しません (go 1.13)。維持するサービスがたくさんありfunc TestMain(m *testing.M)
、すべてのサービスでソリューションを使用することは現実的ではありません。すべてのサービスが共通のライブラリを共有しているため、次の解決策を考え出しました。
func isInTests() bool {
for _, arg := range os.Args {
if strings.HasPrefix(arg, "-test.v=") {
return true
}
}
return false
}
flag.Lookup("test.v")
が存在するかどうかを確認するため、これはソリューションに似てい-test.v
ます。
EDIT : @mh-cbon コメントに基づいてコードを更新しました
Pram の回答と同様に、テストを実行するときに環境変数を設定する場合があります。
メイクファイル
test:
ENV=testing go test ./...
main.go
env := os.Getenv("ENV")
Garrett のソリューションよりも堅牢なソリューションは次のとおりです。
func init() {
if v := flag.Lookup("test.v"); v == nil || v.Value.String() != "true" {
fmt.Println("normal run")
} else {
fmt.Println("run under go test")
}
}