Mục lục
Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về annotation @RepeatedTest vừa được giới thiệu trong JUnit 5 cho phép lặp đi lặp lại nhiều lần một test method.
Ví dụ @RepeatedTest đơn giản
Mình sẽ lấy một ví dụ đơn giản để các bạn có thể nắm được cách sử dụng của @RepeatedTest trước khi đi tìm hiểu sâu về nó.
@RepeatedTest(3) void repeatedTest() { System.out.println("Executing repeated test"); assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2"); }
repeatedTest() của chúng ta sẽ thực thi 3 lần tương ứng với giá trị mà chúng ta truyền vào @RepeatedTest. Chúng ta sẽ thấy kết quả tương tự như sau:
repetition 1 of 3
repetition 2 of 3
repetition 3 of 3
@RepeatedTest với @Test
Thông thường thì một test method đều được đặt dưới một @Test annotation, nhưng khi sử dụng @RepeatedTest thì chúng ta không cần đến @Test, chính vì @RepeatedTest thao tác gần giống @Test. Nó có đầy đủ vòng đời của một test method. Ví dụ như một @RepeatedTest thực thi thì @BeforeEach, @AfterEach method cũng được gọi.
Nhắc lại: @BeforeEach method sẽ được chạy trước mỗi test method bắt đầu thực thi. @AfterEach method sẽ được chạy sau mỗi test method hoàn tất.
public class RepeatedTestExample { @RepeatedTest(3) void repeatedTest() { System.out.println("Executing repeated test"); assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2"); } @BeforeEach void beforeEachTest() { System.out.println("Before Each Test"); } @AfterEach void afterEachTest() { System.out.println("After Each Test"); System.out.println("====================="); } }
Output:
Before Each Test
Executing repeated test
After Each Test
=====================
Before Each Test
Executing repeated test
After Each Test
=====================
Before Each Test
Executing repeated test
After Each Test
=====================
Đặt tên cho test method
Chúng ta có thể đặt tên cho các test method trong @RepeatedTest với thuộc tính name.
RepeatedTest(value = 3, name = RepeatedTest.LONG_DISPLAY_NAME) void repeatedTestWithLongName() { System.out.println("Executing repeated test with long name"); assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2"); }
Output:
repeatedTest() :: repetition 1 of 3
repeatedTest() :: repetition 2 of 3
repeatedTest() :: repetition 3 of 3
Sử dụng hằng số LONG_DISPLAY_NAME để lấy tên method hiện thị trong báo cáo kết quả chạy các unt test. Chúng ta cũng có thể tạo tên riêng cho mình bằng cách gán cho thuộc tính name một String cụ thể.
@RepeatedTest(value = 3, name = "custom name") void customNameTest() { System.out.println("Executing repeated test"); assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2"); }
Output:
custom name
custom name
custom name
Kiểm tra lần lặp hiện tại
@RepeatedTest cho phép chúng ta lặp lại unit test n lần. Để kiểm tra lần thực thi hiện tại của test method, chúng ta sẽ tìm hiểu về RepetitionInfo chứa các siêu dữ liệu của unit test.
@RepeatedTest(3) void repeatedTestWithRepetitionInfo(RepetitionInfo repetitionInfo) { System.out.println("Repetition #" + repetitionInfo.getCurrentRepetition()); assertEquals(3, repetitionInfo.getTotalRepetitions()); }
Output:
Repetition #1
Repetition #2
Repetition #3
Tóm lược
Như vậy chúng ta đã tìm hiểu xong về @RepeatedTest annotation được giới thiệu trong JUnit 5. Nó sẽ rất hữu ích khi chúng ta muốn kiểm tra một test case nào đó có thể thay đổi theo số lần thực thi do một số sai xót nào đó mà rất khó để tái hiện lại bug, @RepeatedTest sẽ cho phép chúng ta thực hiện test case nhiều lần 1 cách tự động để giúp tìm ra bug nhanh nhất có thể.
Nếu gặp khó khăn trong lúc cấu hình và chạy thử nghiệm có thể tham khảo project tại github để tham khảo