TestNG:来自 DataProvider 的特定数据用于特定测试方法
TestNG: Specific data from DataProvider for specific test methods
是否可以为每个测试方法指定来自 DataProvider 的数据。我做过这样的东西。
@DataProvider(name = "loginData")
public Object[][] getData(Method m) {
if (m.getName().equalsIgnoreCase("testValidLogin")) {
return new Object[][]{
{"aaa", "qwe123!"}
};
}
if (m.getName().equalsIgnoreCase("testSendMail")){
return new Object[][]{
{"Test@test", "Test", "Hi there!"}
};
} else {
return new Object[][]{
{"12312312","123qwe"},
};
}
}`
有更好的方法吗?我可以为两种测试方法指定一个数据集吗?
谢谢!
如果您的测试数据与测试方法相关,最好将其保存在测试方法中或创建单独的数据提供程序。
其他选项是使用测试上下文并通过它从方法之前将所需参数传递给测试方法。
或者您可以构建类似的东西:
public class DataProviderPerMethod {
@DataProvider(name = "provider")
public Object[][] provider(Method method) {
List<TestData> options = Arrays.asList(method.getAnnotation(TestDataOptions.class).value());
int optionsSize = options.size();
int optionLength = Objects.requireNonNull(options.get(0)).value().length;
Object[][] result = new Object[optionsSize][optionLength];
IntStream.range(0, optionsSize).forEach(i -> result[i] = options.get(i).value());
return result;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Repeatable(TestDataOptions.class)
public @interface TestData {
String[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestDataOptions {
TestData[] value();
}
@TestDataOptions({
@TestData({"1", "string"}),
@TestData({"2", "else one string"})
})
@Test(dataProvider = "provider")
public void verifyTestData(String first, String second) {
System.out.println(first);
System.out.println(second);
}
}
是否可以为每个测试方法指定来自 DataProvider 的数据。我做过这样的东西。
@DataProvider(name = "loginData")
public Object[][] getData(Method m) {
if (m.getName().equalsIgnoreCase("testValidLogin")) {
return new Object[][]{
{"aaa", "qwe123!"}
};
}
if (m.getName().equalsIgnoreCase("testSendMail")){
return new Object[][]{
{"Test@test", "Test", "Hi there!"}
};
} else {
return new Object[][]{
{"12312312","123qwe"},
};
}
}`
有更好的方法吗?我可以为两种测试方法指定一个数据集吗? 谢谢!
如果您的测试数据与测试方法相关,最好将其保存在测试方法中或创建单独的数据提供程序。
其他选项是使用测试上下文并通过它从方法之前将所需参数传递给测试方法。
或者您可以构建类似的东西:
public class DataProviderPerMethod {
@DataProvider(name = "provider")
public Object[][] provider(Method method) {
List<TestData> options = Arrays.asList(method.getAnnotation(TestDataOptions.class).value());
int optionsSize = options.size();
int optionLength = Objects.requireNonNull(options.get(0)).value().length;
Object[][] result = new Object[optionsSize][optionLength];
IntStream.range(0, optionsSize).forEach(i -> result[i] = options.get(i).value());
return result;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Repeatable(TestDataOptions.class)
public @interface TestData {
String[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestDataOptions {
TestData[] value();
}
@TestDataOptions({
@TestData({"1", "string"}),
@TestData({"2", "else one string"})
})
@Test(dataProvider = "provider")
public void verifyTestData(String first, String second) {
System.out.println(first);
System.out.println(second);
}
}