JUnitのテストの順序

JUnitでのテストの順序

1. 概要

デフォルトでは、JUnit runs tests using a deterministic, but unpredictable orderMethodSorters.DEFAULT)です。

ほとんどの場合、その動作は完全に問題なく、許容範囲内です。ただし、特定の順序を適用する必要がある場合があります。

2. JUnit5でのテスト順序

JUnit 5では、we can use @TestMethodOrder to control the execution order of tests

後で説明するように、独自のMethodOrdererを使用することも、3つの組み込みオーダーのいずれかを選択することもできます。

  1. @Order注釈

  2. Alphanumeric注文

  3. 順不同

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.JVMthis 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で見つけることができます。