2012-02-08 14 views
4

FixturesBuid-Test-Dataプラグインの助けを借りてGrails 2.0.0アプリケーションの統合テストを書いています。Grailsの統合テストは(見かけ上)ランダムで再現不可能な方法で失敗する

テスト中に、統合テストが特定の時間に失敗し、他のタイミングで失敗することが発見されました。 'test-app'を実行すると、すべてのテストが成功することがあり、テストの結果が失敗することがあります。

テストに失敗すると、ドメインクラスのインスタンスの挿入時に一意の制約違反が原因で発生します。これは、テストDBにまだレコードがあることを示します。私はH2データベースを実行しており、DataSource.groovyに 'dbCreate = "create-drop"があります。

Grails 2.0 integration test pollution?は、Grailsでテストに重大な問題があることを示しているようです。これに対する解決策はありますか?私はGrails-8530にヒットしましたか?

[編集]テスト汚染はユニットテストによって引き起こされたようです。これは、単体テストを削除し、「test-app」を繰り返し実行することによって証明されています。

答えて

5

このようなエラーが発生した場合、問題の原因となっている単体テストを見つけようとします。これはちょっとしたことかもしれません。なぜなら、あなたの機会が失敗したように見えるからです。

1)私は、最近追加された単体テストを調べます。この問題が起きたばかりの場合は、それを見るのが良い場所です。

2)メタクラスは、これらのタイプのエラーを引き起こすのがうまくいくように見えるので、セットアップ/切断されないメタクラスを探します。 < = 1.3.7の2.0の問題ではありませんが、問題になる可能性があります。

3)テストをランダムな順序で実行するプラグインを作成しました。あなたの現在の問題を解決するのに役立つかもしれない。しかし、何があなたのテストをすべて印刷して、それがあなたに与えられたものを取ってgrails test-app <pasted list of unit tests> IntegrationTestThatIsFailingを実行して、単体テストの除去を開始して、原因を見つけることができるでしょうか? (http://grails.org/plugin/random-test-order)。私はこれで2.0でバグを発見しましたが、まだ修正する時間がありませんでした。(レンダリングビュー名をアサーションするときに統合テストが失敗しますが)テスト名を出力する必要があります。

0

実際の統合テストでは、既存のレコードによる制約違反で失敗したため、機能テスト(セレン)が予期せぬ順番で実行されていた状況が思い起こされます。確かに、データベースの状態を復元するのがより難しいため、機能テストの状況は異なります(テストケースは別のjvmでトランザクションをロールバックできません)。

通常、統合テストはトランザクションをロールバックしますが、コードがトランザクション(コミット)を明示的に制御する場合は、この動作を中断することは可能です。

まず、私は3)でJarredが述べたように実行順序を強制しようとします。次に、その振る舞いを再現できると仮定して、次にトランザクションの振る舞いを確認します。 org.hibernate.transactionのログレベルをデバッグに設定すると、トランザクション境界がどこにあるかがわかります。

残念ながら、単体テストを拭き取ると、一般的な「可能性のあるメタクラス問題」以外の症状を取り除くことができます。 :)

関連する問題