TestNG测试分组
配置@Test
可以通过@Test给多个测试类的测试用例分组,比如某个测试用例既属于smoke又属于uat,那么就可以配置如下:
@Test(groups = {"smoke", "uat"})
public void testDemo1() throws InterruptedException{
System.out.print("testDemo1\n");
}
@Test(groups = {"smoke", "func"})
public void testDemo2() throws InterruptedException{
System.out.print("testDemo2\n");
}
通过testng.xml进行测试用例的运行,运行结果如下:
- 运行
smoke
类型的测试用例
testDemo1
testDemo2
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
从上面的结果可以看出,实际这里testDemo1和testDemo2都运行了。
- 修改testng.xml,运行uat类型的测试用例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite1" verbose="1" >
<test name="Regression1">
<groups>
<run>
<include name="uat" /> <!-- 修改这里-->
</run>
</groups>
<!--<classes>-->
<!--<class name="com.wilmar.loms.testcase.ManualOrderTest"/>-->
<!--</classes>-->
<classes>
<class name="com.nitb.demo.Demo1"/>
</classes>
</test>
</suite>
运行结果:
testDemo1
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
从上面的结果可以看出,本次只运行了配置成uat的testDemo。
- 执行多个类型的测试用例,包括uat和func
<groups>
<run>
<include name="uat" />
<include name="func" />
</run>
</groups>
把上诉testng.xml中的内容修改成如下,然后执行,运行结果:
testDemo1
testDemo2
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
从输出结果看,运行了分别属于uat组的testDemo1和属于func组的testDemo2。
TestNG捕获异常
如果测试用例期望的结果是抛出异常,可以通过@Test把异常指派给某个方法,此时测试用例对应抛出异常,结果为PASS;否则,判定为FAIL。
@Test(expectedExceptions = { ArithmeticException.class })
TestNG设置参数
在testng.xml中设置参数有两种方式:
- 一种是通过@Parameters设置,但是它只能传字符串数据。
- 一种是通过@DataProvider设置,它可以传复杂类型的数据。
@Parameter设置
添加测试用例:
@Parameters({"username"})
@Test(groups = {"smoke", "func"})
public void testDemo3(String username) throws InterruptedException{
System.out.print("testDemo3, " + "username=" + username);
}
配置testng.xml,增加参数:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite1" verbose="1" >
<test name="Regression1">
<parameter name="username" value="testname" /> <!-- 添加参数 -->
<groups>
<run>
<include name="uat" />
<include name="func" />
</run>
</groups>
<!--<classes>-->
<!--<class name="com.wilmar.loms.testcase.ManualOrderTest"/>-->
<!--</classes>-->
<classes>
<class name="com.nitb.demo.Demo1"/>
</classes>
</test>
</suite>
运行结果:
testDemo1
testDemo2
testDemo3, username=testname
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
Process finished with exit code 0
从输出结果看出,这里多了username=testname的输出,正好是我们期望的。
设置@DataProvider
添加测试代码:
@DataProvider(name = "dataProvider")
public Object[][] dataProvider() {
return new Object[][] {{"data1"}, {"data2"}, {"data3"}};
}
@Test(groups = {"func"}, dataProvider = "dataProvider")
public void testDemo4(String data) {
System.out.print("testDemo4, " + "data=" + "\n");
}
这里需要注意,如果@DataProvider中不设置name,那么默认会使用注释的方法名。因为这里设置的name和方法名都叫dataProvider,所以其实设置不设置name都无所谓。
执行结果:
testDemo1
testDemo2
testDemo3, username=testname
testDemo4, data=data1
testDemo4, data=data2
testDemo4, data=data3
===============================================
Suite1
Total tests run: 6, Failures: 0, Skips: 0
===============================================
从上面可以看到,这里的testDemo被执行了三次,所以当同一个测试用例需要执行多组数据的时候,使用@DataProvider配置参数就会很简便。