Java自动化测试框架--TestNG详解
一. 什么是TestNG
TestNG是一个开源的自动化测试框架,它受JUnit和NUnit启发,其中“NG”即表示Next Generation,其功能更强大使用更方便。
二. TestNG配置
2.1 POM文件配置
在maven工程的pom.xml文件中加入以下依赖:
<dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.14.2</version></dependency>
2.2 TestNG插件安装
三. 用例运行方法
3.1 单个用例
选中该用例->右键,Run As ->TestNG Test

3.2 单个类的用例
打开类文件,空白处右键,Run As ->TestNG Test
和单个用例一样,不同之处只是在类文件里空白处点击右键。此操作会执行该类下所有的测试用例。
3.3 多个类的用例(Test Suite)
使用testng.xml文件,该文件用来管理测试用例,并运行testNG。
<suite>:套件就是将所有的测试类整理在一块,形成一套测试用例
<test>:测试集是指测试模块,一般一个项目可以按照模块分为几部分,即不同的test
<classes>:测试集下的所有测试类
<class>:具体测试类,name 属性指定测试类的路径
<methods>:测试类下具体的测试方法,如果不写此标签则默认包含测试类下的所有方法。
举例,本文的testng.xml内容如下:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" ><suite name="testng test" parallel="false"><test name="API test"><classes><class name="com.apitest.APITest"/><class name="com.apitest.APITest2"/></classes></test><test name="GUI test"><classes><class name="com.seletest.FirstWebTest"/></classes></test></suite>
注:<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 必须要添加,这是testng.xml文件的规范要求。
运行结果如下:

四. TestNG注解
4.1 Before/After注解

4.2 Test注解
@Test 注解的作用很简单,即用来标识当前方法是测试方法。它可以加很多参数:
1) denpendsOnMethonds: 用来设置用例依赖。
@Testpublic void apitest01() {System.out.println("in APITest, apitest01");Assert.assertEquals(false,true);}@Test(dependsOnMethods= {"apitest01"})public void apitest02() {System.out.println("in APITest, apitest02");}
如上的两个用例,apitest01执行通过,则执行apitest02;如果apitest01执行失败,则apitest02直接跳过,不会执行:

2) alwaysRun:默认是false,设置为true时,无论什么情况都会运行。一般和dependsOnMethods结合。
@Testpublic void apitest01() {System.out.println("in APITest, apitest01");Assert.assertEquals(false,true);}@Test(dependsOnMethods= {"apitest01"},alwaysRun=true)public void apitest02() {System.out.println("in APITest, apitest02");}
如上的两个用例,不管apitest01是否失败,apitest02都运行。运行结果如下:

