2016-10-11 22 views
2

私はテストを並行して実行し、2つのテスト(下記)がインスタンス変数を共有すると競合状態になるのだろうか?私のテストクラスはSpringJunit4ClassRunnerで実行され、2つのテストメソッドa()とb()があり、変数stateは各テストから変更または再割り当てされ、doSomethingWithState()は変数stateを使用してテストに渡します方法。私はmaven-surefire-pluginを知っているので、a()とb()の両方がスレッドに割り当てられ、並列に実行されるメソッドレベルで実行することができます。 に依存...あなたの正確な状況とコードベース上:並行してjunitテストを実行するときの競合条件

@RunWith(SpringJUnit4ClassRunner.class) 
public class TestA { 

    private Object state; 

    @Test 
    public void a() { 
      stateObjectA(); 
      doSomethingWithState(); 
      assertion(); 
    } 

    @Test 
    public void b() { 
      stateObjectB(); 
      doSomethingWithState(); 
      assertion(); 
    } 

    private void stateObjectA() { 
      // do some mocking and setup state 
    } 

    private void stateObjectB() { 
      // do some mocking and setup state 
    } 

    private void doSomethingWithState() { 
      // use the state object and feed into the testing method 
    } 
} 
+0

「@ Test」アノテーションはどこにありますか? – dit

+0

OOps ...私はそれを更新しました – peter

+3

[JUnit4はテストメソッドごとに新しいインスタンスを作成します](http://stackoverflow.com/questions/19381352/does-junit-reinitialize-the-class-with-each-test -method-invocation):メソッドごとに 'state'のインスタンスが異なるため、スレッドの干渉はありません。 [Martin Fowlerのブログ記事(http://www.martinfowler.com/bliki/JunitNewInstance.html)も参照してください。 –

答えて

2

私は唯一の合理的な答えがあると思います。

本質競合状態の場合は、次のとおりです。あなたはデータを共有に1つのスレッド操作(「書き込み」)よりも多くを持っています。あなたの長い質問は、まさにそのようなセットアップにまで沸き立っています。したがって、上記で説明したセットアップの競合条件には、という高い可能性があるが存在します。

そして:いくつかのテストフレームワークによって呼び出される実動コードまたはメソッドのメソッドについて話しているなら、それは何の違いもありません。競争条件はそれを気にしないからです。彼らは、共有データに書き込む複数のスレッドについてのみ気にします。

これはすべてここで重要です!

0

あなたのアカウントに二つのことを行う必要があります。

  • あなたはインスタンス変数を使用する必要がある場合(Junit4をロードすると、静的なため@Before、@After注釈、および@BeforeClassと@AfterClassを提供する前に、あなたがそれらをインスタンス化変数)。

  • Junitは毎回同じ順序でテストケースが実行されることを保証するものではないため、残りのテストと区別してコードをコーディングする必要があります。

別の明白な点は、他のテストの結果に基づいてテストを考えるべきではないということです。これを考慮に入れて、統合テストのためのものを嘲笑してください。おそらく、テストがランダムに失敗し始め、その理由を知ることはできません。

関連する問題