「-Parallel 1」を使用しているにもかかわらず、Go で複数のパッケージにわたってテストを実行するとテストが失敗するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-04 05:53:29
オリジナル
620 人が閲覧しました

Why Do Tests Fail When Running Across Multiple Packages in Go Despite Using `-parallel 1`?

Go で複数のパッケージにわたってテストを実行すると同時実行の問題が発生する

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 (文書化されていません):

  • 文書化されていないフラグ go test -p 1 を使用します。これにより、すべてのパッケージが順番にビルドおよびテストされます。

オプション 2 (シェルベース):

  • シェルを使用して逐次テストを強制しながら go test ./... の機能をエミュレートします。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!