Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JUnit5.7, 5.8の新機能紹介 #jjug_ccc #jjug_ccc_b / junit 5.7, 5.8 new features

JUnit5.7, 5.8の新機能紹介 #jjug_ccc #jjug_ccc_b / junit 5.7, 5.8 new features

JUnit5.7, 5.8の新機能紹介

Java言語でつくられるソフトウェアを自動テストするときのツールであるJUnitの最新機能を紹介します。 メインは2021年にリリースされた5.8を対象にしますが、一部5.7の機能も深掘ります。

JJUG CCC 2022 Springでのプレゼンになります。

プレゼンアブスト : https://fortee.jp/jjug-ccc-2022-spring/proposal/4152bc33-c3f3-4041-9c3e-3056d82dd51c

リポジトリ : https://github.com/kyonmm/junit-5-8-examples

kyonmm
PRO

June 19, 2022
Tweet

More Decks by kyonmm

Other Decks in Technology

Transcript

  1. JUnit5.7, 5.8の新機能紹介
    kyon_mm

    View Slide

  2. View Slide

  3. JUnitはJava言語で自動テストをするための
    フレームワークとしてデファクトスタンダー
    ドの位置にある
    • JUnit5のリリース以降は継続的にリリースされている
    • 2022/05 最新版は5.8.2
    • 5.8と5.7の新機能を一部紹介
    • JUnitのスポンサーはこちらから
    • https://steadyhq.com/en/junit/about

    View Slide

  4. Jupiterを中⼼に紹介
    引⽤ : https://junit.org/junit5/docs/current/user-guide

    View Slide

  5. 引⽤ : https://junit.org/junit5/docs/current/user-guide

    View Slide

  6. JUnit 5.7の新機能
    1. DisplayName という MethodOrderer で、表示名に基づいてテストメソッドを英数字でソートす

    2. MethodOrderer.MethodName が MethodOrderer.Alphanumeric の代わりになった。
    3. @TestMethodOrder が存在しない場合のデフォルトの MethodOrderer を
    junit.jupiter.testmethod.order.default で設定する
    4. @CsvFileSource は、リソースパスの代わりにファイルパスを指定できる
    5. 他は https://junit.org/junit5/docs/5.7.0/release-notes/index.html#new-features-and-
    improvements-2 を参照

    View Slide

  7. DisplayName という MethodOrderer で、表
    示名に基づいてテストメソッドを英数字で
    ソートする
    @TestMethodOrder(MethodOrderer.DisplayName.class)
    public class DisplayNameTestA {
    @Test
    @DisplayName("test03")
    void testX1(){}
    @Test
    @DisplayName("test01")
    void testX2(){}
    @Test
    @DisplayName("test02")
    void testX3(){}
    }

    View Slide

  8. MethodOrderer.MethodName が
    MethodOrderer.Alphanumeric の代わりに
    なった。
    @TestMethodOrder(MethodOrderer.MethodName.class)
    public class MethodNameTestA {
    @Test
    void testB(){}
    @Test
    void testA(){}
    @Test
    void test0(){}
    @Nested
    @TestMethodOrder(MethodOrderer.Alphanumeric.class)
    public class AlphanumericTestA {
    @Test
    void testB(){}
    @Test
    void testA(){}
    @Test
    void test0(){}
    }
    }

    View Slide

  9. @TestMethodOrder が存在しない場合のデフォルトの
    MethodOrderer を
    junit.jupiter.testmethod.order.default で設定する
    test {
    useJUnitPlatform()
    systemProperty("junit.jupiter.testmethod.order.default", 'org.junit.jupiter.api.MethodOrderer$Random’)
    }

    View Slide

  10. @CsvFileSource は、リソースパスの代
    わりにファイルパスを指定できる
    @ParameterizedTest
    @CsvFileSource(files = "src/test/java/org/example/csv/test-data.csv")
    void test(String name, String number, boolean isJVM){
    System.out.println("%s : version %s, is JVMLang : %s".formatted(name, number, isJVM));
    }

    View Slide

  11. JUnit 5.8の新機能 1/2
    1. テストクラスの実行順序をグローバルで指定する
    2. ネストしたテストクラスの実行順序をローカルで指定する
    3. assertThrowsExactly() メソッドが追加されました。これは assertThrows() をより厳密
    にしたもの。
    4. assertInstanceOf() メソッドは、assertTrue(obj instanceof X)の代わりとして機能しま
    す。
    5. 実際のオブジェクトに対する toString() が null または "null" を返した場合、
    assertNull() の失敗メッセージに実際のオブジェクトの型が含まれるようになりました。

    View Slide

  12. テストクラスの実行順序をグローバルで
    指定する
    test {
    useJUnitPlatform()
    systemProperty("junit.jupiter.testclass.order.default", 'org.junit.jupiter.api.ClassOrderer$ClassName')
    // systemProperty("junit.jupiter.testclass.order.default", 'org.junit.jupiter.api.ClassOrderer$DisplayName')
    // systemProperty("junit.jupiter.testclass.order.default", 'org.junit.jupiter.api.ClassOrderer$OrderAnnotation')
    // systemProperty("junit.jupiter.testclass.order.default", 'org.junit.jupiter.api.ClassOrderer$Random')
    testLogging {
    events "passed", "skipped", "failed"
    }
    }

    View Slide

  13. ネストしたテストクラスの実行順序を
    ローカルで指定する
    @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    public class NestedTestA {
    @Nested
    @Order(3)
    class WhenLoginAOrder3 {
    @Test
    public void test(){
    Assertions.assertEquals("NestedTestA-WhenLoginA", "NestedTestA-WhenLoginA");
    }
    }
    @Nested
    @Order(1)
    class WhenLoginBOrder1 {
    @Test
    public void test(){
    Assertions.assertEquals("NestedTestA-WhenLoginB", "NestedTestA-WhenLoginB");
    }
    }
    @Nested
    @Order(2)
    class WhenLoginCOrder2 {
    @Test
    public void test(){
    Assertions.assertEquals("NestedTestA-WhenLoginC", "NestedTestA-WhenLoginC");
    }
    }
    }

    View Slide

  14. assertThrowsExactly() メソッドが追加され
    ました。これは assertThrows() をより厳密
    にしたもの。
    @Test
    public void test(){
    Assertions.assertThrows(RuntimeException.class, () -> {throw new SomeException();});
    Assertions.assertThrowsExactly(SomeException.class, () -> {throw new SomeException();});
    }
    public class SomeException extends RuntimeException { }

    View Slide

  15. assertInstanceOf() メソッドは、
    assertTrue(obj instanceof X)の代わりとし
    て機能します。
    @Test
    public void test(){
    Assertions.assertTrue(BigDecimal.valueOf(10.5) instanceof Object);
    Assertions.assertInstanceOf(Object.class, BigDecimal.valueOf(10.5));
    }

    View Slide

  16. 実際のオブジェクトに対する toString() の実装が null または "null"
    を返した場合、assertNull() の失敗メッセージに実際のオブジェクトの型
    が含まれるようになりました。
    @Test
    public void test(){
    Assertions.assertEquals("some", "null");
    Assertions.assertNull("null");
    }

    View Slide

  17. JUnit 5.8の新機能 2/2
    6. @TempDir を使って複数のテンポラリ・ディレクトリを作成できるようになりました。フィールドや
    メソッドのパラメータで @TempDir アノテーションを宣言するたびに、個別のテンポラリ・ディレク
    トリを作成するようになりました
    7. @TempDir フィールドをプライベートにすることができるようになりました。
    8. @CsvSource または @CsvFileSource で使用される数値リテラルは、700_000_000 のようなアンダー
    スコアを使用して表現することができるようになりました。
    9. @CsvSource と @CsvFileSource に ignoreLeadingAndTrailingWhitespace 属性 (デフォルトでは
    true に設定) が追加され、ホワイトスペースをトリミングするかどうかが制御できるようになりま
    した。
    10. 他は https://junit.org/junit5/docs/5.8.0/release-notes/index.html#new-features-and-
    improvements-3 を参照

    View Slide

  18. @TempDir を使って複数のテンポラリ・ディレクトリを作成できるようにな
    りました。フィールドやメソッドのパラメータで @TempDir アノテーショ
    ンを宣言するたびに、個別のテンポラリ・ディレクトリを作成するように
    なりました
    @Test
    public void test1(@TempDir Path dir1, @TempDir Path dir2) {
    Assertions.assertNotEquals(dir1.toAbsolutePath(), dir2.toAbsolutePath());
    }

    View Slide

  19. @TempDir フィールドをプライベートにすることができるようになりました。
    @TempDir
    private static Path dir3;
    @Test
    public void test2(@TempDir Path dir4){
    Assertions.assertNotEquals(dir3.toAbsolutePath(), dir4.toAbsolutePath());
    }

    View Slide

  20. @CsvSource または @CsvFileSource で使用される数値リテラルは、
    700_000_000 のようなアンダースコアを使用して表現することができるよ
    うになりました。
    @ParameterizedTest
    @CsvSource(value = {
    "apple,150000",
    "orange,200000",
    "'beef, chicken',0xF2F3F",
    "sushi,1_500_000"
    })
    void underscore(String food, int rank) {
    Assertions.assertTrue(100000 < rank , "%s is lower than 100000".formatted(food));
    }

    View Slide

  21. @CsvSource と @CsvFileSource に ignoreLeadingAndTrailingWhitespace
    属性 (デフォルトでは true に設定) が追加され、ホワイトスペースをト
    リミングするかどうかが制御できるようになりました。
    @ParameterizedTest
    @CsvSource(value = {
    "apple, 150000",
    "orange, 200000",
    "'beef, chicken', 0xF2F3F",
    "sushi, 1_500_000"
    }, ignoreLeadingAndTrailingWhitespace = true)
    void ignoreWhiteSpace(String food, int rank) {
    Assertions.assertTrue(100000 < rank , "%s is lower than 100000".formatted(food));
    }

    View Slide