TestNG 单元测试详解

1、测试环境

jdk1.8.0 121

myeclipse-10.0-offline-installer-windows.exe

TestNG 插件

org.testng.eclipse 6.8.6.20130607 0745

2、介绍

套件(suite):由一个 XML 文件表示,通过<suite>标签定义,包含一个或更多测试(test)。测试(test):由<test>定义,包含一个或更多 TestNG 类(class)。TestNG类(class):至少包含一个TestNG注释(annotation)的java 类,由<class>标签定义,包含一个或多个测试方法(test medthod)。测试方法(test method):一个附注了@Test 的 java 方法。

3. Annotation

 

更多解释,可以查看官方文档的介绍

 4、testng.xml介绍

4.1.例 1

 注:test-output是运行后自动生成的。xmltest.xm1是在对应目录下新建的,testng-1.0.dtd 也是下载后,手动放进去的。

Test1.java 代码:

package unittests;
import org.testng.annotations.*
public class Test1 {
@Test
public void func1(){System.out.println("test in func1");
public void func2(){System.out.println("test in func2");

 testng-1.0.dtd下载地址:http://testng.org/testng-1.0.dtd

右键 xmltest.xml-> Run As TestNG Suite,运行套件,输出如下:

 说明:
1、只有被附注了@Test 的方法才会被执行。
2、如果右键只能看到 Run As Run Configurations,则右键项目,选择 refresh 刷新

3、TestNG 类没有归属 package,也可以如下编写 xml(当前版本的插件是不允许新建TestNG Class 时不提供包名的,通常建议提供包名)

 4.2.例 2

也可以指定包名,而非类名,TestNG将查找 unittests 包中所有 class,且仅保留携带TestNG 注解的类。

运行结果同上

 4.3.例3
还可以指定需要包含/排除的 group 和方法。

修改 Test1.java 代码

package unittests;
import org.testng.annotations.*;
public class Test1 {@Test(groups={"functest","checkintest"})public void func1(){System.out.println("test in func1");
@Test(groups={"functest""checkintest"})
public void func2(){
System.out.println("test in func2");
@Test(groups={"functest"})public void func3(){System.out.println("test in func3");

问题:保存代码后,编辑器中,代码 package unittests;右侧会提示“红叉”解决方法:

 

 

 

 修改 xmltest.xml

 

 运行结果:未执行任何一个测试方法。
再修改下,把

 

 说明:
1、例中的<include>和<exclude>是 and 关系,而非 or 的关系

2、仅提供 groups 元素配置,不提供 class 元素,执行后不调用任何测试方法

3、还可以为 group 添加其它属性,比如是否并发运行,使用多少线程,是否运行Junit

 

 运行结果:只执行了 func1 测试方法

说明:
同时设置了groups 和method元素,且同时为groups和method设置了include、exclude为 method 元素设置 include 属性,那么 groups 元素的设置不起作用,仅执行 method中需要 include 的方法

只为method元素设置exclude属性,那么根据groups 元素设置得出需要运行的测试方法然后在此基础上过滤掉 method 元素的 exclude 属性设置的方法。

4.4.例 4

默认的,TestNG 依据出现在 xm1 中的顺序执行测试。可以设置 preserve-order 属性为false 来改变这一行为。
修改xmltest.xml如下

 5.测试方法(Test method),测试类(Test class),测试组(Test groups)

5.1.测试方法(Test method)

默认的,被附注了@Test 的测试方法,其返回值被忽略,除非设置 allow-return-values值为 true。
<suite allow-return-values="true">
or
<test allow-return-values="true">

5.2.测试组(test groups)

groups 可以位于<test>、<suite>元素内。如果在<suite>标签下指定 groups,那么 group设置作用于该 suite 下的所有<test>。

5.2.1.例 1

修改 Test1.java 内容下

package unittests;
import org.testng.annotations.*
public class Test1 {@Test(groups={"functest","checkintest"})public void testMethod1(){System.out.println("test in func1");
@Test(groups={"functest","checkintest"})public void testMethod2(){System.out.println("test in func2");
@Test(groups={"functest"})public void testMethod3(){System.out.println("test in func3");

groups 元素放在<test>标签下

 

 groups 元素放在<suite>标签下

 5.2.2.例 2

使用正则表达式。
修改 Test1.java 内容下

package unittests;
import org.testng.annotations.*;
public class Test1 {
@Test(groups={"windows.functest"})public void testMethod1(){System.out.println("test in func1");
@Test(groups={"linux.functest"})public void testMethod2(){System.out.println("test in func2");
@Test(groups={"functest"})public void testMethod3(){System.out.println("test in func3");

修改 xmltest.xml如下

 运行结果:
只执行了 testMethod1

5.2.3.例 3

方法组(method groups)包含、排除单个测试方法修改 xmltest.xm1 内容如下:

 

 运行结果:testMethod1,testMethod2,testMethod3 都被执行了。

嵌套组
组可以包含组。
修改 Test1.java 如下

package unittests;
import org.testng.annotations.*;
public class Test1 {@Test(groups={"functest","checkintest"})public void testMethod1(){System.out.println("test in func1");
@Test(groups={"functest","checkintest"})public void testMethod2(){System.out.println("test in func2");
@Test(groups={"functest"})public void testMethod3(){System.out.println("test in func3");

修改xmltest.xm1

 

 运行结果:
3个测试方法都被执行了,为何?难道是 bug?不理解

排除组

 运行结果:
只执行了 testMethod3 测试方法

Partial 组
可在 class级别添加组,然后在方法级别添加组修改 Test1.java 内容如下

package unittests;
import org.testng.annotations.*.
@Test(groups="functest")
public class Test1 {
@Test(groups={"checkintest"})public void testMethod1(){System.out.println("test in func1");
@Test(groups={"checkintest"})public void testMethod2(){System.out.println("test in func2");
@Test
public void testMethod3(){System.out.println("test in func3");

xmltest.xml 内容如下

 运行结果:仅执行了 testMethod3

说明:TestNG类中所有被附注了@Test的测试方法,默认都归属在类级别定义的group

6. 参数
6.1.来自 testng.xml 的参数
6.1.1.例 1
修改 Test1.java

 修改 xmltest.xml

 

 

 参数还可以用于@Before/After 和@Factory

6.1.2.例 2可用@0ptional 来声明参数可选

修改 Test1.java

 说明:如果在 xm1 文件中找不到参数 arg_in_xm1,那么使用 0ptional 括号中的值作为参都
修改 testxml.xm1

 

 6.2.携带 DataProvider 的参数

6.2.1.例 1

修改 Test1.java

 

 注意:必须用 dataProvider 属性指明 Data Provider,属性值必须和@DataProvider(name="...")中 name 的值保持一致。另外,参数个数得保持一致。

修改 xmltest.xm1

 运行结果,输出如下数据:
rebort 36
2014 37
默认的,TestNG 会在当前测试类、其某个父类中査找 Data Provider。如果想把 dataprovider 放在其它的类中,那么被附注的方法必须是静态方法、或者携带无参构造器的类,并在 dataProviderClass 属性中指定该类。

6.2.2.例 2

在 unittests 包下新建一个 StaticProvider.java,代码内容如下

 

 

 运行结果,输出:
42

data provider 返回以下类型之一:
1)返回一个 object[][],数组第一维度的大小,代表了测试方法被调用的次数,第二维度则包含了和测试方法的参数类型匹配的任意对象数组。
2)返回一个迭代器 Iterator<0bject[]>。
eg:

@DataProvider(name ="test1")public Iterator<Object[]>createData(){return new MyIterator(DATA);

6.2.3.例 3

如果声明@DataProvider接收一个java.lang.reflect.Method作为第一个参数,TestNG将会把当前测试方法传递给该参数。
修改 Test1.java 内容如下

 

 如果想在不同的线程池中运行多个 data provider,需要从 xm1 文件中运行它们。

7. 依赖

7.1.使用注解的依赖

7.1.1.例 1
依赖方法
修改 Test1.java 内容如下

 

 运行结果,先后输出:test2
test1

说明:test1的运行依赖 test2 的运行注意:这种依赖,如果被依赖者运行失败,那么依赖者的不被执行,报告中被标记为 SKIPeg:修改 test2方法如下,再次运行

 

 7.1.2.例 2
利用@Test 的属性设置 alwaysRun=true 解决例2中被依赖者运行失败,不执行依赖者的
问题
修改 Test1.java

 

 7.1.3.例 3
依赖组

 

更多资料参考: Otaku – Cedric's blog

默认的,依赖方法按组分类,如果方法 test1 和方法 test2 都是同一个测试类的测试方法,test1依赖test2,那么当该类的多个实例被调用时,会先执行完所有test2,再执行test1.

7.1.4.例 4
新建 testNG 测试类

 

 

 

 

 运行结果

 

运行结果

 

 7.2.XML 中的依赖
可选的,可在 testng.xm1 文件中指定组依赖。使用<dependencies>标签来实现这个。修改 Test1.java 内容如下

 

 修改 xmltest.xml 内容如下

 注意:被依赖的多个组之间用空格分隔。

8. 工厂模式
动态的创建测试。
8.1.例1
假设,你想创建一个测试方法,使用不同的值,多次访问某个web站点的页面

 

 如果继续按这个思路继续,很快就会变得难以管理。所以考虑使用工厂模式新建 TestNG 类文件 WebTest.java

 新建 TestNG 类文件 WebTestFactory.java

 

 修改 xmltest.xml 如下

 运行结果:webTest 中的测试方法也被执行了
说明:附注@Factory 注解的方法中构造某测试类的实例,会自动调用该测试类中带有@Test注解的方法
当然,也可以在 java 程序中通过代码来运行新建 Test2.java,内容如下:

 factory 方法接收类似@Test 和@Before/After 的参数,且必须返回 0bject[]。返回的对象可以是任何类实例(注:对象所在类,不含@xxxx注解的方法不被执行)。

@Factory 也可以配合 data provider 使用,可用于构造器或者普通方法
8.2.例 2
修改 WebTestFactory.java 内容如下

 

 结果:运行了 30 次测试,即 testServer 被调用了 38 次。

9.类级别的注解

 

 

 运行结果:test1,test2都被执行了,也就是说类级别的@Test 注解会把该类的所有公有方法都当作测试方法,不管是否有注解。这种情况下,依旧可为单个类方法进行注解以添加其他属性,比如归属的组别

10.并行和超时
10.1. 并行套件
假如有多个套件需要运行。修改 xmltest.xml如下,复制xmltest.xml分别为xmltest2.xml,xmltest3.xml,修改套件名分别为suite2,suite3

 注意:要先 javac 对类文件进行编译,否则会报错,类似如下:ITestNG] [ERROR]
Cannot find class in classpath:unittests.Test1
运行套件

 且想让每个套件在单独的线程中运行,可添加-suitethreadpoolsize选项java org.testng.TestNG -suitethreadpoolsize 3 testng.xml testng2.xmltestng3.xml

10.2.并行test,class,method

11.返回失败测试
TestNG 会为每次运行套件失败的测试,在结果输出目录(如果为用 -d outpu_dir 指定目录则结果输出目录为在当前工作目录下的生成的 test-outputs)下创建一个名为testng-failed.xm1 的文件。可按如下方式运行失败的用例。src>java org.testng.TestNG test-output/testng-failed.xml

12.JUnit tests

 13.Annotation 转换略
14.Method Interceptors略
15. TestNG Listeners

16. Dependency injection

17.重写测试方法

18.更改套件、方法略

19.通过编程方式运行 TestNG

 

 

 

 假设想同运行如下假设的 xm1 一样,通过编程方式运行 TestNG 可如下操作

 

 

 20.测试结果

20.1. 成功,失败断言

20.1.1.例 1

修改 Test1.java 内容如下

 为了满足更复杂对象的断言,可导入 JUnit 的 Assert 类。20.1.2.例 2
修改 Test1.java 内容如下

 注意:使用 static import 是为了在使用断言方法,如 assertEquals 时,不用携带包名类名,如果不用 static,则需要这么使用:org.testng.AssertJUnit.assertEquals
20.2. Logging和结果
20.2.1.logging 监听器
例:

 

 

 运行结果

 说明:
1、-listener 选项指定使用的监听器
也可以在 xm1 中指定监听器修改 xmltest.xm1 内容如下

 

 运行结果:

 意:命令行运行,testng 自带的 assert 似乎不起作用,为何?
还可以在.java 文件中指定

 

 

注:如果同时在.java 代码中和 xm1中指定同一个监听器,则针对每个测试方法的测试结果,会运行两次 1og 方法
20.2.2.Logging Reporters略
20.2.3.JUnitReports略
20.2.4.Reporter API略
20.2.5.XML Reports略

参考连接:
http://testng.org/doc/documentation-main.htm1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C复习(主要复习)

指针和数组 指针数组是一个数组&#xff0c;数组的每个元素都是指针。它适用于需要存储多个指针的场景&#xff0c;如字符串数组。数组指针是一个指针&#xff0c;指向一个数组。它适用于需要传递整个数组给函数或处理多维数组的场景。 函数指针&#xff1a;函数指针的定义需要…

探索大语言模型(LLM):定义、发展、构建与应用

文章目录 引言大规模语言模型的基本概念大规模语言模型的发展历程1. 基础模型阶段&#xff08;2018年至2021年&#xff09;2. 能力探索阶段&#xff08;2019年至2022年&#xff09;3. 突破发展阶段&#xff08;以2022年11月ChatGPT的发布为起点&#xff09; 大规模语言模型的构…

5. k8s 之 pod原理与使用

Kubernetes Pod 原理详解 1. Pod 的部署方式 Pod 是 Kubernetes 的最小调度单元&#xff0c;其部署方式分为 声明式&#xff08;YAML&#xff09; 和 命令式&#xff08;kubectl&#xff09; 两种&#xff1a; (1) 声明式部署&#xff08;推荐&#xff09; 通过 YAML 文件定…

使用PyTorch实现目标检测边界框转换与可视化

一、引言 在目标检测任务中&#xff0c;边界框&#xff08;Bounding Box&#xff09;的坐标表示与转换是核心基础操作。本文将演示如何&#xff1a; 实现边界框的两种表示形式&#xff08;角点坐标 vs 中心坐标&#xff09;之间的转换 使用Matplotlib在图像上可视化边界框 验…

电影推荐及数据分析可视化系统(Python+Echarts+Mysql+Flask框架)

提升自己&#xff0c;掌握数据分析的能力&#xff0c;最快的方式就是实践&#xff01; 下面是对本项目的一些功能展示、介绍以及部分核心代码的展示,附项目系统展示的视频,制作不易如需完整代码后台私信我有偿获取! 一 、系统分析及功能介绍 1.系统分析 系统采用Python作为开发…

Android Jetpack Compose 高级开发核心技术

Android Compose 高级技术总结 1. 性能优化 1.1 状态管理优化 状态提升原则&#xff1a;将状态提升到共享的最近共同父组件derivedStateOf&#xff1a;当需要基于多个状态计算派生状态时使用 val scrollState rememberScrollState() val showButton by remember {derivedS…

Java堆结构深度解析:原理、实现与应用全指南

一、堆的核心概念体系 1. 堆的定义与性质 graph TBROOT((最大堆)) --> A[父节点 ≥ 子节点]ROOT --> B[完全二叉树结构]ROOT --> C[数组存储]ROOT --> D[快速获取极值] 2. 堆类型对比 类型特性典型应用场景最大堆父节点值 ≥ 子节点值获取前K大元素最小堆父节点…

SpringMVC学习(请求与响应。常见参数类型接收与响应。@RequestParam、@RequestBody的使用)(详细示例)

目录 一、请求与响应。(RequestMapping) &#xff08;1&#xff09;使用注解RequestMapping对业务模块区分。 StudentController。 TeacherController。 &#xff08;2&#xff09;Apifox请求与响应。 "/student/login"。 "/teacher/login"。 二、常见参数…

回溯算法+对称剪枝——从八皇后问题到数独问题(二)

引入&#xff1a; 本节我们进一步完善八皇后问题&#xff0c;学习剪枝、八皇后残局问题 进一步领会逻辑编程的概念&#xff0c;深入体会回溯算法&#xff0c;回顾上一节提到的启发搜索策略。 回顾&#xff1a; 八皇后问题&#xff1a;我们需要在一个空棋盘上放置 n 个皇后&a…

【玩泰山派】MISC(杂项)- 使用vscode远程连接泰山派进行开发

文章目录 前言流程1、安装、启动sshd2、配置一下允许root登录3、vscode中配置1、安装remote插件2、登录 **注意** 前言 有时候要在开发板中写一写代码&#xff0c;直接在终端中使用vim这种工具有时候也不是很方便。这里准备使用vscode去通过ssh远程连接泰山派去操作&#xff0…

【VsCode】设置文件自动保存

目录 一、前言 二、操作步骤 一、前言 VSCode中开启自动保存功能可以通过访问设置、修改settings.json文件、使用自动保存延迟功能来实现。这些方法能有效提升编程效率、避免数据丢失、实时同步更改。 二、操作步骤 在 Visual Studio Code (VS Code) 中设置自动保存功能非…

Adobe After Effects的插件--------Optical Flares之Options概述

Optical Flares插件的Options是对整个效果的组装和设置。点击该按钮会弹出一个组装室弹窗。 Options组装室就是对每个【镜头对象】进行加工处理,再将其组装在一起,拼凑成完整的光效。 接下来是我对组装室的探索: 面板 面板中有预览、堆栈、编辑和浏览按钮,其作用是调节窗…

如何用 esProc 补充数据库 SQL 的缺失能力

某些数据库 SQL 缺失必要的能力&#xff0c;通常要编写大段的代码&#xff0c;才能间接实现类似的功能&#xff0c;有些情况甚至要改用存储过程&#xff0c;连结构都变了。常见的比如&#xff1a;生成时间序列、保持分组子集、动态行列转换、自然序号、相对位置、按序列和集合生…

迷你世界脚本脚本常见问题

脚本常见问题 彼得兔 更新时间: 2024-05-22 17:54:44 在查阅开发者学院中的脚本API时&#xff0c;若有任何问题或建议&#xff0c;欢迎通过问卷进行反馈&#xff01;【点我填写问卷】 1.Block中的data在什么地方使用 data使用有具体需求,此处不建议开发者使用。开发者尽可能使…

四、Appium Inspector

一、介绍 Appium Inspector 是一个用于移动应用自动化测试的图形化工具&#xff0c;主要用于检查和交互应用的 UI 元素&#xff0c;帮助生成和调试自动化测试脚本。类似于浏览器的F12(开发者工具),Appium Inspector 的主要作用包括&#xff1a;‌ 1.‌检查 UI 元素‌ …

android11通过白名单卸载安装应用

目录 1.源码路径: 2.准备文件package.conf: 3.安装方法installPackagesLI 4.卸载方法deletePackageX 1.源码路径: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java public static final String WHITELIST_PATH="/data/misc/pa…

qt mapFrom返回的QPoint和event->pos()区别和globalPos区别

mousePressEvent 和 eventFilter 里 event.pos 不一样&#xff0c;一定要注意 eventFilter里event.pos 直接返回相对于label左上角的坐标&#xff0c;就不要再mapFrom mousePressEvent 里event.pos 返回是相对于窗口左上角的坐标&#xff0c;需要用mapFrom返回label左上角的…

Hadoop四 Hive语法

一 数据库操作 Hive数据库操作&#xff0c;与MySql有很多都是一致的 创建数据库 create database if not exists myhive; use myhive;查看数据库详细信息 desc database myhive;数据库本质上就是在HDFS之上的文件夹&#xff0c;是一个以.db结尾的目录&#xff0c;默认存…

前端VUE框架理论与应用(10)

1、记住全局注册的行为必须在根 Vue 实例 (通过 new Vue) 创建之前发生。 2、要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。 3、注意:在 Vue 实例内部,你可以通过 $router 访问路由实例。因此你可以调用 this.$router.push…

leetcode-单调栈26

关于单调栈的顺序总结&#xff1a; 寻找右边第一个比我大的&#xff1a;从左到右遍历&#xff0c;栈单调递减 寻找左边第一个比我小的&#xff1a;从左到右遍历&#xff0c;栈单调递增 寻找右边第一个比我小的&#xff1a;从右到左遍历&#xff0c;栈单调递增 寻找左边第一个比…