Как выполнить код после каждого динамического теста? - PullRequest
0 голосов
/ 27 февраля 2019

Есть тест:

package com.cdek.qa_auto.config;
import com.cdek.qa_auto.utils.CdekJUnitListener;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.TestExecutionListener;
import org.junit.platform.launcher.core.LauncherFactory;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;


/***
 *
 */
@SpringBootTest
public class JUnit5Test {
    public JUnit5Test() throws Exception {}

    @BeforeEach
    public void beforeEach() throws Exception {
        Launcher launcher = LauncherFactory.create();
        TestExecutionListener listener = new CdekJUnitListener();
        launcher.registerTestExecutionListeners(listener);
    }

    @TestFactory
    public Stream<DynamicTest> test() throws Exception {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("12");
        list.add("123");
        list.add("1234");
        list.add("12345");

        return list.stream().map(item -> (
                dynamicTest("test_" + item, () -> {
                    if ("1".equalsIgnoreCase(item)) {
                        System.out.println("fail");
                        fail("fail");
                    } else if ("12".equalsIgnoreCase(item)) {
                        assertTrue(false);
                    } else if ("123".equalsIgnoreCase(item)) {
                        throw new Exception("msg");
                    } else {
                        assertTrue(true);
                    }
                        }
                )));
    }
}

Например, сделать экран для падших тестов.Письменная реализация import org.junit.platform.launcher.TestExecutionListener.

Connect, поэтому обычно не работает.Не уходит в исполнение Закончено.

Основа: JUnit5-Maven-SpringBoot

Как выполнить определенный код после каждого динамического теста?

1 Ответ

0 голосов
/ 27 февраля 2019

Как указано в Руководстве пользователя JUnit 5 :

Жизненный цикл выполнения динамического теста сильно отличается от стандартного случая @Test.В частности, нет никаких обратных вызовов жизненного цикла для отдельных динамических тестов.Это означает, что методы @BeforeEach и @AfterEach и соответствующие им обратные вызовы расширений выполняются для метода @TestFactory, но не для каждого динамического теста.Другими словами, если вы обращаетесь к полям из экземпляра теста в лямбда-выражении для динамического теста, эти поля не будут сброшены методами обратного вызова или расширениями между выполнением отдельных динамических тестов, созданных одним и тем же методом @TestFactory.

Таким образом, вы не можете использовать метод @AfterEach или одно из расширений обратного вызова жизненного цикла (т. Е. AfterEachCallback или AfterTestExecutionCallback).

В зависимости от того, что вы пытаетесьчтобы достичь в своем «слушателе», вы можете достичь этого в TestExecutionListener, но вы не можете зарегистрировать это из тестового класса.Подробнее см. Подключение собственного прослушивателя выполнения теста в Руководстве пользователя.

...