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

JUnit5.7, 5.8の新機能紹介 #jjug_ccc #jjug_ccc_b / jun...

kyonmm
June 19, 2022

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

June 19, 2022
Tweet

More Decks by kyonmm

Other Decks in Technology

Transcript

  1. 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 を参照
  2. DisplayName という MethodOrderer で、表 示名に基づいてテストメソッドを英数字で ソートする @TestMethodOrder(MethodOrderer.DisplayName.class) public class DisplayNameTestA

    { @Test @DisplayName("test03") void testX1(){} @Test @DisplayName("test01") void testX2(){} @Test @DisplayName("test02") void testX3(){} }
  3. 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(){} } }
  4. JUnit 5.8の新機能 1/2 1. テストクラスの実行順序をグローバルで指定する 2. ネストしたテストクラスの実行順序をローカルで指定する 3. assertThrowsExactly() メソッドが追加されました。これは

    assertThrows() をより厳密 にしたもの。 4. assertInstanceOf() メソッドは、assertTrue(obj instanceof X)の代わりとして機能しま す。 5. 実際のオブジェクトに対する toString() が null または "null" を返した場合、 assertNull() の失敗メッセージに実際のオブジェクトの型が含まれるようになりました。
  5. テストクラスの実行順序をグローバルで 指定する 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" } }
  6. ネストしたテストクラスの実行順序を ローカルで指定する @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"); } } }
  7. 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 { }
  8. 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)); }
  9. 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 を参照
  10. @TempDir フィールドをプライベートにすることができるようになりました。 @TempDir private static Path dir3; @Test public void

    test2(@TempDir Path dir4){ Assertions.assertNotEquals(dir3.toAbsolutePath(), dir4.toAbsolutePath()); }
  11. @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)); }
  12. @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)); }