Ben*_*Lee 20 testng data-driven-tests
我们希望针对一组数据运行我们的一些测试,验证每个测试的条件是否相同.数据当前存储在平面文件或简单的Excel电子表格中.
我的第一个想法是创建一个TestNG DataProvider,它将从文件加载数据,并用于为每个数据值调用一次测试方法.我的问题是不同的测试需要从不同的文件加载数据,似乎没有任何方法可以将参数发送到DataProvider. 有谁知道这是否可能?
理想情况下,我希望我的代码看起来像以下(简化示例):
public class OddTest {
@DataProvider(name = "excelLoader")
public Iterator<Object[]> loadExcelData(String fileName) {
...
}
@Test(dataProvider = "excelLoader" dataProviderParameters = { "data.xls" })
public void checkIsOddWorks(int num)
assertTrue(isOdd(num));
}
}
Run Code Online (Sandbox Code Playgroud)
des*_*lat 17
您可以使用TestNG的依赖注入功能访问DataProvider中的所有已定义参数.这是一些需要"test_param"参数的DataProvider示例:
@DataProvider(name = "usesParameter")
public Object[][] provideTestParam(ITestContext context) {
String testParam = context.getCurrentXmlTest().getParameter("test_param");
return new Object[][] {{ testParam }};
}
Run Code Online (Sandbox Code Playgroud)
这需要在您中定义"test_param" suite.xml:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suite">
<parameter name="test_param" value="foo" />
<test name="tests">
<classes>
...
</classes>
</test>
</suite>
Run Code Online (Sandbox Code Playgroud)
有关ITestContext类的详细信息,请参阅TestNG JavaDoc.
小智 16
取自TestNG文档:
如果将@DataProvider声明java.lang.reflect.Method为第一个参数,TestNG将传递第一个参数的当前测试方法.当多个测试方法使用相同的@DataProvider并且您希望它根据为其提供数据的测试方法返回不同的值时,这尤其有用.
例如,以下代码在其@DataProvider中打印测试方法的名称:
@DataProvider(name = "dp")
public Object[][] createData(Method m) {
System.out.println(m.getName()); // print test method name
return new Object[][] { new Object[] { "Cedric" }};
}
@Test(dataProvider = "dp")
public void test1(String s) {
}
@Test(dataProvider = "dp")
public void test2(String s) {
}
Run Code Online (Sandbox Code Playgroud)
因此将显示:
test1
test2
Run Code Online (Sandbox Code Playgroud)
这也可以与desolat提供的解决方案相结合,以相应地确定来自上下文和方法的数据:
@DataProvider(name = "dp")
public Object[][] foodp(ITestContext ctx, Method method) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
执行此操作的更通用方法是使用groups注释来构建自定义值列表:
@DataProvider(name = "excelLoader")
public Object[][] createData(Method m) {
ArrayList<Object[]> excelFiles = new ArrayList<Object[]>;
// iterate over all the groups listed in the annotation
for (String excelFile : ((Test) m.getAnnotation(Test.class)).groups()) {
// add each to the list
excelFiles.add(new Object[] { excelFile });
}
// convert the list to an array
return excelFiles.toArray(new Object[excelFiles.size()]);
}
@Test(dataProvider = "excelLoader", groups = { "data1", "data2" })
public void test1(String excelFile) {
// we will test "data1.xls" and "data2.xls" in this test
String testExcelFile = excelFile + ".xls";
}
@Test(dataProvider = "excelLoader", groups = { "data2", "data3" })
public void test2(String excelFile) {
// we will test "data2.xls" and "data3.xls" in this test
String testExcelFile = excelFile + ".xls";
}
Run Code Online (Sandbox Code Playgroud)
或者,您也可以创建自己的注释类来接收自定义元素,以便您可以执行以下操作:
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD, TYPE, CONSTRUCTOR})
public @interface FilesToTest {
public String[] value() default {};
}
@DataProvider(name = "excelLoader")
public Object[][] createData(Method m) {
ArrayList<Object[]> excelFiles = new ArrayList<Object[]>;
// iterate over all the groups listed in the annotation
for (String excelFile : ((FilesToTest) m.getAnnotation(FilesToTest.class)).value()) {
// add each to the list
excelFiles.add(new Object[] { excelFile });
}
// convert the list to an array
return excelFiles.toArray(new Object[excelFiles.size()]);
}
@Test(dataProvider = "excelLoader")
@FilesToTest({ "data1.xls", "data2.xls" })
public void myTest(String excelFile) {
// we will test "data1.xls" and "data2.xls" in this test
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47262 次 |
| 最近记录: |