Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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 を参照

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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(){} } }

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

@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)); }

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

テストクラスの実行順序をグローバルで 指定する 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" } }

Slide 13

Slide 13 text

ネストしたテストクラスの実行順序を ローカルで指定する @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"); } } }

Slide 14

Slide 14 text

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 { }

Slide 15

Slide 15 text

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)); }

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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 を参照

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

@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)); }

Slide 21

Slide 21 text

@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)); }