在TestNG实际使用过程中遇到一个问题。对于以下的配置,TestNG只会执行后面两个class.
<test>
<classes>
<class name="class1">
<parameter name="input1" value="value1"/>
</class>
<class name="class2">
<parameter name="input2" value="value2"/>
</class>
<class name="class1">
<parameter name="input1" value="value3"/>
</class>
<class name="class2">
<parameter name="input2" value="value4"/>
</class>
</classes>
</test>
解决方法一
把相同的class放到不同的test中
<test name="test1">
<classes>
<class name="class1">
<parameter name="input1" value="value1"/>
</class>
<class name="class2">
<parameter name="input2" value="value2"/>
</class>
</classes>
</test>
<test name="test2">
<classes>
<class name="class1">
<parameter name="input1" value="value3"/>
</class>
<class name="class2">
<parameter name="input2" value="value4"/>
</class>
</classes>
</test>
解决方法二
使用@DataProvider注解可以传入不同的参数多次执行一个class
<test name="test1">
<classes>
<class name="class1"/>
</classes>
</test>
class1
@Test(dataProvider="my_data_provider")
public void test(String input1, String input2) {
System.out.println("Input is " + input1 + " and " + input2);
}
@DataProvider(name = "my_data_provider")
public Object[][] getData() {
//表示执行两次,第一次传入{"value1", "value2"},第二次传入{"value3", "value4"}
return new Object[][]{{"value1", "value2"}, {"value3", "value4"}};
}
如果想支持传入多个provider,那么可以
<test name="test1">
<classes>
<class name="class1">
<parameter name="provider" value="provider1"/>
</class>
</classes>
</test>
<test name="test2">
<classes>
<class name="class1">
<parameter name="provider" value="provider2"/>
</class>
</classes>
</test>
String provider;
@BeforeClass
@Parameters("provider")
public void beforeClass(String provider) {
this.provider = provider;
}
@Test(dataProvider="my_data_provider")
public void test(String input1, String input2) {
System.out.println("Input is " + input1 + " and " + input2);
}
@DataProvider(name = "my_data_provider")
public Object[][] getData() {
if(provider.equals("provider1")) {
//表示执行两次,第一次传入{"value1", "value2"},第二次传入{"value3", "value4"}
return new Object[][]{{"value1", "value2"}, {"value3", "value4"}};
}
if(provider.equals("provider2")) {
//表示执行一次,传入{"value1", "value2"}
return new Object[][]{{"value5", "value6"}};
}
}