テストがグローバル変数とローカル データベース サーバーに依存している場合、go test を使用してサブディレクトリの下で複数のパッケージのテストを実行するのは困難になる可能性があります。 go test ./... はテストを実行しますが、データベース内の潜在的な競合により失敗します。
問題を理解する
この問題は go test が原因で発生します。 /... は、異なるパッケージのテストを並行して実行します。各テスト ファイルにデータベース ポインタを含むグローバル変数が含まれており、テストがデータベース操作に依存している場合、この並列処理によりデータ競合によるテストの失敗が発生する可能性があります。
潜在的な修正
1.テストを連続的に実行する
パッケージ間で連続テストを強制するには、go test の実行時に文書化されていないフラグ -p 1 を使用することを検討してください。このフラグは、すべてのパッケージを強制的にビルドし、順番にテストします。
<code class="bash">go test -p 1 ./...</code>
2.シェル スクリプトの使用
-p 1 が適切でない場合は、 go test ./... の動作をエミュレートし、順次テストを強制するシェル スクリプトの使用を検討してください。これは、*.go ファイルを含むサブディレクトリをリストし、重複を削除し、各サブディレクトリに対して 1 つずつ go test を実行することで実現できます。
<code class="bash">find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test</code>
3.データベースを意識したテスト
もう 1 つのアプローチは、テスト コードを変更して同時実行性をより意識することです。これには、パッケージ レベルのデータベースを使用し、データベースの初期化と破棄をそれぞれテストの開始と終了に延期することが含まれる場合があります。データベース操作が同期していること、および各テストに独自のデータベース リソース セットがあることを確認することが重要です。
例:
以下は、データベースを確実に実行する方法の例です。各テストでの分離:
<code class="go">import ( "database/sql" "testing" ) type DBWrapper struct { *sql.DB } func (db DBWrapper) TearDown(t *testing.T) { if err := db.Close(); err != nil { t.Errorf("Failed to close database: %v", err) } } func TestDatabase(t *testing.T) { defer DBWrapper{sql.Open(...)}.TearDown(t) // Conduct test operations using the isolated DBWrapper }</code>
これらの手法を使用すると、競合関連のエラーが発生することなく、データベース操作を伴う複数のパッケージのテストを実行できます。
以上がデータベースの競合を発生させずに Go で複数のパッケージ間で同時テストを実行する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。