Java笔记-单元测试框架TestNG

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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值