前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TestNG之注解的生命周期

TestNG之注解的生命周期

作者头像
顾翔
发布2019-12-11 10:43:19
8220
发布2019-12-11 10:43:19
举报

来源:http://www.51testing.com

  有必要介绍一下TestNG注解的生命周期,先看一下官网支持的注解有

@BeforeSuite  @AfterSuite  @BeforeTest  @AfterTest  @BeforeGroups  @AfterGroups  @BeforeClass  @AfterClass  @BeforeMethod  @AfterMethodConfiguration information for a TestNG class:  @BeforeSuite: The annotated method will be run before all tests in this suite have run.  @AfterSuite: The annotated method will be run after all tests in this suite have run.  @BeforeTest: The annotated method will be run before any test method belonging to the classes inside the <test> tag is run.  @AfterTest: The annotated method will be run after all the test methods belonging to the classes inside the <test> tag have run.  @BeforeGroups: The list of groups that this configuration method will run before. This method is guaranteed to run shortly before the first test method that belongs to any of these groups is invoked.  @AfterGroups: The list of groups that this configuration method will run after. This method is guaranteed to run shortly after the last test method that belongs to any of these groups is invoked.  @BeforeClass: The annotated method will be run before the first test method in the current class is invoked.  @AfterClass: The annotated method will be run after all the test methods in the current class have been run.  @BeforeMethod: The annotated method will be run before each test method.  @AfterMethod: The annotated method will be run after each test method.

  英文看到不是很明白,那么我们从挨个实验。

package com.test;  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;  /**  * @author QiaoJiafei  * @version 创建时间:2016年3月24日 下午9:21:00  * 类说明  */  public class TestNG2 {  @BeforeSuite  public void beforesuite() {  System.out.println("beforesuite");  }  @AfterSuite  public void aftersuite() {  System.out.println("aftersuite");  }  @BeforeTest  public void beforetest() {  System.out.println("beforeTest");  }  @AfterTest  public void AfterTest() {  System.out.println("aftertest");  }  @BeforeClass  public void beforeclass() {  System.out.println("beforeclass's TestNG2");  }  @AfterClass  public void aftertclass() {  System.out.println("afterclass's TestNG2");  }  @BeforeMethod  public void beforemethod() {  System.out.println("TestNG2's beforemethod");  }  @AfterMethod  public void aftertmethod() {  System.out.println("TestNG2's aftermethod");  }  @BeforeGroups  public void beforegroups() {  System.out.println("TestNG2's beforegroups");  }  @AfterGroups  public void aftergroups() {  System.out.println("TestNG2's aftergroups");  }  @Test  public void test1() {  System.out.println("TestNG2's testt1");  }  @Test(groups="gr")  public void test2() {  System.out.println("TestNG2's testt2");  }  public void ff() {  System.out.println("nothing");  }  }

  运行后的结果:

beforesuite  beforeTest  beforeclass's TestNG2  TestNG2's beforemethod  TestNG2's testt1  TestNG2's aftermethod  TestNG2's beforemethod  TestNG2's testt2  TestNG2's aftermethod  afterclass's TestNG2  aftertest  aftersuite

  由此可见,testng运行时,顺序是这样的:

  @BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite

  其中{}内的与多少个@Test,就循环执行多少次。

  我们知道了在一个类中注解的生命周期,那么这些注解的作用范围呢,下面我们再建一个类

package com.test;  import org.testng.annotations.AfterClass;  import org.testng.annotations.BeforeClass;  import org.testng.annotations.Test;  /**  * @author QiaoJiafei  * @version 创建时间:2016年3月24日 下午9:20:47  * 类说明  */  public class TestNG1 {  @BeforeClass  public void beforeclass() {  System.out.println("beforeclass's TestNG1");  }  @AfterClass  public void afterclass() {  System.out.println("afterclass's TestNG1");  }  @Test  public void test3() {  System.out.println("TestNG1's test3");  }  @Test(groups="haha")  public void test4() {  System.out.println("TestNG1's test4");  }  }

  XML中这样配置

<?xml version="1.0" encoding="UTF-8"?>  <suite name="Suite" parallel="false">  <test name="Test">  <classes>  <class name="com.test.TestNG1"/>  <class name="com.test.TestNG2"/>  </classes>  <!-- <groups>  <run>  <include name="gr" />  </run>  </groups>-->  </test> <!-- Test -->  </suite> <!-- Suite -->

  运行的结果是:

beforesuite  beforeTest  beforeclass's TestNG1  TestNG1's test3  TestNG1's test4  afterclass's TestNG1  beforeclass's TestNG2  TestNG2's beforemethod  TestNG2's testt1  TestNG2's aftermethod  TestNG2's beforemethod  TestNG2's testt2  TestNG2's aftermethod  afterclass's TestNG2  aftertest  aftersuite

  看到没有,除了@BeforeSuite、@BeforeTest、@AfterTest、@AfterSuite可以对不同的测试类生效外,其他的注解的作用范围只在本类中生效。这样就可以清晰的知道什么样的逻辑应该放在哪个注解中,如只想在测试中只启动、关闭一次浏览器,且再不同的测试类中共用,那么我们就可以把启动、关闭浏览器的方法放在suite和test中

  至于@BeforeGroups和@AfterGroups笔者目前还没有发现怎么生效。

  画了个路程图更直接点。

顾翔凡言:

读书就像旅游,精读就像自由行、泛读就像跟团游。精读为了专业掌握某个技能;泛读为了扩大自己的知识广度;跟团游为了增加自己的旅游范围;自由行为了深入了解当地文化。测试也如此,对于同一产品广泛的广度测试与某个模块的深度测试全是不可缺少。根据帕托累斯原理,80%的Bug分布在20%的模快,所以为了有效的节省测试时间,我们需要进行广度测试,找到20%缺陷密集模块,然后进行深度测试。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试培训 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档