1, 简介
TestNG 中用到的 annotation 的快速预览及其属性.
2,TestNG 基本注解(注释)
注解 | 描述 |
@BeforeSuite | 注解的方法只运行一次,在当前 suite 所有测试执行之前执行 |
@AfterSuite | 注解的方法只运行一次,在当前 suite 所有测试执行之后执行 |
@BeforeClass | 注解的方法只运行一次,在当前类中所有方法调用之前执行 |
@AfterClass | 注解的方法只运行一次,在当前类中所有方法调用之后执行 |
@BeforeTest | 只运行一次,所有的测试方法运行之前运行 |
@AfterTest | 只运行一次,所有的测试方法运行之后运行 |
@BeforeGroups | 组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。 |
@AfterGroups | 组的名单,这种配置方法后运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。 |
@BeforeMethod | 在每一个测试方法(@test)运行之前运行,例:执行完测试用例后要重置数据才能执行第二条用例时,可用之种方式。 |
@AfterMethod | 在每一个测试方法(@test)运行之后运行 |
@DataProvider | 标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个 Object[] [],其中每个对象 [] 的测试方法的参数列表中可以分配。 该 @Test 方法,希望从这个 DataProvider 的接收数据,需要使用一个 dataProvider 名称等于这个注解的名字。 |
@Factory | 作为一个工厂,返回 TestNG 的测试类的对象将被用于标记的方法。该方法必须返回 Object[]。 |
@Listeners | 定义一个测试类的监听器 |
@Parameters | 介绍如何将参数传递给 @Test 方法。 |
@Test | 标记一个类或方法作为测试的一部分。 |
3, 使用注释 / 注解的好处
以下是使用注释 / 注解的一些好处:
TestNG 通过查找注释 / 注解来识别它感兴趣的方法. 因此, 方法名称不限于任何模式或格式.
可以将其他参数传递给注释.
注释是强类型的, 所以编译器会马上标记任何错误.
测试类不再需要扩展任何东西(如 TestCase, 对于 JUnit3).
4, Concurrenttesting(注解方式):
@Test 注解上可通过配置 threadPoolSize 来实现并发, threadPoolSize 和 invocationCount 是结合使用的, 当 invocationCount=1 的时候, threadPoolSize 没有意义. invocationCount 表示方法被调用的次数, 如果不配置 threadPoolSize, 该方法会被顺序执行 5 次, 如果配置 threaPoolSize=4, 下图所示的方法会一次以 4 个线程并发执行, 缩短执行时间.
下面的例子是输出进程 ID,threadPoolSize 用来指明线程池的大小, 也就是并发的线程数目是多少
5 次调用, 有 3 个线程可调用
1, 新建 com.course.testng.multiThread 包, 包里新建 MuitiThreadOnAnnotion 类, 如下
2, 参考代码
- package com.course.testng.multiThread;
- import org.testng.annotations.Test;
- /**
- * @author 北京 - 宏哥
- *
- * Java 自动化测试框架 - 11 - TestNG 之 annotation 与并发测试篇
- *
- * 2019 年 11 月 11 日
- */
- // 多线程测试, 没有关联的用例可以使用多线程减少执行时间
- public class MuitiThreadOnAnnotion {
- @Test(invocationCount = 5,threadPoolSize = 3)
- public void test() {
- System.out.println(1);
- System.out.printf("Thrad Id : %s%n",Thread.currentThread().getId());
- }
- }
3, 控制台页面输出
4, 若改成 5 次调用, 有 5 个线程可调用
5,testng.xml 配置文件
TestNG 可以以多线程的模式运行所有的 test, 这样可以获得最大的运行速度, 最大限度的节约执行时间. 当然, 并发运行也是有代价的, 就是需要我们的代码是线程安全的.
并发运行测试的话, 需要我们指定运行的配置文件, 一个示例如下:
<suite name="My suite" parallel="methods" thread-count="4">
说明: 在当前测试规划的执行过程中, 为每个测试方法的执行使用单独的线程, 最多并发 4 个线程.
<suite name="My suite" parallel="tests" thread-count="4">
说明: 在当前测试规划的执行过程中, 为每个测试用例的执行使用单独的线程(该测试用例中的测试方法共享一个线程), 最多并发 4 个线程.
<suite name="My suite" parallel="classes" thread-count="4">
说明: 在当前测试规划的执行过程中, 为每个测试类的执行使用单独的线程(该测试类中的测试方法共享一个线程), 最多并发 4 个线程.
<suite name="My suite" parallel="instances" thread-count="4">
说明: 在当前测试规划的执行过程中, 为每个测试类实例的执行始终使用唯一的线程(该测试实例中的测试方法共享一个线程), 最多并发 4 个线程.
注意: 这里的 parallel 默认值为 "none". 曾经的 "true", "false" 已经过时了, 不建议使用.
1.Parallel="methods" 的意思是指 TestNG 会将 method 作为并发的元子单位, 即每个 method 运行在自己的 thread 中. 如果 parallel="tests", 则指会将 test 作为并发的元子单位
2.Thread-count="2" 是指, 运行的时候, 并发度为 2, 同时会有两个线程在运行.
1, 新建一个测试类, 例如: Test1
2, 参考代码
- package com.course.testng.multiThread;
- import org.testng.annotations.Test;
- /**
- * @author 北京 - 宏哥
- *
- * Java 自动化测试框架 - 11 - TestNG 之 annotation 与并发测试篇
- *
- * 2019 年 11 月 12 日
- */
- public class Test1 {
- @Test(groups = { "t8"})
- public void aThreadPool() {
- System.out.println("#ThreadA:" +Thread.currentThread().getId());
- }
- @Test(groups = { "t8"})
- public void bThreadPool() {
- System.out.println("#ThreadB:" +Thread.currentThread().getId());
- }
- @Test(groups = { "t8"})
- public void cThreadPool() {
- System.out.println("#ThreadC:" +Thread.currentThread().getId());
- }
- }
3,testng.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
- <suite name="Suite">
- <test name="Test" parallel="methods" thread-count="2">
- <classes>
- <class name="com.course.testng.multiThread.Test1"/>
- </classes>
- </test> <!-- Test -->
- </suite> <!-- Suite -->
4, 控制台输出结果:
5, 修改 testng.xml 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
- <suite name="Suite">
- <test name="Test" parallel="tests" thread-count="2">
- <classes>
- <class name="com.course.testng.multiThread.Test1"/>
- </classes>
- </test> <!-- Test -->
- </suite> <!-- Suite -->
6, 控制台页面输出 (因为 aThreadPool(),bThreadPool(),cThreadPool() 都在一个 test 下面)
6, 小结
好了, 今天关于 TestNG 之 annotation 与并发测试篇 , 就分享到这里.
来源: https://www.cnblogs.com/du-hong/p/11821353.html