Tags:

Dynamic Test JUnit 5 – @TestFactory, DynamicTest

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

https://www.baeldung.com/junit5-dynamic-tests

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x