15

src/ の下のサブディレクトリの下に複数のパッケージがあり、各パッケージのテストを実行しても問題なくgo test動作しています。

テストが実行されている状態ですべてのテストを実行しようとするgo test ./...と失敗します..

テストはローカル データベース サーバーに対して実行され、各テスト ファイルには db ポインターを持つグローバル変数があります。

データベースでの競合を防ぐために でテストを実行しようとしました-parallel 1が、テストはまだ失敗します。

ここで何が問題になる可能性がありますか?

編集:一部のテストは、欠落している DB エントリで失敗しています。各テストの前後に DB を完全にクリアします。なぜこれが起こっているのか私が考えることができる唯一の理由は、テスト間の競合のためです。

編集2:

私のテストファイルにはそれぞれ2つのグローバル変数があります(mgoを使用):

var session *mgo.Session
var db *mgo.Database

また、次のセットアップおよびティアダウン機能があります。

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()
}

各テストは、 と で起動しsetUp()ますdefer tearDown()

また、cfgは次のとおりです。

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")
}

編集3:

ランダム データベースを使用するように cfg を変更したところ、テストに合格しました。複数のパッケージのテストが並行して実行されているようです。

go testパッケージ間ですべてを順番に実行することを強制することは可能ですか?

4

4 に答える 4

21

更新: @Gal Ben-Haim が指摘したように、(文書化されていない)go test -p 1フラグを追加すると、すべてのパッケージが順番にビルドおよびテストされます。Go ソースコードの testflag 使用メッセージに記載されているとおり:

-p=n: 最大 n 個のパッケージを並行してビルドおよびテストします

古い答え:

を実行go test ./...すると、設定した場合でも、異なるパッケージのテストが実際には並行して実行されますparallel=1(一度に 1 つずつ実行されることが保証されているのは、特定のパッケージ内のテストのみです)。データベースのセットアップ/ティアダウンが関係する場合のように、パッケージを順番にテストすることが重要な場合、シェルを使用して の動作をエミュレートしgo test ./...、パッケージを強制的にテストすることが唯一の方法のようです。 1。

たとえば、次のようなものが Bash で機能します。

find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test

このコマンドは、最初に、*.goファイルを含むすべてのサブディレクトリを一覧表示します。次に、sort -u各サブディレクトリを 1 回だけ一覧表示するために使用します (重複を削除します)。go test最後に、go ファイルを含むすべてのサブディレクトリが経由でフィードされますxargs。は-P1、一度に多くても 1 つのコマンドを実行することを示します。

残念ながら、これは単に を実行するよりもかなり醜いですがgo test ./...、シェル スクリプトに入れるか、より覚えやすい関数にエイリアスを設定すれば許容できるかもしれません。

function gotest(){   find $1 -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }

現在のディレクトリですべてのテストを実行するには、次を呼び出します。

gotest .
于 2014-05-24T03:00:39.937 に答える
12

どうやら runninggo test -p 1はすべてを順番に実行します (ビルドを含む) go help testgo help testflag

于 2014-05-24T08:13:40.823 に答える
0

この状況では、パッケージが個別に合格するため、そのテストの前にも DB をドロップしていると思います。

したがって、各パッケージ テストの DB の状態は空であると予想されるようです。
そのため、パッケージ テストの各セット間で DB を空にする必要があります。これには 2 つの方法があります。状況全体を把握していないため、両方のオプションについて簡単に説明します。

オプション 1. テストのセットアップ

各パッケージ _test ファイルの先頭に関数を追加しinit()、DB を削除する処理を入れます。これはinit()、実際のパッケージのメソッドの前に実行されます。

func init() {
    fmt.Println("INIT TEST")
    // My test state initialization
    // Remove database contents
}

パッケージにも出力に表示される同様の印刷行があると仮定します (stdout 出力は、テストが失敗した場合、または-vオプションを指定した場合にのみ表示されることに注意してください)

INIT TEST
INIT PACKAGE

オプション 2. データベースをモックする

データベースのモックを作成します (特にテストしている場合を除きます)。モック データベースは、各テストの開始状態で DB が空白のように常に動作できます。

于 2014-05-19T01:46:28.910 に答える
-1

以下の github リポジトリをお試しください。

https://github.com/appleboy/golang-testing

にコピーcoverage.sh/usr/local/bin/coverageて権限を変更します。

$ curl -fsSL https://raw.githubusercontent.com/appleboy/golang-testing/master/coverage.sh /usr/local/bin/coverage
$ chmod +x /usr/local/bin/coverage
于 2016-07-30T12:37:08.563 に答える