TestNG介绍
TestNG 是一个测试 Java 应用程序的单元测试框架.。
为什么选择TestNG?
TestNG涵盖了Junit的核心功能,且在参数化测试,依赖测试和套件测试(分组概念)方面更加突出。
快速体验
安装TestNG,使用 maven 直接引入,在 pom.xml 添加依赖。
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.10</version>
<scope>compile</scope>
</dependency>
使用 IDEA 新建一个项目
直接运行
@Test(description = "接口测试")
public void test1() {
System.out.println("test1 Begin!");
int a = 1;
Assert.assertEquals(a, 2);
}
XML运行
在 resource 目录下新建 testng.xml 文件,右键 xml 运行。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Dong's测试套件">
<test name="Dong's测试模块">
<classes>
<!-- 添加不同测试类文件 -->
<class name="testcase.TestDemo"/>
</classes>
</test>
</suite>
TestNG的注解
注解运行优先级
@BeforeSuite > @BeforeTest > @BeforeMethod > @Test > @AfterMethod > @AfterTest > @AfterSuite
超时测试
在 @Test 注解中添加 timeOut 参数。 表示测试方法的运行时间应该低于 10ms,如果超时者测试失败。
@Test(timeOut = 3000)
public void testTimeOut() {
try{
Thread.sleep(3100);
}catch (InterruptedException e){
System.out.println(e.toString());
}
}
测试依赖
有时候需要测试方法按照一个特定的顺序被调用,这个时候需要使用 @Test 注解的 dependsOnMethods 参数来指定依赖方法和方法的执行顺序
// test1 执行之前会先执行 test2, test3
@Test(dependsOnMethods = {"test2","test3"})
public void test1(){
}
@Test
public void test2(){
}
@Test
public void test3(){
}
忽略测试
在注解中加入 enabled = false,则该用例不会被执行。
@Test(enabled = false)
public void test1(){
}
执行顺序
使用priority来控制test方法的执行顺序,数值越小,优先级越高。
public class test_demo1 {
@Test(priority = 2)
public void test1() {
System.out.println("jacoco test1");
}
@Test(priority = 1)
public void test2() {
System.out.println("jacoco test2");
}
}
分组测试
在@test注解中通过groups属性定义测试所属的分组(同一个测试用例可以属于多个分组)。分组测试是TestNG中的一个新的创新功能,它在 ‘JUnit’ 框架中是不存在的。
作用一:处理不同组用例间的依赖关系
如果分组 test1 和 test2 通过,则runFinal()将被执行。
@Test(groups = "test1")
public void test1() {
System.out.println("test1()");
}
@Test(groups = "test2")
public void test2() {
System.out.println("test2()");
}
@Test(dependsOnGroups = { "test1", "test2" })
public void runFinal() {
System.out.println("runFinal");
}
作用二:给类分类
在类上标记@Test(groups = {“test”}。
@Test(groups = "test")
public class TestIngore {
public void test(){
System.out.println("test");
}
public void test1(){
System.out.println("test1");
}
}
作用三:通过配置文件 testng.xml 执行指定的用例
public class Car1 {
@Test(groups={"driver"})//定义该方法属于driver组
public void driverWork(){
System.out.println("car1's driver is driving");
}
@Test(groups={"boss"})//定义该方法属于boss组
public void bossWork(){
System.out.println("car1's boss is talking");
}
}
public class Car2 {
@Test(groups={"driver"})//定义该方法属于driver组
public void driverWork(){
System.out.println("car2's driver is driving");
}
@Test(groups={"boss"})//定义该方法属于boss组
public void bossWork(){
System.out.println("car2's boss is talking");
}
}
配置文件 testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<groups>
<run>
<include name="driver"/><!--筛选driver组的方法来执行-->
</run>
</groups>
<test name="Test">
<classes>
<class name="ngtest.Car1"/>
<class name="ngtest.Car2"/>
</classes>
</test>
</suite>
右键点击testng.xml,选择run as testNG suite,console输出:
[TestNG] Running:
D:\workspace\tester\testng.xml
car1's driver is driving
car2's driver is driving
===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
可以看出,通过 testng.xml 文件中的 ,只执行了 driver 分组。
备注:在testng.xml中标签下还可以使用 exclude 标签,表示不执行属于 abc 组的用例。
<exclude name=“abc”/>
参数化测试
通过@DataProvider将参数传递给@Test方法。
public class TestParameterDataProvider {
@Test(dataProvider = "provideNumbers")
public void test(int number, int expected) {
Assert.assertEquals(number + 10, expected);
}
@DataProvider(name = "provideNumbers")
public Object[][] provideData() {
return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };
}
}
异常测试
异常测试用于测试方法是否有抛出异常,通过 @Test(expected=NullPointerException.class) 来指定方法必须抛出 NullPointerException,如果没有抛出异常或者抛出其他异常则测试失败。
@Test(expectedExceptions = NullPointerException.class)
public void testSub() {
throw new NullPointerException();
}