Dynamic test được giới thiệu trong JUnit 5 mà chúng ta sẽ tìm hiểu trong bài viết này.
DynamicTest là gì?
Các unit test tạo ra với @Test annotation là các unit test tĩnh được xác định tại thời điểm biên dịch. Trái ngược, một DynamicTest là một unit test được tạo ra tại thời điểm runtime có thể tạo ra bởi factory method bằng @TestFactory annotation.
@TestFactory method phải trả về một Stream, Collection, Iterable hoặc Iterator của DynamicTest instance. Một điểm lưu ý là @DynamicTest không hỗ trợ LifeCycle callbacks. Có nghĩa là @BeforeEach và @AfterEach method sẽ không được gọi trong DynamicTest.
Khởi tạo DynamicTest
@TestFactory Collection<DynamicTest> dynamicTestsWithCollection() { return Arrays.asList( DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))); }
dynamicTestsWithCollection() method được gọi là Factory method, trả về một collection DynamicTest. Mỗi DynamicTest gồm 2 phần chính là tên và Executable.
Output:
Add test(dynamicTestsWithCollection())
Multiply Test(dynamicTestsWithCollection())
Chúng ta có thể tạo ra DynamicTest tương tự như trên với Iterable, Iterator, Stream.
@TestFactory Iterable<DynamicTest> dynamicTestsWithIterable() { return Arrays.asList( DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))); } @TestFactory Iterator<DynamicTest> dynamicTestsWithIterator() { return Arrays.asList( DynamicTest.dynamicTest("Add test", () -> assertEquals(2, Math.addExact(1, 1))), DynamicTest.dynamicTest("Multiply Test", () -> assertEquals(4, Math.multiplyExact(2, 2)))) .iterator(); } @TestFactory Stream<DynamicTest> dynamicTestsFromIntStream() { return IntStream.iterate(0, n -> n + 2).limit(10) .mapToObj(n -> DynamicTest.dynamicTest("test" + n, () -> assertTrue(n % 2 == 0))); }
Tóm lược
JUnit 5 Dynamic test cũng có thể tạo ra từ @ParameterizedTest, với @ParameterizedTest vẫn sẽ hỗ trợ lifecycle unit test. Trong khi DynamicTest thì không.
Nguồn tham khảo