Как избежать того, что '@RepeatedTest Annotation запускает BeforeEach и AfterEach в JUnit'? - PullRequest
1 голос
/ 18 октября 2019

У меня следующая проблема с JUnit 5. Я хочу запустить тест 15 раз, поэтому я использовал Аннотация @RepeatedTest(15), и он работал. Но проблема в том, что при каждом запуске он вызывает @BeforeEach Method и @AfterEach Method.
Он делает это для всех 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 голосов
/ 19 октября 2019

Здесь я вижу четыре варианта:

  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, если у вас много подобных тестов. Возможно введение некоторых новых аннотаций метода.

0 голосов
/ 19 октября 2019

Хорошо, я нашел решение! Я не знаю почему, но для каждого Тестового класса вызывается @BeforeAll и @AfterAll. Поэтому я удалил методы @BeforeEach и @AfterEach и переместил их код в @BeforeAll и @AfterAll.

Теперь они работают так:

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

И я получаюожидаемый вывод одного файла .jtl с данными 15 запусков в каждом тестовом примере.

...