TestNG 是一个开源自动化测试框架,"NG" 表示下一代 (Next Generation 的首字母). TestNG 类似于 JUnit(特别是 JUnit 4), 但它不是 JUnit 框架的扩展, 相较于 Junit 而言, 功能更强大, 使用起来更加方便, 比较适合测试人员来进行集成测试或是接口回归测试.
一, TestNG 的特点
使用 java 和面向对象的功能
方法的名称就不必受限于某种固定的格式, 可以通过注释来识别需要执行的方法;
方法中需要的一些参数可以通过注释传递;
注释是强类型的, 所以有错误可以在编译期体现出来;
支持分组测试, 依赖测试, 并行测试, 负载测试等
支持多线程测试
二, TestNG 常用的注释类型
注释 | 描述 |
---|---|
@Test | 将类或是方法标记为测试的一部分 |
@BeforeSuite | 在该套件的所有测试都运行在注释的方法之前,仅运行一次。 |
@AfterSuite | 在该套件的所有测试都运行在注释的方法之后,仅运行一次 |
@BeforeClass | 在调用当前类的所有测试方法之前执行,注释方法仅运行一次 |
@AfterClass | 在调用当前类的所有测试方法之后执行,注释方法仅运行一次 |
@BeforeTest | 注释的方法将在属于标签内的类的所有测试方法运行之前运行 |
@AfterTest | 注释的方法将在属于标签内的类的所有测试方法运行之后运行。 |
@BeforeGroups | 此方法是保证在运行属于任何这些组的第一个测试方法之前,该方法被调用 |
@AfterGroups | 此方法是保证运行属于任何这些组的所有测试方法执行之后,该方法被调用 |
@BeforeMethod | 被注释的方法将在每个测试方法之前执行 |
@AfterMethod | 被注释的方法将在每个测试方法之后执行 |
@DataProvider | 被注释的方法的作用是提供测试数据,如果某个测试方法希望从这个 DataProvider 接收数据,就必须使用一个名字等于这个注解名字的 DataProvider |
@Parameters | 介绍如何将参数传递给测试方法 |
三, TestNG 参数化测试
TestNG 提供了 2 种传递参数的方式.
第一种: testng.xml
这种方式的优点是使得代码和测试数据分离, 方便维护; 缺点就是如果需要传递的参数不是基本的 java 类型, 或是需要的值只能在运行时创建, 这种方法就不再适用.
第二种:@DataProvider
这种能够提供比较复杂的参数 (也叫 data-driven testing).
我们项目中使用的是第二种
如图示: 首先给测试方法添加值为 WithdrawBatchQueryLoopData 的属性 dataProvider, 然后提供一个 name 与之对应的 @DataProvider 方法, 这个方法里的具体实现, 就是从配置文件或是数据库中读取数据.
四, TestNG 分组测试
分组测试是 TestNG 中的创新功能, 分组测试使得我们可以进行各种灵活的测试, 在想要并行多组不同的测试时, 不需要重新进行编译.
分组可以应用在方法上 (一个方法可以属于一到多个分组), 也可以应用在类上, 应用在类上时, 这个类中的所有 public 方法都变成测试方法, 即便他们没有被注解, 也可以继续在需要增加属性的方法上重复 @Test 注解. 分组执行测试方法有多种形式:
可以通过在 testng.xml 配置, 来指定具体要执行的分组
也可以通过集成到 jenkins 中, 通过参数化构建来设置要执行的分组
还可以通过运行 Run Configurations 时, 设置要执行的分组
需要注意的一点: Group 标签会导致 @BeforeMethod 失效
@BeforeMethod 的作用是标明所注解的方法在每一个测试方法运行之前会执行一次. 例如:
- @BeforeMethod
- Public void beforeMehod()
- @Test
- Public void testCase1()
- @Test
- Public void testCase2()
正常的执行的顺序为: beforeMehod-> testCase1-> beforeMehod-> testCase2
但是, 在将 testCase 放入某一个 Group 之后,@BeforeMethod 就失效了
- @BeforeMethod
- Public void beforeMehod()
- @Test(groups = "group1")
- Public void testCase1()
- @Test(groups = "group1")
- Public void testCase2()
再次执行脚本, 执行顺序变为 testCase1->testCase2
解决方法:
1, 将 @BeforeMethod 同样加入 group1
2, 设置 @BeforeMethod 的属性 alwaysRun=true
五, TestNG 依赖测试
我们经常会遇到要测试的多个接口之间存在依赖关系, 即某一个接口的执行需要依赖上一个接口的返回结果, 比如执行批付查询时, 需要先执行批量代付, 那么这时就使用到了 TestNG 的依赖测试, TestNG 使用 dependsOnMethods 配合 alwaysRun 来设置测试方法之间的依赖关系, 使用 dependsOnGroups 来设置分组之间的依赖关系
强依赖: 在测试方法运行之前, 所有的依赖方法都必须运行并且成功, 哪怕只有一个失败, 测试方法都不会被调用 (是 skip 而不是 fail)
软依赖 (alwaysRun=true): 测试方法在依赖方法运行之后总是会被执行, 即便某些依赖方法运行失败.
六, TestNG 预期异常测试
测试中, 有时候我们期望某些代码抛出异常.
TestNG 通过 @Test(expectedExceptions) 来判断期待的异常, 并且判断 Error Message
七, TestNG 测试报告
执行完测试用例之后, 会在项目的 test-output(默认目录) 下生成测试报告
打开 index.html 文件可以看到测试结果摘要, 包括: 套件名, 测试用例成功数, 测试用例失败数, 测试用例忽略数, 执行时间和 testng.xml 文件.
测试用例都成功的话, 测试结果以绿底标志, 测试用例有失败的话, 测试结果以红底标志. testNG 自带生成的测试报告不太美观, 可以使用 testng-xslt 进行美化.
来源: https://yq.aliyun.com/articles/706129