简介
在设计接口测试框架或者UI自动化框架的时候,大概率都会用到testng这个框架,本篇主要介绍testng这个框架的使用。
官方文档:http://testng.org/doc/index.html
testng的特点
- 注解功能
- TestNG使用Java和面向对象的功能
- 支持综合类测试(例如,默认情况下,没有必要创建一个新的测试每个测试方法的类的实例)
- 独立的编译时间测试代码运行时配置/数据信息
- 灵活的运行时配置
- 主要介绍“测试组”。当编译测试,只要问TestNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等
- 支持依赖测试方法,并行测试,负载测试,局部故障
- 灵活的插件API
- 支持多线程测试
testng环境配置
- 验证Java安装在你的机器上
- 设置JAVA环境
- 通过maven下载TestNG
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
使用步骤
- 编写测试业务逻辑,在代码中插入TestNG annotations
- 在配置文件testng.xml或build.xml中配置测试信息
- 运行TestNG
注解的优点
- TestNG的标识的方法关心寻找注解。因此,方法名并不限于任何模式或格式
- 我们可以通过额外的参数注解
- 注释是强类型的,所以编译器将标记任何错误
- 测试类不再需要任何东西(如测试案例,在JUnit3)扩展
注解的运行顺序
- @BeforeSuite: 被注释的方法将在所有测试运行前运行
- @AfterSuite: 被注释的方法将在所有测试运行后运行
- @BeforeTest: 被注释的方法将在测试运行前运行
- @AfterTest: 被注释的方法将在测试运行后运行
- @BeforeGroups: 被配置的方法将在列表中的gourp前运行。这个方法保证在第一个属于这些组的测试方法调用前立即执行
- @AfterGroups: 被配置的方法将在列表中的gourp后运行。这个方法保证在最后一个属于这些组的测试方法调用后立即执行
- @BeforeClass: 被注释的方法将在当前类的第一个测试方法调用前运行
- @AfterClass: 被注释的方法将在当前类的所有测试方法调用后运行
- @BeforeMethod:被注释的方法将在每一个测试方法调用前运行
- @AfterMethod: 被注释的方法将在每一个测试方法调用后运行
TestNG一个方法的生命周期
- @BeforeSuite(执行一次)
- @BeforeClass(执行一次)
- @BeforeMethod(N个Test 方法执行N次)
- @Test Test方法(此注解可能在类上表示多个,在方法表示一个)
- @AfterMethod(N个Test 方法执行N次)
- @AfterClass(执行一次)
- @AfterSuite(执行一次)
@Test注解里的参数
- dependsOnMethods、dependsOnGroups:依赖测试,一个test依赖于另一个test的执行结果
- groups:组测试,一个test属于哪一个组,可以跑一个特定组的所有test
- expectedExceptions:异常测试
- dataProvider:参数化测试,将参数传入该test
- enabled:忽略测试,不执行该test
- timeOut、threadPoolSize、invocationCount、successPercentage:并发测试,设置并发测试的各种参数
- alwaysRun: 如果为true的话,不管怎样都会运行
依赖测试
有时候需要在特定的顺序下调用测试案例,或分享一些数据和方法之间的状态,就可以使用dependsOnMethods或dependsOnGroups申明。被注解的方法只有在被依赖的方法执行成功后执行。
以上两段代码,分别是这两个参数的运用,只有被依赖的方法执行成功,依赖的方法才会执行。
组测试
在TestNG中组测试是一个新的创新功能,它不存在于JUnit框架,它允许调度到适当的部分方法和瓶坯复杂的测试方法分组。你不仅可以声明属于群体的那些方法,但你也可以指定一组包含其他组。然后,TestNG可调用和要求包括一组特定的群体(或正则表达式),而排除另一个集合。这给了你最大的灵活性,如何分区测试,如果想运行两套不同的测试背靠背,不要求重新编译任何东西。
以上分别是定义的test方法和对应的testng.xml中的分组设定。
运行方法分别为
- 命令行
java org.testng.TestNG -groups checkintest -excludegroups functest com.testng.example.GroupTestExample
- Ant
<testng groups="checkintest" excludegroups="functest">
<classfileset>
<include name=“com/testng/example/GroupTestExample” />
</classfileset>
</testng>
- 利用java API
TestNG tng = new TestNG();
tng.setGroups("checkintest");
tng.setExcludeGroups(“functest")
- 运行配置的TestNG.xml
异常测试
TestNG跟踪异常处理代码提供了一个选项。可以测试是否需要代码抛出异常或不抛出。 @Test注释expectedExceptions 参数一起使用。
参数化测试
在TestNG的另一个有趣的功能是参数测试。在大多数情况下,你会遇到这样一个场景,业务逻辑需要一个巨大的不同数量的测试。参数测试,允许开发人员运行同样的测试,一遍又一遍使用不同的值。TestNG让你直接传递参数测试方法两种不同的方式:使用testng.xml、数据提供程序。
1、@Parameter
TestNG支持@Parameter传参方式的类型如下
- String
- int/Integer
- boolean/Boolean
- byte/Byte
- char/Character
- double/Double
- float/Float
- long/Long
- short/Short
2、@DataProvider - 只提供了一个字符串属性:名称,供测试方法作为传递参数的annotation使用
- 两种DataProvider,一种是返回一个二维数组对象,如上面的例子;另外一种DataProvider是返回一个Iterator
- DataProvider可以向测试方法传递任意类型任意数目的参数
- 利用DataProvider提供不同的参数集合对一个测试方法进行多次调用
忽略测试
有时,我们的代码是没有准备好,如果测试用例写入到测试方法代码将无法运行,在这种情况下,@Test(enabled = false)有助于禁用此测试案例。 测试方法是标注了@Test(enabled = false),那么并不是已经准备好测试的测试用例是绕过的。
并发测试
TestNG可以以多线程的模式运行所有的test,这样可以获得最大的运行速度,最大限度的节约执行时间。当然,并发运行也是有代价的,就是需要我们的代码是线程安全的
tesng.xml介绍
Testng.xml是以xml记录所有测试的文件。它描述了测试套件的运行时定义,也是testng中运行测试的最大工作单元。虽然没有testng.xml文件,测试也很容易被执行。但是随着测试代码的增长,testng.xml提供了方便用来存放所有运行时的配置,如设置有关类,测试,方法,参数,分组的包含与排除等。
Testng.xml的主要结构:根标签是,标签包含一个或多个标签,标签包含一个或多个标签,标签包含一个或多个标签
- Suite:由一个XML文件表示,可以包含一个或者多个Test,suite可以通过标签来运行其他testng的xml文件
- Test:表示一个测试,可以包含一个或者多个TestNG类
- TestNG类:就是一个简单的Java类,至少包含一个TestNG annotation
- Method:一个普通的Java方法,其前由@Test标记
- Groups:TestNG可以将不同的Method分类到不同的Groups中,也可以将Class分类到不同的Groups中