src/ ディレクトリ内のサブディレクトリに保存されている複数のパッケージを操作し、各パッケージのテストを個別に実行する場合go test を使用すると、通常は成功します。ただし、 go test ./... を使用してすべてのテストをまとめて実行しようとすると、問題が発生します。
テストは実行されますが、ローカル データベース サーバーに対して操作すると、テスト間の競合により最終的に失敗します。データベースの競合を防ぐために -Parallel 1 を設定したにもかかわらず、テストは依然として失敗します。これは、テストのシーケンスに問題があることを示唆しています。
各テスト ファイルには 2 つのグローバル変数が含まれています:
<code class="go">var session *mgo.Session var db *mgo.Database</code>
さらに、次のセットアップ関数とティアダウン関数が使用されています:
<code class="go">func setUp() { s, err := cfg.GetDBSession() if err != nil { panic(err) } session = s db = cfg.GetDB(session) db.DropDatabase() } func tearDown() { db.DropDatabase() session.Close() }</code>
各テストは setUp() で始まり、tearDown() で終わります。 cfg は次のように定義されています:
<code class="go">package cfg import ( "labix.org/v2/mgo" ) func GetDBSession() (*mgo.Session, error) { session, err := mgo.Dial("localhost") return session, err } func GetDB(session *mgo.Session) *mgo.Database { return session.DB("test_db") }</code>
ランダム データベースを使用するように cfg を変更すると、テストは正常に成功しました。この観察は、複数のパッケージのテストがある程度同時に実行されることを意味します。
考えられる解決策:
オプション 1 (文書化されていません):
オプション 2 (シェルベース):
Bash コマンド:
<code class="bash">find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test</code>
関数エイリアス (gotest):
<code class="bash">function gotest(){ find -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }</code>
getest . を呼び出すと、現在のディレクトリ内のすべてのテストを順番に実行できます。
以上が「-Parallel 1」を使用しているにもかかわらず、Go で複数のパッケージにわたってテストを実行するとテストが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。