TestNG的简单使用
TestNG的简单使用
TestNG(Test Next Generation)是一个测试框架,其灵感来自JUnit和NUnit,但同时引入了一些新的功能,使其功能更强大,使用更方便。
- TestNG是一个设计用来简化广泛的测试需求的测试框架,涵盖单元测试到集成测试
- 支持依赖测试方法,并行测试,异常测试、参数化测试、时限测试、分组测试等测试方法
- 基于Annotation机制,使测试方法更为灵活配置
- 引入xml配置文件,从而使软件测试不仅仅是硬编码到程序中,做到更为灵活
- 支持多线程测试
编写TestNG测试基本上包括以下步骤:
- 编写测试的业务逻辑代码,并在相应代码中插入TestNG的annotation。
- 将测试信息配置到testng.xml文件中。
- 运行TestNG,TestNG默认情况下,会生产两种类型的测试报告HTML的和XML的。 测试报告位于 "test-output" 目录下。
TestNG的实现——Annotation
常用Annotation
- @BeforeSuite/@AfterSuite 在某个测试套件开始之前/在某个套件所有测试方法执行之后
- @BeforeTest/@AfterTest 在某个测试开始之前/在某个测试所有测试方法执行之后
- @BeforeClass/@AfterClass 在某个测试类开始之前/在某个类的所有测试方法执行之后
- @BeforeMethod/@AfterMethod 在某个测试方法之前/在某个测试方法执行之后
- @BeforeGroup/@AfterGroup 在某个组的所有测试方法之前/在某个组的所有测试方法执行之后
- @DataProvider 标志一个方法,用来提供测试数据,标注的方法能够返回一个Object[] []或者Iterator<Object[]>对象。
- @Listeners 定义一个测试类的监听器。
- @Parameters 设置参数,用以传递给测试方法。
Annotation带来的优势
- before方法和after方法 带来了足够丰富的测试生命周期控制
- dependsOnGroups/dependsOnMethods 提供了依赖检查机制,并可以严格控制执行顺序
- DataProvider 使得对同一个方法的测试覆盖变的非常轻松,非常适合进行边界测试,只要给出多种测试数据就可以针对一个测试方法进行覆盖
- expectedExceptions 使得异常测试变的非常轻松
- invocationCount/threadPoolSize 可以简单地设置并行测试的线程数,并开启多线程测试
- timeOut 用来设定测试方法超时时间,从而对程序的效率和运行时间有了更为直观的控制
TestNG的灵魂——testng.xml
说明:
- 标签 suite 代表一个测试套件。它可以包含一个或多个测试
- 标签 test 代表一个测试,并可以包含一个或多个TestNG测试类
- class的标签代表一个TestNG的类是一个Java类,它包含至少一个TestNG的注解,也可以包含一个或多个测试方法
- package制定测试的包名,自动检索当前包中包含TestNG Annotation的类和方法
- groups用来表明测试用例的分组,有利于针对一类的测试用例进行专门的测试
- 一个配置文件中只有一个suite,基本上一个项目写一个配置文件就可以了,当然如果你的项目足够大,可能需要几个配置文件。
suite属性说明:
- @name: suite的名称,必须参数
- @junit:是否以Junit模式运行,可选值(true | false),默认"false"
- @verbose:命令行信息打印等级,不会影响测试报告输出内容;可选值(1|2|3|4|5)
- @parallel:是否多线程并发运行测试;可选值(false | methods | tests | classes | instances),默认 "false"
- @thread-count:当为并发执行时的线程池数量,默认为"5"
- @configfailurepolicy:一旦Before/After Class/Methods这些方法失败后,是继续执行测试还是跳过测试;可选值 (skip | continue),默认"skip"
- @time-out:为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒
- @skipfailedinvocationcounts:是否跳过失败的调用,可选值(true | false),默认"false"
- @data-provider-thread-count:并发执行时data-provider的线程池数量,默认为"10"
- @preserve-order:顺序执行开关,可选值(true | false),默认为"true"
test属性说明:
-
@name:test的名字,必选参数;测试报告中会有体现
-
@junit:是否以Junit模式运行,可选值(true | false),默认"false"
-
@verbose:命令行信息打印等级,不会影响测试报告输出内容;可选值(1|2|3|4|...|10)
-
@parallel:是否多线程并发运行测试;可选值(false | methods | tests | classes | instances),默认 "false"
-
@thread-count:当为并发执行时的线程池数量,默认为"5"
-
@time-out:为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒
-
@enabled:设置当前test是否生效,可选值(true | false),默认"true"
-
@skipfailedinvocationcounts:是否跳过失败的调用,可选值(true | false),默认"false"
-
@preserve-order:顺序执行开关,可选值(true | false) 默认为"true"
-
@group-by-instances:是否按实例分组,可选值(true | false) 默认为"false"
备注:(By default, dependent methods are grouped by class. For example, if method b() depends on method a(), TestNG will not run b() until all the instances have invoked their a() method. This behavior might not be desirable in certain scenarios, such as for example testing a sign in and sign out of a web browser for various countries.)
-
@allow-return-values:是否允许返回函数值,可选值(true | false),默认"false"
备注:(Test methods are annotated with @Test. Methods annotated with @Test that happen to return a value will be ignored, unless you set allow-return-values to true in your testng.xml。)
常用测试方法
异常测试 忽略测试 时限测试
异常测试
可以检测某一方法检测到某一异常时是否能按预期地抛出
忽略测试
TestNG是通过直接在方法上加标注的方式来进行测试,而这里也可以设置某个测试方法不工作。可以通过如下方式:
时限测试
可以设置一个特定时长的限制(以毫秒ms为单位),一旦测试的内容运行超过了该 时间长度,那么将会终止,同时标记为failed
TestNG特有测试机制
组测试 参数化测试 并行测试 依赖测试
组测试
通过定义分组,来执行特定一组测试方法,从而提高用户测试的灵活性,同时在测试配置文件中也可以通过include和exclude属性的配置,来控制测试用例的执行
参数化测试
Data Provider方法可以返回如下两种类型中的一种:
1.含有多个对象的数组 (Object[][]),其中第一个下标指明了测试方法要调用的次数,第二个下标则完全与测试方法中的参数类型和个数相匹配。
2.另外一个是迭代器 Iterator<Object[]>。二者的区别是迭代器允许你延迟创建自己的测试数据。TestNG会调用迭代器,之后测试方法会一个接一个的调用由迭代器返回的值。在你需要传递很多参数组给测试组的时候,这样你无须提前创建一堆值。
通过@Parameters传递参数。
并行测试
TestNG允许我们以并行(多线程)的方式来执行测试。这就意味着基于TestNG测试组件的配置,多个线程可以被同时启动然后分别执行各自的测试方法。
并行(多线程)执行测试可以给用户带来很多好处,主要包括以下两点:
1)减少了执行时间:并行测试也就意味着多个测试可以在同一时间被同时执行,从而减少了整体测试所花费的时间。 2)允许多个线程并行地测试同一个测试组件:有了这个特性,我们就能够写出相应的测试用例来验证应用程序中包含多线程部分的代码的正确性。
依赖测试
Testng提供了两种依赖实现:强制依赖和顺序依赖
- 强制依赖:如果被依赖的某一个方法发生了异常,那么之后的方法都不会被执行(默认)
- 顺序依赖:无论被依赖的方法是否出现异常,后续的方法都会被执行,通过alwaysRun=“true”来配置
TestNG的应用场景
- TestNG参数化批量测试
例如我们车型库会有很多车型id,车系id等数据,我们可以把对应的数据随机组合到excel或者文本中,然后代码中通过@DataProvider来进行测试。
举例随便在excel中构造点数据, 然后输出如下:
2, 多线程测试
我们服务端接口响应速度一般都要求在100ms以内,那么我们怎样能确定我们对服务端的接口能够达到这个要求呢? 我们可以通过testNG的多线程以及指定timeOut来测试。
生成报告
在代码目录下的test-output文件夹,点开index.htm即可查看测试报告:
参考附录
[TestNG教程]:http://www.yiibai.com/testng/
[TestNG testing framework]:https://github.com/cbeust/testng
[TestNG Documentation]:http://testng.org/doc/documentation-main.html
[junit-4-vs-testng-comparison]:http://www.mkyong.com/unittest/junit-4-vs-testng-comparison/