Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)
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 | 标记一个类或方法作为测试的一部分。 |
如上列表中的@Factory、@Linsteners这两个是不常用的;
前十个注解看起来不太容易区分,顺序不太容易看明白,以如下范例做简单说明,代码:
package com.course.testng.multiThread; /** * @author 北京-宏哥 * * Java自动化测试框架-11 - TestNG之annotation与并发测试篇 * * 2019年11月12日 */ import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterGroups; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeGroups; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class NewTest { @Test(groups="group1") public void test1() { System.out.println("test1 from group1"); Assert.assertTrue(true); } @Test(groups="group1") public void test11() { System.out.println("test11 from group1"); Assert.assertTrue(true); } @Test(groups="group2") public void test2() { System.out.println("test2 from group2"); Assert.assertTrue(true); } @BeforeTest public void beforeTest() { System.out.println("beforeTest"); } @AfterTest public void afterTest() { System.out.println("afterTest"); } @BeforeClass public void beforeClass() { System.out.println("beforeClass"); } @AfterClass public void afterClass() { System.out.println("afterClass"); } @BeforeSuite public void beforeSuite() { System.out.println("beforeSuite"); } @AfterSuite public void afterSuite() { System.out.println("afterSuite"); } //只对group1有效,即test1和test11 @BeforeGroups(groups="group1") public void beforeGroups() { System.out.println("beforeGroups"); } //只对group1有效,即test1和test11 @AfterGroups(groups="group1") public void afterGroups() { System.out.println("afterGroups"); } @BeforeMethod public void beforeMethod() { System.out.println("beforeMethod"); } @AfterMethod public void afterMethod() { System.out.println("afterMethod"); } }
控制台输出如下:
3、使用注释/注解的好处
以下是使用注释/注解的一些好处:
-
TestNG通过查找注释/注解来识别它感兴趣的方法。 因此,方法名称不限于任何模式或格式。
-
可以将其他参数传递给注释。
-
注释是强类型的,所以编译器会马上标记任何错误。
-
测试类不再需要扩展任何东西(如TestCase,对于JUnit3)。
4、 Concurrenttesting(注解方式):
下面的例子是输出进程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 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
公众号(关注宏哥)                                                                                 客服微信