TestNG学会了,Java单元测试你就掌握了一半

TestNG

01

简介

在日常测试工作中,经常需要用写代码和脚本来完成一些测试任务,比如自动化测试,接口测试,单元测试等。当写完若干脚本后,需要对这些脚本进行组织、管理和结果统计,这个时候就需要有一个工具来负责这些事情,于是TestNG就出现了。

TestNG是Java体系中的一个测试框架,可以用于做单元测试、集成测试等。在TestNG之前,有一个类似的框架早就出现了,那就是Junit。TestNG借鉴了Junit的一些特点,然后增加了很多更强大的功能。成为Java体系里使用最广泛的测试框架。

需要注意的是,很多人理解TestNG是一个接口测试框架,其实并不是的,TestNG本身不能做接口测试,它主要用来管理你的接口测试。类似于Python里的pytest框架。今天我们就来详细介绍下TestNG的使用。

02

环境安装

创建一个Maven工程,引入TestNG的依赖包

org.testngtestng6.8

一个简单的小例子

写一个简单的计算器类

//一个简单的加减乘除计算器publicclassCalculator{// 加法publicintadd(inta,intb){returna + b;    }// 减法publicintsubtract(inta,intb){returna - b;    }// 乘法publicintmultiply(inta,intb){returna * b;    }// 除法publicintdivide(inta,intb){returna / b;    }}

接下来对这个计算器进行单元测试,创建一个测试类,并对加法运算编写了一个测试方法

// 计算器测试类publicclassCalculatorTest{// 加法测试@TestpublicvoidtestAdd(){        System.out.println("开始执行testAdd");        Calculator calculator =newCalculator();intresult = calculator.add(1,1);        Assert.assertEquals(2, result);    }// 减法测试@TestpublicvoidtestSubtract(){        System.out.println("开始执行testSubtract");        Calculator calculator =newCalculator();intresult = calculator.subtract(2,1);        Assert.assertEquals(1, result);    }}

注意:

在上面代码中,testAdd方法上添加了一个@Test注解,这个是TestNG提供的一个注解(可以理解成一个标记),改注解标明此方法需要TestNG来执行,@Test注解也是最常使用的注解。

Assert是TestNG中的断言类,assertEquals是最常用的一个方法,用于判断期望值和实际值是否一致。如果一致,测试通过;如果不一致,测试不通过。

03

TestNG的执行

IntelliJ IDEA中内置了TestNG的支持,因此直接在方法名上右键,选择"run testAdd"即可,并且会在控制台上打印用例的执行结果。

控制台打印,如果都显示为绿色,就代表执行成功了

也可以在类上右键运行,TestNG中会运行整个类中所有带@Test注解的测试方法

套件测试

01

套件定义

一个测试类里会编写若干个测试方法。如果某个场景需要执行多个测试类,就需要用到套件测试。套件是一组测试类的集合。在TestNG中,需要使用一个xml文件来定义一个套件,套件里可以包含1个或多个测试类。在xml中还可以很多灵活的配置,实现一些精细化的执行策略。

在Maven工程的resource目录下创建一个testng.xml

<?xml version="1.0" encoding="UTF-8"?><!--执行整个类--><!-- 指定类名,可以添加多个--><!--仅执行某个方法--><!--指定方法名,可以添加多个-->

在xml中,一个test标签就代表了一个执行用例,可以执行一个或多个类,或者指定一个或多个方法(见注释)

02

套件执行

在xml上右键run即可运行整个套件,执行结果

03

数据驱动

在很多测试用例中,对于同一套逻辑,需要使用大量不同的数据进行验证,这个情况下可以使用TestNG的@DataProvider注解来提供数据,并驱动测试用例执行

在测试类中定义一个数据驱动方法,并添加@DataProvider注解

// 加法测试@Test(dataProvider ="testAddData")publicvoidtestAdd(inta,intb,intexpect){    System.out.println("开始执行testAdd");    Calculator calculator =newCalculator();intresult = calculator.add(a, b);    Assert.assertEquals(expect, result);}// 提供了三组测试数据:{数字1, 数字2, 期望值}// 因为返回类型的Object,所以数组中也可以写其他数据类型,String、int、char、float等@DataProvider(name ="testAddData")publicObject[][] testAddData(){    Object[][] data =newObject[][]{{1,1,2}, {2,2,4}, {3,3,5}};returndata;}

注意:

提供数据的providerData方法必须添加注解@DataProvider,并且执行name为testAddData。方法返回的数据类型必须为Object二维数组

使用数据的testAdd方法上,必须制定对应的dataprovider name,并且方法上定义对应数量和类型的入参,用于接受数据

执行testAdd方法后,发现执行了三次,每次分别传入不同的参数,第三组数据执行因为实际和预期不一致,执行结果为失败

04

其他注解

除了@Test注解,还有一些其他的注解也经常使用,具体如下:

注解描述

@BeforeSuite在套件测试执行前执行,仅运行一次

@AfterSuite在套件测试执行后执行,仅运行一次

@BeforeClass在整个测试类执行前执行,仅运行一次

@AfterClass在整个测试类执行后执行,仅运行一次

@BeforeTest在@Test注解的方法执行前执行,每个@Test方法都执行一次

@AfterTest在@Test注解的方法执行后执行,每个@Test方法都执行一次

@BeforeSuitepublicvoidsuiteInit(){    System.out.println("套件执行前测试");}@AfterSuitepublicvoidsuiteEnd(){    System.out.println("套件执行后测试");}@BeforeClasspublicvoidclassInit(){    System.out.println("类执行前测试");}@AfterClasspublicvoidclassEnd(){    System.out.println("类执行后测试");}@BeforeTestpublicvoidtestInit(){    System.out.println("测试方法执行前测试");}@AfterTestpublicvoidtestEnd(){    System.out.println("测试方法执行后测试");}

执行结果:

05

命令行执行

除了在idea中执行TestNG测试方法外,另外一种更实用的执行方法是命令行执行,使用命令行执行更容易和其他外部工具进行集成,比如Jenkins。然而TestNG自身提供的命令行执行方式并不好用。比较简单的方法是和Maven集成,实用maven的方式来调用TestNG。

在工程的pom文件里,添加插件:

org.apache.maven.pluginsmaven-surefire-plugintruesrc/main/resources/testng.xml

在suiteXmlFile标签里,指定testng.xml文件的相对位置。

然后在cmd下,进入到工程的目录下,执行命令:mvn test,可以看到,最终在控制台里打印出了测试结果

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容