TestNG 是一个测试 Java 应用程序的单元测试框架.。
TestNG涵盖了Junit的核心功能,且在参数化测试,依赖测试和套件测试(分组概念)方面更加突出。
安装TestNG,使用 maven 直接引入,在 pom.xml 添加依赖。
<dependency>
<groupId>org.testnggroupId>
<artifactId>testngartifactId>
<version>6.10version>
<scope>compilescope>
dependency>
使用 IDEA 新建一个项目
@Test(description = "接口测试")
public void test1() {
System.out.println("test1 Begin!");
int a = 1;
Assert.assertEquals(a, 2);
}
在 resource 目录下新建 testng.xml 文件,右键 xml 运行。
注解运行优先级
@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");
}
}
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
DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<groups>
<run>
<include name="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 组的用例。
通过@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();
}