JUnitでのテストの順序
1. 概要
デフォルトでは、JUnit runs tests using a deterministic, but unpredictable order(MethodSorters.DEFAULT)です。
ほとんどの場合、その動作は完全に問題なく、許容範囲内です。ただし、特定の順序を適用する必要がある場合があります。
2. JUnit5でのテスト順序
JUnit 5では、we can use @TestMethodOrder to control the execution order of tests。
後で説明するように、独自のMethodOrdererを使用することも、3つの組み込みオーダーのいずれかを選択することもできます。
-
@Order注釈
-
Alphanumeric注文
-
順不同
2.1. @Orderアノテーションの使用
@Orderアノテーションを使用して、テストを特定の順序で実行するように強制できます。
次の例では、メソッドは次の順序で実行されます—firstTest()、次にsecondTest()、最後にthirdTest():
@TestMethodOrder(OrderAnnotation.class)
public class OrderAnnotationUnitTest {
private static StringBuilder output = new StringBuilder("");
@Test
@Order(1)
public void firstTest() {
output.append("a");
}
@Test
@Order(2)
public void secondTest() {
output.append("b");
}
@Test
@Order(3)
public void thirdTest() {
output.append("c");
}
@AfterAll
public static void assertOutput() {
assertEquals(output.toString(), "abc");
}
}
2.2. Alphanumericの順序を使用する
名前に基づいて英数字順にテストを実行することもできます。
@TestMethodOrder(Alphanumeric.class)
public class AlphanumericOrderUnitTest {
private static StringBuilder output = new StringBuilder("");
@Test
public void myATest() {
output.append("A");
}
@Test
public void myBTest() {
output.append("B");
}
@Test
public void myaTest() {
output.append("a");
}
@AfterAll
public static void assertOutput() {
assertEquals(output.toString(), "ABa");
}
}
英数字の順序では大文字と小文字が区別されるため、大文字が最初に来てから小文字が来ることに注意してください。
テストは、myATest()、myBTest()、最後にmyaTest()の順序で実行されます。
2.3. カスタムオーダーの使用
最後に、we can use our own custom order by implementing theMethodOrdererinterface.
CustomOrderでは、大文字と小文字を区別しない英数字の順序で、名前に基づいてテストを並べ替えます。
public class CustomOrder implements MethodOrderer {
@Override
public void orderMethods(MethodOrdererContext context) {
context.getMethodDescriptors().sort(
(MethodDescriptor m1, MethodDescriptor m2)->
m1.getMethod().getName().compareToIgnoreCase(m2.getMethod().getName()));
}
}
次に、CustomOrderを使用して、前の例と同じテストを次の順序で実行します—myATest()、myaTest()、最後にmyBTest():
@TestMethodOrder(CustomOrder.class)
public class CustomOrderUnitTest {
// ...
@AfterAll
public static void assertOutput() {
assertEquals(output.toString(), "AaB");
}
}
3. JUnit 4のテスト順序
まだJUnit4を使用している場合、テストを注文するためのAPIは少し異なります。
以前のバージョンでもこれを実現するためのオプションを見ていきましょう。
3.1. MethodSorters.DEFAULTの使用
このデフォルト戦略は、ハッシュコードを使用してテストメソッドを比較します。 ハッシュ衝突の場合、辞書式順序が使用されます。
@FixMethodOrder(MethodSorters.DEFAULT)
public class DefaultOrderOfExecutionTest {
private static StringBuilder output = new StringBuilder("");
@Test
public void secondTest() {
output.append("b");
}
@Test
public void thirdTest() {
output.append("c");
}
@Test
public void firstTest() {
output.append("a");
}
@AfterClass
public static void assertOutput() {
assertEquals(output.toString(), "cab");
}
}
上記のクラスでテストを実行すると、assertOutput()を含め、すべて合格していることがわかります。
3.2. MethodSorters.JVMの使用
別の順序付け戦略はMethodSorters.JVM –this strategy utilizes the natural JVM ordering – which can be different for each run:です
@FixMethodOrder(MethodSorters.JVM)
public class JVMOrderOfExecutionTest {
// same as above
}
このクラスでテストを実行するたびに、異なる結果が得られます。
3.3. MethodSorters.NAME_ASCENDINGの使用
最後に、この戦略は辞書式順序でテストを実行するために使用できます。
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class NameAscendingOrderOfExecutionTest {
// same as above
@AfterClass
public static void assertOutput() {
assertEquals(output.toString(), "abc");
}
}
同様に、このクラスでテストを実行すると、assertOutput()を含め、すべて合格していることがわかります。これにより、アノテーションで設定した実行順序が確認されます。
4. 結論
このクイックチュートリアルでは、JUnitで使用可能な実行順序を設定する方法を説明しました。
そして、いつものように、この記事で使用されている例はover on GitHubで見つけることができます。