我运行了一组测试来测试我公司网站上各种工具的 UI。我构建了一个在不同环境中运行这些测试的系统,出于我的关注,我编写了允许我在这些多个环境中运行单个测试的代码。问题是,当我尝试通过 MethodSelector 运行参数化测试(将类和方法名称作为字符串传递)时,出现以下错误:
Caused by: org.junit.platform.commons.PreconditionViolationException: Could not find method with name [TestTheThing] in class [tests.tool.fragments.TestClass].
然后我尝试传递包含参数的方法名称,但随后出现此错误:
Failed to load parameter type [String param] for method [TestTheThing] in class [tests.tool.fragments.TestClass].
我已经研究这个有一段时间了,但还没有取得任何成果,希望得到一些帮助。这是测试的模型:
public class TestClass {
@ParameterizedTest
@MethodSource("getParams")
public void TestTheThing(String param) {
// test code here
}
}
这是我用来查找和运行测试的实际代码(getAllTestSelectors 中的所有选择器都是 ClassSelector 类型):
// Runs a single tests in a fragment of a tool (used for batch-testing only)
public void runSingleTestInFragment(String fragment, String test) {
if (fragment.equals(""))
throw new MasterTestException("Fragment name is empty");
if (test.equals(""))
throw new MasterTestException("Test name is empty");
// Make sure test fragment exists
String className = null;
for (DiscoverySelector s : getAllTestSelectors()) {
ClassSelector classSelector = (ClassSelector) s;
String cname = classSelector.getClassName();
String name = cname.substring(cname.lastIndexOf(".") + 1);
if (name.contains(fragment)) {
className = classSelector.getClassName();
break;
}
}
if (className == null)
throw new MasterTestException("Could not find a test fragment named '" + fragment + "' for the tool " + data.getAsEnum("tool"));
// Create the selector
MethodSelector selector = DiscoverySelectors.selectMethod(className + "#" + test);
// Test that the selector is valid (will throw a PreconditionViolationException if otherwise)
try {
selector.getJavaMethod();
} catch (PreconditionViolationException e) {
throw new MasterTestException("The test method '" + test + "' does not exist in the fragment '" + fragment + "'", e);
}
runTests(selector);
}
类型名称不是
String param
。
相反,它必须是完全限定的类型名称。对于字符串,即
java.lang.String
。
通过其完全限定方法名称选择参数化方法时,如果您的类位于
example
包中,则为example.TestClass#TestTheThing(java.lang.String)
。
这在 Javadoc 中有完整记录。
尝试从 getParams 方法返回字符串值流。 请检查下面的 getParams 虚拟方法并相应地在您的代码中进行尝试。
private static Stream<String> getParams() {
return Stream.of("value1", "value2");
}
对于上述测试方法将对输入“value1”和“value2”运行两次。您可以在流中返回任意数量的字符串(1 个或更多)。