41

「go test」を実行するときに、別の構成ファイルを使用したいと考えています。テスト コンテキスト内で実行しているか、通常のコンテキスト内で実行しているかを、コード内でどのように知ることができますか? チェックする環境変数はありますか?

4

10 に答える 10

8

1 つの可能性は、ビルドの制約を使用することです。次のように実行する場合go test:

go test -tags testing pkgname

次に、そのタグを使用して、パッケージの標準ビルドに含めるファイルと、テストに使用するファイルを選択できます。

標準構成を独自のファイルに入れる場合、次のような行を先頭に追加すると、それがテストに使用されないことが保証されます。

// +build !testing

次に、テスト構成をファイルの 1 つ、またはタグ*_test.goの設定が必要な他のファイルに含めることができます。testing

于 2013-01-10T11:20:59.557 に答える
8

コード例が役立ちます。しかし、あなたの質問からは、おそらく代わりにパスを渡したいときに、構成ファイルへのパスをどこかにハードコードしたように思えます。

テストしている関数を変更して、構成ファイルを定義するパラメーターを取得し、テストコードで、非テストコードで使用するものとは異なるパスを渡します。テスト時と本番環境でコードのパスが異なるのは悪い習慣です。

于 2013-01-10T02:33:10.703 に答える
4

この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 コメントに基づいてコードを更新しました

于 2019-11-20T00:50:52.307 に答える
1

Pram の回答と同様に、テストを実行するときに環境変数を設定する場合があります。

メイクファイル

test:
 ENV=testing go test ./...

main.go

  env := os.Getenv("ENV")
于 2021-11-09T00:44:26.527 に答える
0

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")
    }
 }
于 2017-06-23T08:15:19.147 に答える