我有一堆 junit 5 测试,其中一些是参数化的,我想从 java 类调用它们。
当保存在 src/test 文件夹中时,测试通过 IDE 或使用 gradle clean build 成功运行,但这不是我的目标。
我希望能够从一个单独的 java 类调用此测试(例如,每当我需要触发这些测试时,我可以公开和调用其端点的控制器)
我的参数化测试:
@ParameterizedTest(name = "{0}")
@MethodSource("getAllTestData")
void myParameterizedTestMethod(
String testCaseName, List<String> inputParams, List<String> expectedResults){
// Some Assertions here
Assertions.assertTrue(true);
}
//method source
public Stream<Arguments> getAllTestData() {
return aStreamOfParamsToBeUsedInTests;
}
我尝试了 junit-platform-launcher 如下:
LauncherDiscoveryRequest request =
LauncherDiscoveryRequestBuilder.request().selectors(selectClass(DummyTest.class)).build();
Launcher launcher = LauncherFactory.create();
launcher.execute(request);
这成功执行了用@Test(这里是DummyTest.class)注释的测试方法,但不是@ParameterizedTest
还尝试了 junit-platform-testkit 如下:
EngineTestKit.engine("junit-jupiter")
.selectors(selectClass(DummyTest.class))
.execute()
.testEvents()
.assertStatistics(o -> o.failed(0));
但结果相同。 不确定我正在做的事情是否不正确或者调用参数化测试的方式不同。
如有任何帮助,我们将不胜感激。谢谢。
编辑:
我没有遇到任何错误。只是任何 @ParameterizedTest 都不会被调用。只有 @Test 方法正在运行。
如果有帮助的话,请包含更多代码:
一个简单的单元测试:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class DummyTest {
@Test
void dummyTest() {
System.out.println("Success1");
Assertions.assertTrue(true);
}
}
参数化测试:
import com.fasterxml.jackson.core.JsonProcessingException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
public class MyParameterizedTest{
@ParameterizedTest(name = "{0}")
@MethodSource("getAllTestData")
void testProductRequestValidator(
String testCaseName, String inputParams) {
Assertions.assertTrue(true);
System.out.println("<<<<<<>>>>>>>>>>Success");
Assertions.assertTrue(true);
}
public Stream<String> getAllTestData() {
return Stream.of("1","2","2");
}
}
我想从中调用测试的服务类:
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.junit.platform.testkit.engine.EngineTestKit;
import org.springframework.stereotype.Service;
@Service
public class MyTestService{ // TODO Rename
public void runTests() {
LauncherDiscoveryRequest request =
LauncherDiscoveryRequestBuilder.request().selectors(selectClass(DummyTest.class)).build();
Launcher launcher = LauncherFactory.create();
launcher.execute(request);
}
}
重要提示:这有效。测试被执行。
但是当我尝试在 MyParameterizedTest 类中调用测试时,它根本无法被识别并且没有调用..没有错误。
与上面相同的代码,只是更改了类名:
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.junit.platform.testkit.engine.EngineTestKit;
import org.springframework.stereotype.Service;
@Service
public class MyTestService{ // TODO Rename
public void runTests() {
LauncherDiscoveryRequest request =
LauncherDiscoveryRequestBuilder.request().selectors(selectClass(MyParameterizedTest.class)).build();
Launcher launcher = LauncherFactory.create();
launcher.execute(request);
}
}
以上方法不起作用。测试未被调用。
Java:openjdk版本“1.8.0_362” 等级:等级8.5
您提供的
ParameterizedTest
不是有效的测试,因此 Launcher
会默默地找不到它。你说这些测试在IDE中通过了,所以可能是过程中出现了错误,但是修复后这个测试被识别并成功完成:
public class MyParameterizedTest {
@ParameterizedTest(name = "{0}")
@MethodSource("getAllTestData")
void testProductRequestValidator(String inputParam) {
System.out.println("<<<<<<>>>>>>>>>>Success: " + inputParam);
Assertions.assertTrue(true);
}
public static Stream<String> getAllTestData() {
return Stream.of("1", "2", "3");
}
}
我所做的更改是将
static
添加到源方法并将测试方法参数减少为单个字符串。