3) enabled:默认是true,设置为false时表示用例失效(即不运行)。使用方法:
@Test(enabled=false)
4) Priority:设置用例运行的优先级。默认是0,优先级P0最高,其次是P1;高优先级的用例优先运行
@Test(priority=3)public void apitest01() {System.out.println("in APITest, apitest01 -- P3 ");//Assert.assertEquals(false,true);}@Test(priority=2)public void apitest02() {System.out.println("in APITest, apitest02 -- P2");}@Test(priority=1)public void apitest03() {System.out.println("in APITest, apitest03 -- P1");}
上述用例的运行结果如下:

5)timeOut:指定测试方法执行的超时时间,如果超过指定的毫秒数,则认为执行失败并终止执行抛出异常。使用方法:
@Test(timeOut = 1000)
6)Groups: 指定用例所属的组,一般是对用例进行逻辑划分,譬如只想执行一部分用例,例如冒烟测试,可以定义一个冒烟用例集:
@Test(groups="smoke")public void apitest01() {System.out.println("in APITest, apitest01 -- P3 ");//Assert.assertEquals(false,true);}@Test(groups="regression")public void apitest02() {System.out.println("in APITest, apitest02 -- P2");}@Test()public void apitest03() {System.out.println("in APITest, apitest03 -- P1");}
注意,group需要在testng.xml中加入以下配置:

则运行结果如下,即“API test”中,只有属于smoke组的用例才会执行:
五. 用例的传参
即给测试方法传递参数,更进一步说,如何实现数据-脚本的分离。
5.1 Parameters
需要首先在testng.xml里设置,注意此时必须通过testng.xml来运行,否则找不到parameter。

@Test()@Parameters({"name","age"})public void apitest01(String name, int age) {System.out.println("in APITest, apitest01");System.out.println(name + "'s age is: " + age + ".");}
运行结果如下:

这种方式传参缺点很明显:
·只能通过testng.xml来运行,不够灵活
· 只能传递基础类型的参数
· 只能传递一组参数
5.2 DataProvider
DataProvider是更灵活更强大的参数传递方式。它支持各种数据类型的参数,可以传递多组参数。其返回值类型是Object类型的二维数组,定义如下:
@DataProvider(name="paraDatas")public Object[][] paraDatas(){Object[][] paras = {{"zhang san", 20},{"li si", 21},{"wang wu", 22}};return paras;}
在测试用例的Test方法里,使用方法如下:
@Test(dataProvider = "paraDatas")public void apitest01(String name, int age) {System.out.println("in APITest, apitest01");System.out.println(name + "'s age is: " + age + ".");}
运行结果如下:

DataProvider比较灵活且强大,但它也有局限,即实际上还是在代码中hardcode的方式。如果多一种情况,还需要修改case(paraDatas)。
5.3 POI技术
Apache POI 是基于 Office Open XML 标准(OOXML)和 Microsoft 的 OLE 2 复合文档格式(OLE2)处理各种文件格式的开源项目。简而言之,可以使用 Java 读写 MS Excel 文件,可以使用 Java 读写 MS Word 和 MS PowerPoint 文件。
本质上它还是使用DataProvider的方式传参,但可以真正实现数据-脚本的分离。
这里不多讲了~
此外还可以将数据库查询的结果作为参数传递,但本质是一样的。
六. 思考与总结
testNG还有很多很强大的机制,例如用例失败重试,需要实现IRetryAnalyzer接口,相比其他参数的使用,其稍微复杂一些,有空了再搞吧~
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】


相关文章:
Java自动化测试框架--TestNG详解
一. 什么是TestNG TestNG是一个开源的自动化测试框架,它受JUnit和NUnit启发,其中“NG”即表示Next Generation,其功能更强大使用更方便。 二. TestNG配置 2.1 POM文件配置 在maven工程的pom.xml文件中加入以下依赖: <depe…...
【分布式 | 第五篇】何为分布式?分布式锁?和微服务关系?
文章目录 5.何为分布式?分布式锁?和微服务关系?5.1何为分布式?5.1.1定义5.1.2例子5.1.3优缺点(1)优点(2)缺点 5.2何为分布式锁?5.2.1定义5.2.2必要性 5.3区分分布式和微服…...
JavaScript百炼成仙自学笔记——13
函数七重关之六(“new”一个函数) 看个代码: function hello(){console.log(this); } 1、this:也是JavaScript中的一个关键字,永远指向当前函数的调用者 解释一下,有两层意思: ①this要嘛不出现&#…...
【skill】小米10让app永驻后台
小米10(国行), 8128不能让app驻留后台我也忍了,但是12256依然如此,各种尝试,全网检索不杀app的方法,除了在系统设置里调,什么adb、shizuku冰箱冰柜的没一个能用 系统版本试过国行版…...
《架构风清扬-Java面试系列第29讲》聊聊DelayQueue的使用场景
DelayQueue是BlockingQueue接口的一个实现类之一 这个属于基础性问题,老规矩,我们将从使用场景和代码示例来进行讲解 来,思考片刻,给出你的答案 1,使用场景 实现:延迟队列,其中元素只有在其预定…...
说说SpringBoot自动配置原理
Spring Boot的自动配置原理可以概括为:通过读取jar包中的配置信息,并根据项目依赖和条件注解自动配置应用程序所需的bean,从而减少手动配置的工作量。 第一、代码入口 SpringBootApplication 👇 EnableAutoConfiguration &#…...
bash: docker-compose: 未找到命令
bash: docker-compose: 未找到命令 在一台新的服务器上使用 docker-compose 命令时,报错说 docker-compose 命令找不到,在网上试了一些安装方法,良莠不齐,所以在这块整理一下,如何正确快速的安装 docker-compose cd…...
linux 权限和权限的设置
在Linux中,文件和目录的权限是一个重要的安全特性。这些权限决定了哪些用户可以读取、写入或执行某个文件或目录。以下是关于Linux权限和如何设置它们的基本信息。 权限类型 Linux中有三种基本的权限类型: 读取(r):…...
基于Springboot的旅游管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的旅游管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…...
springboot3项目练习详细步骤(第一部分:用户业务模块)
目录 环境准备 用户模块 注册 注册接口文档 编辑 实现结构 Spring Validation 登录 登录的接口文档 实现登录逻辑 JWT令牌 完善登录认证 拦截器 获取用户详细信息 接口文档 Usercontroller类中编写方法接口 忽略属性返回 优化代码ThreadLocal 更新用户基本信…...
推荐算法顶会论文博客笔记合集
小小挖掘机学习笔记 https://mp.weixin.qq.com/s/rp2xXueEyT8IKvTr2Qss3A 推荐系统学习笔记 https://blog.csdn.net/wuzhongqiang/category_10128687.html SIGIR SIGIR 2022 | 推荐系统相关论文分类整理:8.74 https://mp.weixin.qq.com/s/vH0qJ-jGHL7s5wSn7Oy…...
DRM/RESP无法连接linux上redis的原因
问题一: redis.conf配置文件 进入到自己的redis软件目录 vim redis.conf 将bind 127.0.0.1 : 1 注释掉,改成bind 0.0.0.0,让远程所有ip都可以访问 将daemonize yes 守护进程,修改后可在后台运行 protected-mod…...
vim怎么选中多行后在头部插入#(随手记)
方法1 进入可视行模式: 按下 V(大写 V),选中整行,包括行尾空白字符。使用 v(小写 v),然后移动光标选择从行中间开始的多行。 插入 #: 选中多行后,使用 I&…...
Objective-C的对象复制与拷贝选项
对象复制与拷贝 文章目录 对象复制与拷贝copy与mutablecopycopy与mutablecopy的简介示例:不可变对象的复制可变对象的复制 NSCopying和NSMutableCopying协议深复刻和浅复刻浅拷贝(Shallow Copy):深拷贝(Deep Copy&…...
HTML5 中的离线缓存机制,即应用缓存(Application Cache 或 AppCache)已被废弃并正在被逐步移除
HTML5 中的离线缓存机制,即应用缓存(Application Cache 或 AppCache)已被废弃并正在被逐步移除。这是因为应用缓存存在一些设计上的缺陷和限制,导致它在实际应用中经常出现问题。 取而代之的是一种更强大、更灵活的技术——Servi…...
vue3+ant design实现表格数据导出Excel
提示:实现表格数据导出Excel 文章目录 前言 一、安装ant design? 二、引用ant design 1.搭建框架 2.获取表格数据 三、封装导出表格的代码 四、导出 1.获取导出地址 2.在下载导出事件中添加导出代码 五、全部代码 前言 今天终于有时间来更新文章了,最近公司项目比较紧…...
VBA_NZ系列工具NZ06:VBA创建PDF文件说明
我的教程一共九套及VBA汉英手册一部,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到数据库,到字典,到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑,这么多知识点该如何组织…...
Git === Git概述 Git安装
第1章 Git概述 Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。 Git易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion…...
Linux diff命令(比较两个文件或目录的内容差异)
文章目录 Linux diff 命令详解教程基本用法比较文件输出解释 递归比较(-r)示例代码 控制输出格式统一格式(-u)上下文格式(-c) 高级选项忽略所有空白差异(-w)仅报告文件是否不同 Linu…...
从传统到现代:水表的远程抄表革命
1.引言:技术驱动的转型 在过去的几十年里,我们的生活方式被科技的快速发展深深影响,其中就包括了公用设施的管理方式。传统水表的远程抄表系统就是这样一个例子,它将老旧的手动抄表模式转变为高效、精确的自动化系统。 2.传统水…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
标注工具核心架构分析——主窗口的图像显示
🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...
