一、前言
以前有用过TestNG,后来不知为何学了一阵子就没下文了,至此就一直用Python的框架做自动化。下半年换了新工作,面试了测试开发的岗位,发现测开大部分是用java,所以最近又学起了java基础(虽然大学的时候学过,但是全都还给老师了,哈哈哈)。边学java的过程也边学java的测试框架,貌似TestNG是用的比较多的,所以就开始了学习之旅,虽然可以运用到实践,但是学的还是比较蹩脚,就不再啰嗦了,进入正文吧。
参考了:https://blog.csdn.net/df0128/article/details/83243822
二、TestNG介绍
TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 功能都差不多, 只是功能更加强大,使用也更方便。
Java中已经有一个JUnit的测试框架了,TestNG比JUnit功能强大的多, 测试人员一般用TestNG来写自动化测试,开发人员一般用JUnit写单元测试。
官方网站: http://testng.org/doc/index.html
三、TestNG安装(基于IDEA)
1、一般来说IDEA是自带TestNG框架的:File > Settings > Plugins,搜索TestNG安装即可。
2、IDEA的结构:project - module - package - class
注:用实际例子解释一下IDEA的结构:project(购物网站),module(购物车或者订单模块),package(模块下的细分,包名一般用公司域名倒过来写),class(类)
3、具体的新建项目操作步骤可自行百度
四、TestNG基本运用和运行
1、一个简单的例子如下:
package com.tech.suc; import org.junit.Assert; import org.junit.Test; public class Case { @Test public void test(){ System.out.println("this is testng case"); Assert.assertTrue(true); } }
2、直接用脚本方式运行:右键Run
3、xml方式运行:新建testng.xml,右键Run
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" > <suite name="Suite1" verbose="1" > <test name="Nopackage" > <classes> <class name="com.tech.suc.Case" /> </classes> </test> </suite>
五、TestNG注解说明
1、TestNG注解
TestNG支持多种注解,可以进行各种组合,如下进行简单的说明,列表中的@Factory、@Linsteners这两个是不常用的;
注解 | 描述 |
@BeforeSuite | 在该套件的所有测试都运行在注释的方法之前,仅运行一次 |
@AfterSuite | 在该套件的所有测试都运行在注释方法之后,仅运行一次 |
@BeforeClass | 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次 |
@AfterClass | 在调用当前类的第一个测试方法之后运行,注释方法仅运行一次 |
@BeforeTest | 注释的方法将在属于test标签内的类的所有测试方法运行之前运行 |
@AfterTest | 注释的方法将在属于test标签内的类的所有测试方法运行之后运行 |
@BeforeGroups | 配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行 |
@AfterGroups | 此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行 |
@BeforeMethod | 注释方法将在每个测试方法之前运行 |
@AfterMethod | 注释方法将在每个测试方法之后运行 |
以上注解的属性 | ![]() |
@DataProvider | 标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称 |
@Factory | 将一个方法标记为工厂,返回TestNG将被用作测试类的对象。 该方法必须返回Object [] |
@Listeners | 定义测试类上的侦听器 |
@Parameters | 描述如何将参数传递给@Test方法 |
@Test |
将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法 |
2、常用注解简单例子
package com.tech.design; import org.testng.annotations.Test; public class Case { @Test(enabled = false) public void Test1(){ System.out.println("忽略测试,此测试用例不会运行"); } //“超时”表示如果单元测试花费的时间超过指定的毫秒数, // 那么TestNG将会中止它并将其标记为失败。此项常用于性能测试 @Test(timeOut = 5000) public void Test2(){ System.out.println("超时测试"); } @Test(description = "Test3用例描述信息") public void Test3(){ System.out.println("描述,用于展示在测试报告中"); } //依赖测试用例 @Test(dependsOnMethods = {"Test2"}) public void Test4(){ System.out.println("依赖测试,执行该用例前会先执行Test1用例"); } //依赖测试用例分组 @Test(dependsOnGroups = {"group1"}) public void Test5(){ System.out.println("依赖测试,执行该用例前会先执行Test1用例"); } @Test(groups = "group1") public void Test6(){ System.out.println("分组测试1,Test6"); } @Test(groups = "group1") public void Test7(){ System.out.println("分组测试1,Test7"); } @Test(groups = "group2") public void Test8(){ System.out.println("分组测试group2,在xml执行时可以体现"); } }
3、其他说明
1)依赖测试
TestNG允许指定依赖关系:
- 在@Test注释中使用属性dependsOnMethods
- 在@Test注释中使用属性dependsOnGroups
除此之外依赖还分为hard依赖和soft依赖:
- hard依赖:默认为此依赖方式,即其所有依赖的methods或者groups必须全部pass,否则被标识依赖的类或者方法将会被略过,在报告中标识为skip,如后面的范例所示,此为默认的依赖方式;
- 以下实例的被依赖方法Test4的结果为fail:因为所依赖的method(Test1)不执行,即fail,所以会导致被依赖(Test4)fail。若Test1是true,则Test4执行成功。
-
package com.tech.design; import org.testng.annotations.Test; public class Case { @Test(enabled = false) public void Test1(){ System.out.println("忽略测试,此测试用例不会运行"); } //依赖测试用例 @Test(dependsOnMethods = {"Test1"}) public void Test4(){ System.out.println("依赖测试,执行该用例前会先执行Test1用例"); } }
- soft依赖:此方式下,其依赖的方法或者组有不是全部pass也不会影响被标识依赖的类或者方法的运行,注意如果使用此方式,则依赖者和被依赖者之间必须不存在成功失败的因果关系,否则会导致用例失败。此方法在注解中需要加入alwaysRun=true即可,如@Test(dependsOnMethods= {"TestNgLearn1"}, alwaysRun=true);