Как выполнить код после каждого динамического теста?
Есть тест:
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);
}
}
)));
}
}
Например, сделать скрин для падших тестов. Письменная реализация импорта org.junit.platform.launcher.TestExecutionListener.
Коннект так нормально не работал. Не уходит в исполнение Закончено.
Основа: JUnit5-Maven-SpringBoot
Как выполнить определенный код после каждого динамического теста?
1 ответ
Как указано в Руководстве пользователя JUnit 5:
Жизненный цикл выполнения динамического теста сильно отличается от стандартного случая @Test. В частности, нет никаких обратных вызовов жизненного цикла для отдельных динамических тестов. Это означает, что методы @BeforeEach и @AfterEach и соответствующие им обратные вызовы расширений выполняются для метода @TestFactory, но не для каждого динамического теста. Другими словами, если вы обращаетесь к полям из экземпляра теста в лямбда-выражении для динамического теста, эти поля не будут сброшены методами обратного вызова или расширениями между выполнением отдельных динамических тестов, созданных одним и тем же методом @TestFactory.
Таким образом, вы не можете использовать @AfterEach
метод или одно из "после" расширений обратного вызова жизненного цикла (т.е. AfterEachCallback
или же AfterTestExecutionCallback
).
В зависимости от того, чего вы пытаетесь достичь в "слушателе", вы можете достичь этого в TestExecutionListener
, но вы не можете зарегистрировать это из тестового класса. Подробности см. В разделе " Подключение собственного слушателя выполнения теста" в Руководстве пользователя.