2015-12-24 4 views
9

私はすべてのテストを実行するだけで不合理なjunitテストを持っています。 1つのテストで別のテストが失敗する原因になっていると思います。問題を解決しようとする前にそれを証明したいと思います。Intellijでjunitテストを実行するための注文を定義するにはどうすればよいですか?

すべてのテストを実行すると「不良セットアップ」が実行され、「不良セットアップ後に失敗するテスト」が実行されます。また、間に無関係な、遅いテストをたくさん実行します。しかし、私がこれらの2つだけを実行するためにパターンを使用すると、「設定が悪いと失敗したテスト」、「悪い設定」が実行されます。結果として、両方が合格する。

「不良セットアップ」と「不良セットアップ後に失敗するテスト」をこの順番で実行するにはどうすればよいですか? JUnit's wikiによると

+0

あなたは、私は* *テストを修正するために、問題を知っている必要がありますテスト –

+2

@Lashaneを修正する必要があります。この質問は、問題の内容を知ることです。 –

+0

通常、「デバッグ」はそれを解決する方法、すべてのテストを実行する方法、失敗した場所を見つける方法、ブレークポイントを前に置く方法、実際に何が失敗するのか、どのような状態/変数につながるのか、すべてのテストをもう一度実行してください。 –

答えて

20

:設計により

、JUnitはテストメソッド 呼び出しの実行順序を指定していません。これまでは、リフレクションAPIによって返された の順番でメソッドが呼び出されました。ただし、Javaプラットフォームでは特定の順序が指定されておらず、 のJDK 7では多かれ少なかれランダムな順序が返されるため、JVMの順序を使用することは賢明ではない です。もちろん、 よく書かれたテストコードは、何の順序も想定していないものもあれば、あるものもあります。 予測可能な障害は、特定の プラットフォームのランダム障害よりも優れています。

バージョン4.11以降、JUnitはデフォルトでは、確定可能な順序()のorder(MethodSorter.DEFAULT)を使用しません。

@FixMethodOrder(MethodSorters.JVM):JVMで返さ 順にテストメソッドを残しテスト 実行順序は、単に@FixMethodOrder を使用して、テストクラスに注釈を付け、利用可能なMethodSortersのいずれかを指定変更します。この順序は、実行ごとに異なる場合があります。

@FixMethodOrder(MethodSorters.NAME_ASCENDING):テストメソッド をメソッド名で、辞書順にソートします。

MethodSorters.NAME_ASCENDINGを使用して、メソッド名を特定の順序に変更することができます。

+0

これは参考になります最後に、私は手動で@Ignoreをすべてに(一時的に)入れます。 –

+0

Ohmmm、nice hack :) –

+1

この問題は複数のクラスにまたがるため、このシナリオは役に立ちません。 –

0

ユニットテストが独立するべき私はあなただけで酒をデバッグするためにこれを使用している知っているが、それはあなたのテストメソッドの実行順序に依存するテスト香りだとJUnitは、テストメソッドの実行順序をよりきめ細かい制御を提供していません。ほとんどのフレームワークは、実行される順序を保証したり強制したりするものではありません。しかし、あなたが注文を強制するのは、私が過去にやったことの中で最も簡単な方法です。テストスイートを投げ捨てるか、テストを呼び出すテストメソッドを作成します。単体テストはメソッドです、ちょうどそれらを呼び出します。何百、何千ものテストを扱っているならば、数十回のテストを扱っているならば、これは簡単です。

可能であれば薄片状の相互作用を分離してから、間違って相互作用する試験の順番に置き換えてください。

4

アリDehghaniで言ったように、あなたが

@FixMethodOrder(MethodSorters.NAME_ASCENDING)によるテストメソッドの実行を注文することができますが:辞書順に、メソッド名による試験方法 をソートします。

コード:

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class ApplicationTest extends ActivityInstrumentationTestCase2<MainActivity> { 

    public ApplicationTest() { 
     super(MainActivity.class); 
    } 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class); 

    @Test 
    void t1AttachUI(){ 
     // testing code goes here 
    } 

    @Test 
    void t2InitializeViews(){ 
     // testing code goes here 
    }; 

    @Test 
    void t3SettingValues(){ 
     // testing code goes here 
    }; 

    @Test 
    void t4Validation(){ 
     // testing code goes here 
    }; 

    @Test 
    void t3AfterButtonPress(){ 
     // testing code goes here 
    }; 
} 
+2

この問題は複数のクラスにまたがるため、このシナリオは役に立ちません。 –

関連する問題