(二)TestNG 基础概念和执行时机注解

2023-11-18

入门的篇幅会写的比较长,毕竟基础要理解好。在学习TestNG注解前,我们先了解基本的名词,留个印象。

TestNG名词解释:

1.TestNG方法(method):是一个在代码内使用@Test注解标注的方法。下面代码中的isDuckMeal()就是一个测试方法。

  @Test
  public void  isDuckMeal() {
     //do sth
  }

2.TestNG 组(group):TestNG方法可以加上groups="groupid"的属性来为方法划分组,后续可以在xml文件中来决定运行哪些组。下面的isClean方法就属于groupxxx组。

	@Test(groups="groupxxx")
	public void isClean(){
		//do sth
	}

下面的配置在xml中排除了groupxxx组。运行的时候,将不会运行所有属于groupxxx组的方法。

<groups>
	<run>
		<!--排除全部属于groupxxx组的Test Method-->
		<exclude name="groupxxx"/>
	</run>
</groups>

3.TestNG类(class):是包含至少一个TesdNG注解的Java类。可以包含多个测试方法。在xml文件中由<class>标签定义了这个Test所涉及的class。

4.TestNG用例(test):是多个TestNG类的组合。在xml文件中由<test>标签定义。

5.TestNG套件(suite):定义了一组业务级粒度的测试动作,它由一个或多个TestNG用例(Test)组成,在xml文件中由<suite>标签定义。


除了@Test注解外,TestNG还提供了丰富的注解满足各种测试场景需求。我们这里先讲最常见的关于执行时机的注解。一下子塞太多也消化不了。

TestNG执行时机注解:在同一个TestNG默认会按照方法的首字母升序执行TestNG Method。

@BeforeSuite:被注解的方法在所属套件(suite)内会最先运行。
@AfterSuite:被注解的方法在所属套件(suite)内会在最后运行。
@BeforeTest:被注解的方法会在所属的类所属的Test用例下最先运行。
@AfterTest:被注解的方法会在这个方法所属的类所属的Test用例下最后运行。
@BeforeClass:被注解的方法会在这个方法所属的类运行时最先运行。
@AfterClass:被注解的方法会在这个方法所属的类运行时最后运行。
@BeforeGroups:被注解的方法会在这个方法所属的组(group,组只属于某个Test,Test之间的组互不干扰)被调用时最先运行。
@AfterGroups:被注解的方法会在这个方法所属的组(group,组只属于某个Test,Test之间的组互不干扰)被调用时最后运行。
@BeforeMethod:被注解的方法会在该方法所属类内每个测试方法运行前运行。
@AfterMethod:被注解的方法会在该方法所属类内每个测试方法运行后运行。

考试考阅读理解的原因来了,上面这些描述,这么绕是不是很容易就被绕晕了,先回顾下前面的名词解释,然后我们结合实际的例子来理解这些注解。我们先来一个简单的例子。先新建一个TestNG类和TestNG配置xml文件。

package com.testng;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class SimpleExample {
	@Test
	public void simpleTest1(){
		System.out.println("simpleTest1");
	}
	
	@Test
	public void simpleTest2(){
		System.out.println("simpleTest2");
	}
	
	@BeforeSuite
	public void beforeSuiteExample(){
		System.out.println("beforeSuite");
	}
	
	@BeforeTest
	public void beforeTestExample(){
		System.out.println("beforeTest");
	}
}

这个TestNG配置xml内加了注释,注明了部分注解的运行时机,可以看下留个印象

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!-- Before suite -->
<suite name="testSuite">
	<!-- Before test1 -->
	<test name="test1">
		<classes>
			<!-- Before class1 -->
			<class name ="com.testng.SimpleExample" />
			<!-- After class1 -->
		</classes>
	</test>
	<!-- After test1 -->
</suite>
<!-- After suite -->

然后在TestNG配置xml文件上,右键,run as -> TestNG Suite(单个类运行也可以不用xml配置,就像上一篇博文的helloworld例子那样,但是单个类测试的场景不是我们主要的学习目标)。运行后,最先会切到Result of Running suite标签可以看到本次运行的套件的结构。TestNG的执行顺序,就是顺着这个结构,穿插着各种before after自上而下的执行下来。


