2011-07-05 14 views
1

各テストの前に常に既知の状態にリセットすることで、テストをクリーンアップしようとしています。 JUnitでは、これを行う最善の方法は、いくつかのフィールドの値を設定するsetup()メソッドを持つことです。テストを並行して実行する場合、各テストはテストの新しいインスタンスで実行されるため、フィールドは常に正確です。既知の状態からテストを開始する - マルチスレッドはどうですか?

しかし、TestNGではこれは当てはまりません。 post on their mailing listによれば、マルチスレッドテストで@BeforeMethodのフィールドを設定しても、その値は保証されません。

私は既知の状態にあることをテストしているクラスが必要なので、DataProviderを使用するか、「マルチスレッドモードでテストを実行しないでください」と言うよりも、これに対してよりクリーンなソリューションがありますか?

+0

TestNGテストケースでインスタンス変数として 'ThreadLocal'を使うのはどうですか? –

答えて

1

この特定の領域でTestNGとJUnitの違いは1つだけです。JUnitは、各テストメソッドの前に新しいテストインスタンスを作成しますが、TestNGはそうしません。

これは、TestNGでテストメソッドによってフィールドに格納された値が呼び出し間で保持されることを意味します。これは、このオブジェクトが複雑で作成に時間がかかる場合に非常に便利です。また、この状態を毎回ゼロから再作成する必要がないため、テスト実行のスピードアップに役立ちます。

この状態を毎回リセットする場合は、@BeforeMethodに初期化コードを入れてください(@Beforeということを除いて)。

マルチスレッドの場合、なぜその値についての保証がないと言っているのか分かりませんが、より具体的にできますか?

+0

フィールドはすべてのテストで共有されるため、複数のスレッドでテストを実行すると、別のテストメソッドが起動するとフィールドが途中までリセットされる – TheLQ

+0

Trueですが、通常はTestNGをパラレルモードで使用して、マルチスレッド環境テストコードそのもの。また、TestNGで並列性を使用してテストをスピードアップするので、ここでは互いに独立しているという前提があります。 TestNGでは、その目的のためにさまざまなスレッド戦略を指定できます。 –

+0

あなたの答えの後、私は大きなテストクラスの一つを@BeforeMethodレイアウトに移しました。それは動作します。しかし、私はまだ複数のスレッドでテストを実行する他の人が心配です。私はJavadocクラスに大きな警告を加え、それがうまくいくようにしています。 – TheLQ

関連する問題