TestNG自动化测试框架详解

article/2025/9/21 3:14:40

TestNG

文章目录

  • TestNG
    • 一、概述与使用
      • 1.1 配置环境
      • 1.2 测试方法
      • 1.3 使用xml文件
    • 二、测试方法常用注解
      • 2.1 配置类注解
      • 2.2 非配置类注解
        • 2.2.1 @Parameters
        • 2.2.2 @DataProvider
    • 三、依赖测试
    • 四、忽略测试
    • 五、超时测试
    • 六、分组测试
    • 七、失败重试机制
      • 7.1 IRetryAnalyzer接口
      • 7.2 测试方法引入失败重试
        • 7.2.1 通过注解的方式
        • 7.2.2 通过实现接口 + 监听器的方式

一、概述与使用

TestNG是一款设计测试用例执行流程的测试框架。

1.1 配置环境

  1. 添加依赖
<dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.14.3</version>
</dependency>
  1. 安装插件
image-20211114161327706

1.2 测试方法

//导入的两个包均为testng的
import org.testng.Assert;
import org.testng.annotations.Test;public class Tester {@Testpublic void test() {//自定义add方法用来计算两个参数的和int res = Calculator.add(3, 4);int expected = 7;//断言,如果参数的两个值一样,断言就通过,否则抛出异常Assert.assertEquals(res, expected);}
}

运行结果成功示例:

image-20211114160715737

运行结果失败示例(将expected值修改为5):

image-20211114160936688

1.3 使用xml文件

testng.xml 文件用来设计测试用例的执行流程。

  1. 在对应的项目右键,选择如下:
image-20211114162918003
  1. 生成的文件如下图:
image-20211114163902814
  1. xml 配置文件解析
  • <suite>:套件就是将所有的测试类整理在一块,形成一套测试用例
  • <test>:测试集就是测试类的集合,一般把项目的某一个模块设计成一个测试集
  • <classes>:测试集下的所有测试类
  • <class>:具体测试类,name 属性指定测试类的路径
  • <methods>:测试类下具体的测试方法,如果不写此标签则默认包含测试类下的所有方法

以后需要执行哪些测试方法,在xml文件中编写对应的标签即可。

  1. 运行xml配置文件

运行 testng.xml 文件其实运行的是套件中定义的所有测试集下的所有测试类中的指定的测试方法

xml文件右键选择Run,结果如下:

image-20211114164707443

二、测试方法常用注解

2.1 配置类注解

  • @Test 标记的方法:标记测试方法

    • 如果有多个测试方法,执行顺序按照方法名的字典顺序执行,与定义顺序无关
  • @BeforeSuite/@AfterSuite 标记的方法:在某个测试套件(suite)开始之前运行/在某个测试套件所有测试方法执行之后运行

  • @BeforeTest/@AfterTest 标记的方法:在某个测试集(test)开始之前运行/ 在某测试集下的所有测试类中的测试方法执行之后运行

  • @BeforeClass/@AfterClass 标记的方法:在某个测试类(class)开始之前运行/在某个测试类中的所有测试方法执行之后运行

  • @BeforeMethod/@AfterMethod 标记的方法:在某个测试方法(method) 之前运行/在某个测试方法执行之后运行

使用上述所有注解的方法执行顺序:

BeforeSuite
BeforeTest
BeforeClass
{ BeforeMethodTestAfterMethod }
AfterClass
AfterTest
AfterSuite 

注意:

  1. 上述 {} 内的注解表示有几个 @Test ,这些注解标记的方法就要执行多少次

  2. 除了 @BeforeSuite、@BeforeTest、@AfterTest、@AfterSuite 可以对不同的测试类生效外,其他注解的作用范围只在本类中生效。所以,如果想要在别的类中共用某些方法,可以将这些方法声明在上述四个注解中

  3. 图示如下:

    img

2.2 非配置类注解

2.2.1 @Parameters

  1. 先在 testng.xml 文件中定义参数标签

    image-20211114165915242
  2. 对应的测试方法使用注解

    image-20211114170024377

2.2.2 @DataProvider

使用此注解的方法用来提供多组测试数据,返回值是二维数组

使用示例:

@DataProvider
public Object[][] dataResult() {return new Object[][]{{"火星哥", 22, "男"},{"霉霉", 23, "女"}};
}@Test(dataProvider = "dataResult") //值为方法名
public void test(String name, int age, String sex) {System.out.println(name + age + sex);
}/*** @DataProvider(name = "myName"),使用时不再使用方法名,而使用指定的myName名称*/

运行结果:

image-20211114171008125

注意:代码中写测试用例效率较低,一般都是读取excel中的测试用例作为返回值。

三、依赖测试

某测试方法的执行需要依赖于另一测试方法的执行。

使用示例:

@Test(dependsOnMethods = {"test2"})
public void test1() {System.out.println("test1()");
}@Test
public void test2() {System.out.println("test2()");
}

运行结果:

按照字典顺序应该test1()先执行,但是由于test1()依赖于test2(),所以test2()先执行:

image-20211114175129171

四、忽略测试

执行某一测试类时忽略某一测试方法。

使用方法:@Test(enabled = false)

五、超时测试

某一测试方法执行的时间超过指定的毫秒数,则认为此方法执行失败并终止执行抛出异常:

image-20211114175541386

使用方法:@Test(timeOut = 1000)

六、分组测试

可用于只想执行某一部分测试用例时使用。

  1. 定义测试方法并指定分组

    @Test(groups = {"g1"})
    public void test1() {System.out.println("g1分组的test1()方法执行");
    }@Test(groups = {"g1"})
    public void test2() {System.out.println("g1分组的test2()方法执行");
    }@Test(groups = {"g2"})
    public void test3() {System.out.println("g2分组的test3()方法执行");
    }
    
  2. testng.xml 文件中定义 groups 标签

    image-20211114180147046
  3. 运行结果

    image-20211114180333348

七、失败重试机制

有时在测试过程中,可能会出现失败的情况,如果想要重试失败的测试方法就需要使用 TestNG 的失败重试机制。

7.1 IRetryAnalyzer接口

如果想要使用 TestNG 的失败重试机制,就必须了解此接口。

该接口的定义如下:

public interface IRetryAnalyzer {/*** 1. 如果测试方法需要重试则此方法返回true,否则返回false* 2. 参数result表示刚刚运行的测试方法的运行结果*/public boolean retry ( ITestResult result ) ;
}

经过配置之后,一旦测试方法失败,将调用此方法,可以从参数 result 中得到该测试方法的详细信息。如果要重新执行失败的测试,此方法实现应返回true,如果不想重新执行测试,则返回false。通常,此接口的实现类中定义重试的次数。

使用举例:

@Slf4j
public class RetryListener implements IRetryAnalyzer {//定义重试次数的初始值private int initReTryNum = 1;//定义最大重试次数private int maxReTryNum = 3;@Overridepublic boolean retry(ITestResult iTestResult) {if (initReTryNum <= maxReTryNum) {//组装error messageString message = "方法名: " + iTestResult.getName() + " " + "运行失败,正在进行第 " + initReTryNum + " 次重试";System.out.println(message);//重试次数+1            initReTryNum++;//还没有达到最大重试次数,继续重试return true;}return false;}
}

7.2 测试方法引入失败重试

7.2.1 通过注解的方式

该方式可以精确的指定某个测试方法进行失败重试。

@Test 注解的属性 retryAnalyzer 中指定 IRetryAnalyzer 的实现类。

使用举例:

public class Test {//此方法指定重试机制@Test(retryAnalyzer = RetryListener.class)public void test1() {Assert.assertEquals(false, true);}//此方法没有指定失败重试@Testpublic void test2() {Assert.assertEquals(false, true);}
}

运行结果:

只有 test1() 进行了指定次数的重试,因为仅在 test1()@Test 注解中指定了 IRetryAnalyzer 的实现类,test2() 仅执行一次,因为没有在 test2()@Test 注解中指定 IRetryAnalyzer 的实现类。

image-20211215213456555

7.2.2 通过实现接口 + 监听器的方式

需要实现 ITestAnnotationTransformer 接口,会自动的在测试运行期间为每个测试方法调用重写的 transform 方法。也就是说,这种方式会为所有测试方法设置失败重试。

使用举例:

  1. 实现 ITestAnnotationTransformer 接口

    import org.testng.internal.annotations.IAnnotationTransformer;
    import java.lang.reflect.Method;public class OverrideIAnnotationTransformer implements IAnnotationTransformer{@Overridepublic void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {IRetryAnalyzer iRetryAnalyzer= iTestAnnotation.getRetryAnalyzer();if(iRetryAnalyzer==null){//设置指定的IRetryAnalyzer接口的实现类iTestAnnotation.setRetryAnalyzer(RetryListener.class);}	}
    }
    
  2. 配置 testng.xml 的监听器

    <suite name="All Test Suite"><listeners><!-- 定义IAnnotationTransformer的实现类 --><listener class-name="com.qizegao.interfacetest.OverrideIAnnotationTransformer"/></listeners><test verbose="2" preserve-order="true" name="F:/InterfaceTest"><classes><class name="com.qizegao.test.Test001"/></classes></test>
    </suite>
    
  3. 运行结果

    这次没有任何 @Test 注解定义 retryAnalyzer 属性,但是可以发现所有的测试方法都会进行失败重试。


http://chatgpt.dhexx.cn/article/p1XiAaMB.shtml

相关文章

TestNG整理

1 基本概念 TestNG:即Testing, Next Generation,下一代测试技术,是根据JUnit和NUnit思想,采用jdk的annotation技术来强化测试功能并借助XML 文件强化测试组织结构而构建的测试框架。最新版本5.12,Eclipse插件最新版本:testng-eclipse-5.12.0.6 TestNG的应用范围: 单…

TestNG使用教程详解

一、TestNG介绍 TestNG是Java中的一个测试框架&#xff0c; 类似于JUnit 和NUnit, 功能都差不多&#xff0c; 只是功能更加强大&#xff0c;使用也更方便。 详细使用说明请参考官方链接&#xff1a;TestNG - Welcome WIKI教程&#xff1a;TestNG - 小组测试( Group Test)_学习…

TestNG单元测试框架详解

目录 前言 ​1. TestNG使用流程 1.1TestNG安装 1.2 创建Maven项目 1.3 Maven配置 1.4 项目TestNG测试类 1.5 运行TestNG 2、TestNG常用注解 3.xml方式运行 3.1 鼠标右击testng.xml运行 3.1 使用maven运行 4. 常用的断言&#xff08;assert&#xff09; 5. TestNG预…

使用ZRender类库画直线、圆弧、曲线以及点在线上的运动

最近在学习Zrender类库&#xff0c;并利用Zrender 让点在直线、圆弧、曲线上运动。大概的写了一些. Zrender是二维绘图引擎&#xff0c;它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器. 这里我运用的是Canvas画布去画的.想了解Zrender内的属性&…

js画图插件-zrender

zrender&#xff08;Zlevel Render&#xff09; 是一个轻量级的Canvas类库&#xff0c;MVC封装&#xff0c;数据驱动&#xff0c;提供类Dom事件模型&#xff0c;让canvas绘图大不同&#xff01; MVC核心封装实现图形仓库、视图渲染和交互控制&#xff1a; Stroage(M) : shape数…

ZRender文档研读

ZRender文档研读 (基于4.3.2版本) 不使用最新的5.x.x的版本是因为线上文档和最新版本JS文件不匹配-2022年6月13日 1、文档地址 1、官方文档的地址&#xff1a;https://ecomfe.github.io/zrender-doc/public/api.html#zrenderdisplayable 2、Github地址&#xff1a;https://git…

React Developer Tools 下载

React Developer Tools 下载 方法一&#xff1a;网页扩展工具 搜索 React Developer Tools 下载&#xff08;若浏览器不支持搜索React &#xff0c;行不通&#xff09; 打开chrome 浏览器 (只有 chrome 支持 React Developer Tools&#xff09;点击网页工具栏 右上方 确认添…

zrender TypeError: “x“ is not a constructor

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;耶瞳空间 我是调用zrender的init方法报错&#xff0c;如下图&#xff1a; 然后经过大佬指点&#xff0c;这种开发环境没问题但生产环境报错的东西&#xff0c;一般是因为打包的时候被tree-shaking…

vue+zrender实现医院体温单

项目背景 医院医护项目需求&#xff0c;需要用H5做一个通用的体温单 项目演示 版本一 版本二 项目代码简介 由vue-cli4脚手架快速搭建生成&#xff0c;主要代码都在thermometer.vue文件里面&#xff0c;后续修改也主要是在这个文件修改。 项目需求难点在中间的网格部分…

ZRender开发

ZRender开发 开发文档&#xff1a;https://ecomfe.github.io/zrender-doc/public/ <!-- eslint-disable no-undef --> <template><div class"config-page"><div class"header"><el-button click"handleAdd">撒…

Echarts 源码解读 一:zrender源码分析1var zr = zrender.init(document.getElementById(‘main‘));

2021SCSDUSC 因为Echarts是基于zrender进行实现的&#xff0c;所以解读echarts源码前&#xff0c;首先要对zrender有基本的了解。 zrender是canvas的一个类库&#xff0c;zrender是基于canvas实现的。 目录 zrender的src文件夹 文件夹&#xff1a; animation动画相关 cont…

高效canvas绘图框架——zrender

一个轻量级的Canvas类库&#xff0c;MVC封装&#xff0c;数据驱动&#xff0c;提供类Dom事件模型&#xff0c;让canvas绘图大不同 Architecture MVC核心封装实现图形仓库、视图渲染和交互控制&#xff1a; Stroage(M) : shape数据CURD管理Painter(V) : canvase元素生命周期管理…

轻量级的Canvas类库zrender使用笔记 :简单自定义图件开发

ECharts&#xff0c;一个纯 Javascript 的图表库&#xff0c;底层依赖轻量级的 Canvas 类库 ZRender&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可高度个性化定制的数据可视化图表。当然我们自己可能有些需求&#xff0c;通过修改ECharts或者highchar…

vue-echarts的ZRender事件

首先贴出 vue-echarts 的官网连接&#xff1a;https://www.npmjs.com/package/vue-echarts 1、vue-echarts 具体在vue中的使用方法&#xff0c;本文中就暂时不多介绍了&#xff1b; 2、如何在vue中使用vue-echarts的鼠标事件&#xff1a; 具体使用方式跟vue中使用echarts一样&a…

ZRender文档研读 (基于4.3.2版本)

ZRender文档研读 &#xff08;基于4.3.2版本&#xff09; 不使用最新的5.x.x的版本是因为线上文档和最新版本JS文件不匹配-2022年6月13日 1、文档地址 1、官方文档的地址&#xff1a;https://ecomfe.github.io/zrender-doc/public/api.html#zrenderdisplayable 2、Github地址…

【ZRender 渲染引擎 - 贰】 | Vue 框架集成与绘制其他图元

theme: cyanosis 持续创作&#xff0c;加速成长&#xff01;这是我参与「掘金日新计划 10 月更文挑战」的第 8 天&#xff0c;点击查看活动详情 1. Vue 中使用 ZRender 上一篇中&#xff0c;我们通过最原始的方式体验了一下 ZRender 的使用。接下来&#xff0c;为了更方便管理…

zrender实现图形缩放功能

zrender实现图形缩放功能 一、绘制一个矩形图 <div id"main-container"></div>#main-container {width: 500px;height: 300px;border: 1px solid #888; }import * as zrender from zrenderconst container document.querySelector(#main-container) c…

ECharts 3.0底层zrender 3.x源码分析1-总体架构

zrender是一个轻量级的Canvas类库&#xff0c;作为百度Echarts 3.0的底层基础。截至目前查看的zrender源码和文档&#xff0c;包括官网文档都还停留在2.x时代&#xff0c;我打算用一个系列介绍下zrender 3.x的使用和源码&#xff0c;一些demo和没有在博客中介绍的源码请进我的g…

ZRender (Canvas)简单使用(拖拽、缩放、旋转、文字、层级)

一、ZRender 是二维绘图引擎&#xff0c;它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器&#xff1b; 二、下面是以图片做的简单demo&#xff0c;分为左中右三部分&#xff0c;左边是需要的图片&#xff0c;中间是绘图部分&#xff0c;右边是添加文字…

源码解读之zrender-ZRender 类(3)

00 小结 当我们在 zrender.init(document.getElementById(“canvas”))时&#xff0c;首先实例化了一个 ZRender 实例&#xff0c;在这个实例化过程中&#xff0c;主要实例化了&#xff1a; Storage 类&#xff0c;作用类似于全局状态管理Painter 类&#xff0c;可以理解为画…