如何避免“ @RepeatedTest注释在JUnit中运行BeforeEach和AfterEach”?

时间:2019-10-18 15:53:50

标签: java testing junit annotations automated-tests

JUnit 5存在以下问题。 我想进行15次测试,所以我使用了注释@RepeatedTest(15),它可以正常工作。但是问题是,在每次运行中它都调用@BeforeEach方法和@AfterEach方法。
它对所有15个循环都执行此操作,但是只应在第一次运行之前调用@BeforeEach,并在最后一次运行之后调用@AfterEach。我认为我不能使用@BeforeAll@AfterAll,因为我有多个测试,因此只能在例如测试1和测试50之前调用它。

目前如何运行:

@BeforeAll Method
Test 1:
    - @BeforeEach Method
    - Run1
    - @AfterEach Method
    - @BeforeEach Method
    - Run2
    - @AfterEach Method
Test 2:
    - @BeforeEach Method
    - Run1
    - @AfterEach Method
    - @BeforeEach Method
    - Run2
    - @AfterEach Method
@AfterAll Method


应如何运行:

@BeforeAll Method
Test 1:
    - @BeforeEach Method
    - Run1
    - Run2
    - @AfterEach Method
Test 2:
    - @BeforeEach Method
    - Run1
    - Run2
    - @AfterEach Method
@AfterAll Method

2 个答案:

答案 0 :(得分:0)

好,我找到了解决方案! 我不知道为什么,但是对于每个测试类@BeforeAll@AfterAll都会被调用。 因此,我删除了@BeforeEach@AfterEach方法,并将其代码移至@BeforeAll@AfterAll

现在它们像这样运行:

@BeforeAll Method
Test 1:
    - Run1
    - Run2
@AfterAll Method
@BeforeAll Method
Test 2:
    - Run1
    - Run2
@AfterAll Method

然后我得到一个.jtl文件的预期输出,每个测试用例的数据为15次Runs。

答案 1 :(得分:0)

我在这里看到四个选项:

  1. 为每个场景创建一个新的测试类,每个场景都使用一种@RepeatedTest方法,并使用@BeforeAll@AfterAll进行测量。

  2. 不要使用@RepeatedTest,而是在正常的@Test内进行重复和测量。

  3. 让JUnit注入RepetitionInfo来确定执行情况:

    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.RepeatedTest;
    import org.junit.jupiter.api.RepetitionInfo;
    import org.junit.jupiter.api.TestInfo;
    
    class RepeatTest {
    
        @BeforeEach
        void setUp(RepetitionInfo repetitionInfo, TestInfo testInfo) {
            if (repetitionInfo.getCurrentRepetition() == 1) {
                System.out.println("Before repetition of " + testInfo.getDisplayName());
            }
        }
    
        @RepeatedTest(value = 3, name = "{displayName}_{currentRepetition}of{totalRepetitions}") @DisplayName("test1")
        void test1(TestInfo testInfo) {
            System.out.println(testInfo.getDisplayName());
        }
    
        @RepeatedTest(value = 5, name = "{displayName}_{currentRepetition}of{totalRepetitions}") @DisplayName("test2")
        void test2(TestInfo testInfo) {
            System.out.println(testInfo.getDisplayName());
        }
    
        @AfterEach
        void tearDown(RepetitionInfo repetitionInfo, TestInfo testInfo) {
            if (repetitionInfo.getCurrentRepetition() == repetitionInfo.getTotalRepetitions()) {
                System.out.println("After repetition of " + testInfo.getDisplayName());
            }
        }
    }
    

    输出:

    Before repetition of test1_1of3
    test1_1of3
    test1_2of3
    test1_3of3
    After repetition of test1_3of3
    Before repetition of test2_1of5
    test2_1of5
    test2_2of5
    test2_3of5
    test2_4of5
    test2_5of5
    After repetition of test2_5of5
    
  4. 如果您有很多类似的测试,请考虑实现一个小的JUnit扩展。也许会引入一些新的方法注释。