すべてのテストを実行した場合にのみ失敗する不安定なjunitテストがあります。あるテストが別のテストを失敗させていると思います。修正を試みる前に、それを証明したいと思います。
すべてのテストを実行すると、「不良セットアップ」が実行され、「不良セットアップ後に失敗するテスト」が実行されます。また、その間に多くの無関係で遅いテストを実行します。しかし、パターンを使用してこれら2つだけを実行すると、「不良セットアップ後に失敗するテスト」、次に「不良セットアップ」が実行されます。その結果、どちらも合格です。
「不良セットアップ」と「不良セットアップ後に失敗するテスト」をこの順序でのみ実行するにはどうすればよいですか?
JUnitのwiki によると:
設計上、JUnitはテストメソッド呼び出しの実行順序を指定しません。これまでは、リフレクションAPIから返された順序でメソッドが呼び出されていました。ただし、Javaプラットフォームは特定の順序を指定していないため、JVMの順序を使用することは賢明ではありません。実際、JDK 7は多かれ少なかれランダムな順序を返します。もちろん、適切に記述されたテストコードは順序を想定していませんが、一部は想定しています。予測可能な障害は、特定のプラットフォームでのランダムな障害よりも優れています。
バージョン4.11以降、JUnitはデフォルトで決定論的ではあるが予測不可能な順序(MethodSorters.DEFAULT)を使用します。テストの実行順序を変更するには、@ FixMethodOrderを使用してテストクラスに注釈を付け、使用可能なMethodSorterの1つを指定するだけです。
@FixMethodOrder(MethodSorters.JVM)
:JVMから返された順序でテストメソッドを残します。この順序は実行ごとに異なる場合があります。
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
:テストメソッドをメソッド名で辞書順にソートします。
MethodSorters.NAME_ASCENDING
とメソッド名を変更して、特定の順序と一致させます。デバッグ目的でこれを使用していることはわかっていますが、テストメソッドの実行順序に依存するのはTest Smellであり、JUnitはこれ以上の粒度を提供しませんテストメソッドの実行順序の制御
ALi 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
};
}
単体テストは独立している必要があるため、ほとんどのフレームワークは、実行される順序を保証または強制しません。しかし、あなたが順序を強制したいので、過去に私が行った最も簡単な方法で、実行したい順序でテストを呼び出す「捨てる」テストスイートまたはテストメソッドを作成します。ユニットテストはメソッドです、それらを呼び出すだけです。これは、数十のテストを扱っている場合は簡単に実行でき、数百または数千を扱っている場合はまったく魅力的ではありません。
不安定な相互作用を可能な限り分離し、使い捨ての呼び出しメソッド内で相互作用の弱いテストの順序を入れ替えます。