前面说了,@BeforeSuite注解会在这个套件内最先运行,@BeforeTest会在这个Test执行前,最先执行,然后是按方法名首字母字母升序执行类内的TestNG方法。我们看下控制台输出,确实如此。


接下来让我们搞包含全部注解的完整例子。新建两个TestNG类和TestNG xml配置。来观察多种注解多个类,跨类group组的执行顺序。

package com.testng;
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 TestNGClass1 {	
	@BeforeSuite
	public void beforeSuite1(){
		System.out.println("beforeSuite1 会在所属Suite被调用前运行 我们同属于一个Suite会按xml的顺序执行");
	}
	@AfterSuite
	public void afterSuite1(){
		System.out.println("afterSuite1 会在所属Suite运行后运行 我们同属于一个Suite会按xml的顺序执行");
	}
	
	@BeforeTest
	public void BeforeTest1(){
		System.out.println("beforeTest1 会在当前所属的Test运行前运行 我们同属于一个Test会按xml的顺序执行");
	}
	
	@AfterTest
	public void afterTest1(){
		System.out.println("afterTest1 会在当前所属的Test运行后运行 我们同属于一个Test会按xml的顺序执行");
	}
	
	@BeforeClass
	public void beforeClass1(){
		System.out.println("beforeClass1 会在当前所属的class1运行前运行");
	}
	
	@AfterClass
	public void afterClass1(){
		System.out.println("afterClass1 会在当前所属的class1运行后运行");
	}
	/*这表示这注解的方法会在id为groupsxxx的组的所有方法运行前最先运行*/
	@BeforeGroups(groups="groupxxx")
	public void beforeGroupsXXX(){
		System.out.println("beforeGroupsXXX 会在这个Test内所属的Group被调用前运行");
	}
	/*这表示这个注解的方法会在id为groupxxx的组的所有方法运行完毕后运行*/
	@AfterGroups(groups="groupxxx")
	public void afterGroupsXXX(){
		System.out.println("afterGroupsXXX 会在这个Test内所属的Group运行后运行");
	}
	
	@BeforeMethod
	public void beforeMethod1(){
		System.out.println("beforeMethod1 会在当前类每个test method被调用前运行");
	}
	
	@AfterMethod
	public void afterMethod1(){
		System.out.println("afterMethod1 会在当前类每个test method运行后运行");
	}
	
	@Test(groups="groupxxx")
	public void test1001GroupXXX(){
		System.out.println("test1001-XXX Test Method");
	}
	
	@Test(groups="groupyyy")
	public void test1002GroupYYY(){
		System.out.println("test1002-YYY Test Method");
	}
}
package com.testng;
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 TestNGClass2 {
	
	@BeforeSuite
	public void beforeSuite2(){
		System.out.println("beforeSuite2 会在所属Suite被调用前运行 我们同属于一个Suite会按xml的顺序执行");
	}
	@AfterSuite
	public void afterSuite2(){
		System.out.println("afterSuite2 会在所属Suite运行后运行 我们同属于一个Suite会按xml的顺序执行");
	}
	
	@BeforeTest
	public void BeforeTest2(){
		System.out.println("beforeTest2 会在当前所属的Test运行前运行 我们同属于一个Test会按xml的顺序执行");
	}
	
	@AfterTest
	public void afterTest2(){
		System.out.println("afterTest2 会在当前所属的Test运行后运行 我们同属于一个Test会按xml的顺序执行");
	}
	
	@BeforeClass
	public void beforeClass2(){
		System.out.println("beforeClass2 会在当前所属的class2运行前运行");
	}
	
	@AfterClass
	public void afterClass2(){
		System.out.println("afterClass2 会在当前所属的class2运行后运行");
	}
	
	@BeforeGroups(groups="groupyyy")
	public void beforeGroupsYYY(){
		System.out.println("beforeGroupsYYY 会在所属的Group被调用前运行");
	}
	
	@AfterGroups(groups="groupyyy")
	public void afterGroupsYYY(){
		System.out.println("afterGroupsYYY 会在所属的Group运行后运行");
	}
	
	@BeforeMethod
	public void beforeMethod2(){
		System.out.println("beforeMethod2 会在每个test method被调用前运行");
	}
	
	@AfterMethod
	public void afterMethod2(){
		System.out.println("afterMethod2 会在每个test method运行后运行");
	}
	
	
	@Test(groups="groupxxx")
	public void test2001GroupXXX(){
		System.out.println("test2001-XXX Test Method");
	}
	
	@Test(groups="groupyyy")
	public void test2002GroupYYY(){
		System.out.println("test2002-YYY Test Method");
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!-- Before suite -->
<suite name="testSuite">
	<!-- Before test1 -->
	<test name="test1">
		<classes>
			<!-- Before class1 -->
			<class name ="com.testng.TestNGClass1" />
			<!-- After class1 -->
			
			<!-- Before class2 -->
			<class name ="com.testng.TestNGClass2" />
			<!-- After class2 -->
		</classes>
	</test>
	<!-- After test1 -->
</suite>
<!-- After suite -->

TestNG会按照xml配置中的顺序,从上往下的执行test用例。这个例子,执行的顺序说明都已在控制台打印。TestNG会按照xml配置中的顺序,从上往下的执行test用例。动手敲一敲,很快就能搞明白这里的调用顺序优先级。我们看下控制台的输出,重点把group的结果标了出来。


下面回顾下,配置xml文件的标签层次,编写TestNG xml文件时就按这个层次来。

|--suite
|--test
  |--groups
  |       |--run 
  |       |--exclide name="groupid"//排除组,支持正则表达式
          |--classes

      |--class name="classname"

到了这一步,你至少已经能看懂TestNG的注解,知道怎么编写简单的TestNG套件,TestNG也就算入门辣!后面我们再讲TestNG的其他注解的用法。

附上TestNG官网,你想查的都在这里:https://testng.org/doc/documentation-main.html#annotations




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(二)TestNG 基础概念和执行时机注解 的相关文章

  • Spring MutableValues 的 NoSuchMethodError

    我编写了一个测试 在其中使用注释指定应用程序上下文位置 然后我将我的 dao 自动连接到测试中 ContextConfiguration locations file service src main webapp WEB INF appl
  • 有没有办法在 After 方法中使用 ITestResult 获取完整的错误/异常?

    Test priority 16 enabled true public void C2410859 FilterAlertsByCard throws IOException InterruptedException ATUTestRec
  • 如何使用 Selenium webdriver 打开特定浏览器

    我正在使用 lang java 框架 testNG 我的系统安装了 3 4 个版本的 Mozilla 我如何打开特定版本的 Mozilla 的实例 假设我安装了 3 5 3 6 版本的 Mozilla 并且我想打开 3 6 版本并执行测试
  • 如何设置TestNG+Jenkins

    我正在使用 Jenkins 运行一些 testNG 测试 当构建完成后 我最后收到以下消息 INFO Build failures were ignored TestNG Reports Processing START Looking f
  • 即使使用 test.useTestNG(),Gradle 也不运行 TestNG 测试

    My build gradle看起来像这样 apply plugin scala apply plugin java sourceCompatibility 1 8 version 1 0 repositories mavenCentral
  • Playwright 框架:有没有一种方法可以在 playwright 中执行依赖测试?

    Playwright 框架 有没有一种方法可以在 playwright 中执行依赖测试 例如 我们使用 TestNg 注释的 取决于 方法 或在 Selenium Webdriver 中使用 Priority 注释 我有一个依赖于其他测试用
  • TestNG 报告器 org.testng.reporters.JUnitReportReporter@7a79be86 失败 java.util.ConcurrentModificationException

    我是 TestNG 框架的新手 我已经使用 TestNG 框架为应用程序编写了脚本 脚本工作正常 但我在控制台末尾收到错误 附有错误 请任何人都可以帮助我 提前致谢 在此输入图像描述 https i stack imgur com XlgI
  • 按预期顺序运行依赖和独立测试方法

    我想按顺序执行测试方法 我在 testng xml 中使用了类 并将保留顺序设置为 true
  • 忽略 testng 中的一个类

    当我运行我的 testng 套件时 有一些测试类需要被忽略 我尝试对需要忽略的类和方法使用 Test enabled false 注释 但我的问题是 需要忽略的类扩展了一个抽象类 并且即使我在基类上有 Test enabled false
  • TestNG:如何获取当前执行的组

    有没有办法获取当前正在执行的组的名称 I tried BeforeMethod public void beforeMethod ITestContext context groups context getCurrentXmlTest g
  • TestNG - 在测试类之间共享状态

    我有一个testng questions tagged testng我通过 testng xml 文件运行的测试类套件 这很好用 所有测试都是串行运行的 因此不存在并行执行障碍 我现在的目标是获取一个测试类中的测试方法生成的状态 例如 cu
  • Java - TestNG:为什么我的断言在 try-catch 块中写入时总是通过

    我正在尝试使用一个简单的代码org testng Assert断言 2 个用例 在第一个用例中 我断言 2 个不相等的值Fail正确 但在第二个用例中 当我在 try catch 块中断言 2 个不相等的值时 结果始终返回为Pass 我的代
  • @BeforeClass 和继承 - 执行顺序

    我有一个抽象基类 我用它作为单元测试的基础 TestNG 5 10 在这个类中 我初始化了测试的整个环境 设置数据库映射等 这个抽象类有一个方法 该方法带有 BeforeClass进行初始化的注释 接下来 我用我所拥有的特定课程来扩展该课程
  • TestNG 跳过测试 - 为什么?

    我正在使用 testng 和 selenium 测试一个网络应用程序 测试主要包括打开应用程序的几个页面 并针对每个页面执行一些特定的活动 因此 我有一个执行 打开页面 测试的抽象基类 并定义了一个用作该测试的数据提供程序的抽象方法 然后有
  • 如何优化 testng 和 selenium 测试

    在我的实习中 我必须使用 TestNG 和 selenium 来测试 Web 应用程序 但我有一个问题 有时硒或浏览器由于某种随机原因无法工作 因此工作测试被标记为 失败 为了避免这种情况 我可以使用注释 Test invocationCo
  • 如何自定义 json 格式的 TestNG 报告结果

    我正在使用 TestNG 和 selenium webdriver java 我想制作一个json格式的输出报告 testng可以制作一个json格式的报告吗 请给我一个关于这个问题的例子 您可以编写自己的报告程序 以您需要的任何格式生成测
  • 无法使用 Gradle 运行 TestNG

    我有一个使用 TestNG 运行的简单代码 但我无法使用 Gradle 运行相同的代码 因为它说找不到 main 方法 这并不奇怪 因为我使用的是注释 但在这样的场景下 如果我必须使用Gradle 如何运行代码 请注意 我对 Gradle
  • 为什么 throw new SkipException() 会跳过我的所有方法?

    为什么 throw new SkipException 会跳过所有类中的所有方法 第一类有一个方法失败 因此该类中的其余方法将被跳过 并且跳过计数器设置为 0 第二类应该执行所有方法 并且所有方法都应该传入第二类 因为跳过计数器设置为 0
  • 在 logback 中记录并行线程

    我将尝试对我的 Selenium 框架进行简要描述 以便我可以解释我的问题 I use 硒2 当前版本2 3 1 测试NG 5 14 我设置 testng xml 文件来并行运行测试套件中的测试 只有 2 个实例 出于记录目的 我使用log
  • 断言失败时如何继续执行

    我正在使用 Selenium RC 使用 Java 和 eclipse 和 TestNG 框架 我有以下代码片段 assertTrue selenium isTextPresent Please enter Email ID assertT

随机推荐

  • 基本模块的总结

    基本模块的总结 请求模块 urllib库 内置库 urllib request request urlopen 网址或者请求对象 向网址发起请求 request Requqest url 网址 headers 请求头 data 请求参数 创
  • 利用java完成图像文字识别和翻译,实现拍照翻译的功能

    需求 利用java完成图像文字识别和翻译 实现拍照翻译的功能 可拆分为以下两个小的功能逐一完成 1 实现图像文字识别 2 将识别出来的文字进行翻译 1 实现图像文字识别 利用Tess4J进行图像文字识别 1 1 为方便集成tess4j的ja
  • Discuz移动接口原理简介

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Discuz论坛内置提供针对移动端开发的json接口 下面根据源码进行一些分析 入口 api mobile index php 功能比较简单 指向source plugin
  • Open Source Game Clones

    Open Source Game Clones This site tries to gather open source reimplementations of great old games in one place If you t
  • 微信开发者工具重定向(请求接口307)问题

    问题描述 在项目中勾选不校验http请求 发起http请求 会出现http请求自动转成了https请求 如图所示请求失败 这是因为微信开发者工具重定向导致的 解决方法 将微信开发者工具账号的配置清空 删除C盘微信开发者工具User Data
  • 解决ElementUI table表格的边框隐藏

    解决ElementUI table表格的边框隐藏 发现问题 解决 写在最后 发现问题 我方产品将于五秒后到达战场 刚在对照原型做项目的时候突然发现了这样一个表格 产品说他的这个数据表表格不要周边的边框 但是中间要边框分隔 嗯 这是什么需求
  • python语言核心技术_python核心技术

    基本语法 Python的设计目标之一是让代码具备高度的可阅读性 它设计时尽量使用其它语言经常使用的标点符号和英文单字 让代码看起来整洁美观 它不像其他的静态语言如C Pascal那样需要重复书写声明语句 也不像它们的语法那样经常有特殊情况和
  • Socket 与 Webservice 的区别

    Socket 与 Webservice 的区别 socket是一种协议 采用tcp或udp协议通信 Tcp udp属于网络层 上边各层的应用都需要我们自己实现 例如端口的定义 数据包的定义 数据包的加密解密等 webservice是一种服务
  • JAVA超大量数据入库

    快速插入1000W万条数据 背景 步骤1 数据库连接 步骤2 插入数据方法 步骤3 调用他就完事了 背景 产品需求 生成一串不重复的号码0 19999999且不能有超过3位以上的豹子号连号 当消耗一半后需要多少秒才能插入一条数据 首先的问题
  • microsoft store 微软应用商店打不开?所有教程都尝试了一遍,居然是因为这个

    所有教程都尝试了一遍 居然是因为这个 此方法适用于 1 平时爱用梯子 2 下面这个浏览器已经不能上网了 3 网上其他教程均不管用的情况 弄了好久 没想到还能弄好 网上的教程我都试了一遍 真的哭笑不得 原理 微软的应用商店联网靠的就是inte
  • 以一个最简单的例子把OO的JavaScript说明白

    OO的JavaScript并不高深 麻烦就麻烦在google出来的国人介绍文章经常罗罗嗦嗦 而且之间的说法还各有不同 摆在一起就让人看了头大 这里重拾简单主义 以一个最简单的例子把OO Javascript说明白 1 一个颇为精简的例子 只
  • 页面点击锚点后不改变URL的方法

    前端简单地锚点实现方法无非就是在把 a 标签的 href 写成想要跳到的元素的id 比如点击 a href box a 页面就会自动滚动到 div div 元素的位置 这样会导致url会改变 浏览器默认的行为会将 id 放在 url 后面
  • vue-cli3中解决在ie中报语法错误问题导致白屏

    1 一般报语法错误时因为部分浏览器不支持ES6 so 我们就应该下载 npm install babel polyfil 判断此插件是否成功 查看项目中是否有babel config js这个文件 2 在vue config js里配置引入
  • 【PTA 题目详解】 例题5-7 计算2个复数之和与之积

    题目 分别输入2个复数的实部与虚部 用函数实现计算2个复数之和与之积 若2个复数分别为 c1 x1 y1 i c2 x2 y2 i 则 c1 c2 x1 x2 y1 y2 i c1 c2 x1 x2 y1 y2 x1 y2 x2 y1 i
  • Java 内部类

    静态内部类 demo1 public class StaticInnerClassTest public static void main String args StaticInner Inner inner new StaticInne
  • python求一个数的阶乘_python如何计算数的阶乘

    python计算数的阶乘的三种方法 1 使用 for i in range 循环语句求阶乘 2 使用 reduce 函数求阶乘 3 通过递归求阶乘 方法一 普通的for循环语句 a 1 n 5 for i in range 1 n 1 a
  • java根据关键字搜索_java 抓取百度根据关键词搜索域名

    packagebaidusearch importcom sun glass ui SystemClipboard import java util importjava util HashMap importjava io Buffere
  • futureTask RunnableFuture Future 三者关系认知

    对于这三者首先我们看下源码 之后在分别写几个demo讲解下用法 public interface RunnableFuture
  • HTML5中的引用标记是什么元素?

    HTML5提供了多种元素用于引用文本内容 其中最常用的是 blockquote 元素和 blockquote
  • (二)TestNG 基础概念和执行时机注解

    入门的篇幅会写的比较长 毕竟基础要理解好 在学习TestNG注解前 我们先了解基本的名词 留个印象 TestNG名词解释 1 TestNG方法 method 是一个在代码内使用 Test注解标注的方法 下面代码中的isDuckMeal 就是