当前位置: 首页 > news >正文

TestNG和Junit5测试框架梳理

一、testNG

1. testNG优势

注解驱动: TestNG 使用注解来标识测试方法、测试类和配置方法,使得测试更具可读性。
并行执行: TestNG 支持多线程并行执行测试,可以加速测试套件的执行。
丰富的配置: 可以通过 XML 配置文件来定义测试套件的执行顺序、依赖关系等。
分组测试: 可以将测试方法分组,实现对特定测试分组的执行。
参数化测试: 可以使用 @Parameters 和@ DataProvider注解实现参数化测试
依赖管理: 可以通过 dependsOnMethods 或 dependsOnGroups 设置测试方法之间的依赖关系。
断言灵活: TestNG 提供了丰富的断言方法,用于验证测试结果。

2. testNG常用注解

@Test:用于标识测试方法,执行单元测试。
@BeforeSuite:在测试套件之前执行。
@AfterSuite:在测试套件之后执行。
@BeforeTest:在测试类之前执行。
@AfterTest:在测试类之后执行。
@BeforeClass:在测试类中的所有测试方法之前执行。
@AfterClass:在测试类中的所有测试方法之后执行。
@BeforeMethod:在每个测试方法之前执行。
@AfterMethod:在每个测试方法之后执行。
@DataProvider:用于提供测试数据。
@Parameters:用于参数化测试。
@dependsOnMethods:设置测试方法的依赖关系。
package AI.Test.testNG;import org.testng.annotations.*;public class TestNGCheck {@BeforeSuitepublic void beforeSuite(){System.out.println("beforeSuite");}@BeforeTestpublic void beforeTest() {System.out.println("Before Test");}@BeforeClasspublic void beforeClass() {System.out.println("Before Class");}@BeforeMethodpublic void beforeMethod() {System.out.println("Before Method");}@Test(groups="Performance")public void testMethod1() {System.out.println("Test Method 1");}@AfterMethodpublic void afterMethod() {System.out.println("After Method");}@AfterClasspublic void afterClass() {System.out.println("After Class");}@AfterTestpublic void afterTest() {System.out.println("After Test");}@AfterSuitepublic void afterSuite() {System.out.println("After Suite");}}

3. testNG中@Test有哪些参数

1. 常用的:
groups: 用于将测试方法分组,可以在 XML 配置中选择性地执行指定组的测试。
timeOut: 指定方法的超时时间,单位为毫秒。
alwaysRun: 如果设置为 true,则无论依赖的方法是否失败,当前方法都会执行。
dependsOnMethods: 指定测试方法的依赖关系,被依赖的方法会在当前方法之前执行。
enabled: 控制测试方法是否启用,设置为 false 则禁用该方法。
description: 提供关于测试方法的简要描述。
invocationCount: 指定测试方法被调用的次数。2. 数据驱动,需要结合@DataProvider注解对应获取参数的方法:
dataProvider: 指定使用哪个数据提供者来提供测试数据。
dataProviderClass: 指定数据提供者所在的类。3.并发:
invocationCount: 指定测试方法被调用的次数。
threadPoolSize: 指定线程池的大小,用于并行执行测试方法。
dataProviderThreadCount: 指定数据提供者线程的数量。

举例:

    @Test(groups="Performance")public void testMethod1() {System.out.println("Test Method 1");}@Test(priority=1)public void testMethod2() {System.out.println("Test Method 2");}@Test(dependsOnMethods = "testMethod4", alwaysRun = false)public void testMethod3(){System.out.println("Test Method 3");}@Test(timeOut = 3000)public void testMethod4() throws InterruptedException {Thread.sleep(4000);System.out.println("Test Method 4");}@Test(enabled = false, description = "用于测试enable注解")public void testMethod5() {System.out.println("Test Method 5");}

4. 在 TestNG 中实现参数化测试

以Yaml文件为例

创建一个Yaml文件testdata.yaml

testdata:- parameters: [2, 3, 5]- parameters: [10, 20, 30]

获取测试数据及使用

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.yaml.snakeyaml.Yaml;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class ParameterizedTest {@DataProvider(name = "testData")public Object[][] getYamlData() {List<Object[]> testData = new ArrayList<>();Yaml yaml = new Yaml();InputStream inputStream = getClass().getClassLoader().getResourceAsStream("testdata.yaml");Map<String, List<List<Integer>>> dataMap = yaml.load(inputStream);List<List<Integer>> parametersList = dataMap.get("testdata");for (List<Integer> parameters : parametersList) {testData.add(parameters.toArray());}return testData.toArray(new Object[testData.size()][]);}@Test(dataProvider = "testData")public void testParameterized(int param1, int param2, int param3) {System.out.println("Test with parameters: " + param1 + ", " + param2 + ", " + param3);// 执行测试逻辑,使用参数化数据进行测试}
}

5. 执行顺序

TestNG 默认情况下会按照测试方法的名称升序执行。
可以通过设置 priority 属性来指定执行顺序。
也可以使用dependsOnMethods

6. testNG断言

assertEquals(expected, actual):
验证两个值是否相等。如果不相等,会抛出 AssertionError。assertNotEquals(expected, actual):
验证两个值是否不相等。如果相等,会抛出 AssertionError。assertTrue(condition):
验证给定的条件是否为真。如果条件为假,会抛出 AssertionError。assertFalse(condition):
验证给定的条件是否为假。如果条件为真,会抛出 AssertionError。assertNull(object):
验证给定的对象是否为 null。如果对象不为 null,会抛出 AssertionError。assertNotNull(object):
验证给定的对象是否不为 null。如果对象为 null,会抛出 AssertionError。assertSame(expected, actual):
验证两个引用是否指向同一个对象。如果不指向同一个对象,会抛出 AssertionError。assertNotSame(expected, actual):
验证两个引用是否指向不同的对象。如果指向同一个对象,会抛出 AssertionError。

二、Junit5

1. junit5的优势

现代化的设计: JUnit 5 的架构更加模块化和现代化,采用了模块化体系结构,使得集成和扩展更加容易。它引入了 Jupiter(新的测试引擎)和 Vintage(支持 JUnit 4)两个模块,具有更好的灵活性。Lambda 表达式支持: JUnit 5 充分利用了 Java 8 的 Lambda 表达式特性,使测试代码更加简洁。TestNG 也支持 Lambda 表达式,但 JUnit 5 的设计更加贴合现代 Java 特性。参数化测试: JUnit 5 提供了内置的参数化测试功能,使用 @ParameterizedTest 注解,可以轻松地对测试方法使用不同的参数运行。动态测试: JUnit 5 引入了动态测试,允许在运行时生成和执行测试。使用 @TestFactory 注解,可以动态生成测试方法,以适应更加灵活的测试需求。扩展机制: JUnit 5 的扩展机制更加强大和灵活,使用 @ExtendWith 注解,可以轻松应用自定义扩展,甚至可以自定义扩展来修改测试运行时的行为。条件测试: JUnit 5 允许根据条件决定是否执行测试方法,使用 @EnabledOnOs、@DisabledIf 等注解,可以根据操作系统、环境变量等条件来控制测试执行。并行执行: TestNG 在并行执行方面有很强的功能,但 JUnit 5 也在逐步增强并行执行的支持,对于简单的并行需求,JUnit 5 也可以胜任。灵活性: JUnit 5 允许更多的自定义配置,使得测试执行的控制更加灵活,可以根据不同的项目需求进行调整。

2. 常用注解

@Test: 用于标记测试方法。@DisplayName: 为测试方法或测试类指定一个可读的名称。@BeforeEach: 在每个测试方法之前执行的方法。@AfterEach: 在每个测试方法之后执行的方法。@BeforeAll: 在所有测试方法之前执行的方法,必须是静态方法。@AfterAll: 在所有测试方法之后执行的方法,必须是静态方法。@Disabled: 标记测试方法或测试类为禁用状态。@ParameterizedTest: 用于参数化测试的注解。@RepeatedTest: 用于指定重复执行测试方法的次数。@Timeout: 用于设置测试方法执行的最大时间。时间是s@Tag: 为测试方法添加标签,用于分组和过滤测试。@Nested: 用于嵌套测试类。@TestFactory: 用于动态测试,返回动态生成的测试方法。
package AI.Test.testNG;import org.junit.jupiter.api.*;public class Junit5TestCheck {@BeforeAllstatic void beforeAll() throws InterruptedException {System.out.println("Before All");Thread.sleep(3000);}@BeforeEachvoid beforeEach(){System.out.println("BeforeEach");}@Test@DisplayName("Junit5TestCheck test1")void test1(){System.out.println("test1");}@Test@RepeatedTest(2)@DisplayName("Junit5TestCheck test2")void test2(){System.out.println("test2");}@Test@Disabled@DisplayName("Junit5TestCheck test3")void test3(){System.out.println("test3");}@Test@Timeout(3)void test4() throws InterruptedException {Thread.sleep(4);System.out.println("test4");}@AfterEachvoid afterEach(){System.out.println("AfterEach");}@AfterAllstatic void afterAll(){System.out.println("After All");}}

3. TestFactory使用示例

TestFactory其实就是参数化执行同一条用例

通常情况下,我们会使用 @ParameterizedTest 注解来参数化执行不同的测试用例,每次测试会使用不同的参数进行运行。而 @TestFactory 则是一种更为动态和灵活的方式,它允许你在运行时生成测试用例。

import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;import java.util.stream.Stream;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;public class DynamicTestExample {@TestFactoryStream<DynamicTest> dynamicTestFactory() {return Stream.of(dynamicTest("Test 1", () -> assertEquals(2, add(1, 1))),dynamicTest("Test 2", () -> assertEquals(4, add(2, 2))),dynamicTest("Test 3", () -> assertEquals(6, add(3, 3))));}int add(int a, int b) {return a + b;}
}

4. ParameterizedTest

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;public class ParameterizedTestExample {@ParameterizedTest@CsvSource({"1, 2, 3", "0, 0, 0", "-1, -2, -3"})void testAddition(int a, int b, int result) {assertEquals(result, add(a, b));}int add(int a, int b) {return a + b;}
}

相关文章:

TestNG和Junit5测试框架梳理

一、testNG 1. testNG优势 注解驱动&#xff1a; TestNG 使用注解来标识测试方法、测试类和配置方法&#xff0c;使得测试更具可读性。 并行执行&#xff1a; TestNG 支持多线程并行执行测试&#xff0c;可以加速测试套件的执行。 丰富的配置&#xff1a; 可以通过 XML 配置文…...

算法练习Day46|139.单词拆分

LeetCode:139.单词拆分 139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 1.思路 字符串是否能被字符串列表中的元素拼接出来&#xff0c;显然是一个背包问题&#xff0c;而且需要排列。 将字典转换为HashSet,利用.contains()方法判断是否存在元素与背包中的子串相同…...

Maven工程的安装配置及搭建(集成eclipse完成案例,保姆级教学)

目录 一.下载及安装及环境配置 1.下载及安装 2.环境变量的配置 3.检测是否安装成功 4.配置Maven 1.更换本地仓库 2. 配置镜像 二.集成eclipse完成案例 1.eclipse前期配置Maven 2.创建Maven工程 一.下载及安装及环境配置 1.下载及安装 下载地址&#xff1a;Maven – Down…...

82 | Python可视化篇 —— Plotly数据可视化

文章目录 什么是 Plotly安装 Plotly创建散点图创建线图创建条形图创建饼图创建热力图3D图(3D Plot)直方图(Histogram)3D表面图(3D Surface Plot)箱线图(Box Plot)散点地图(Scatter Map)量级地图(Choropleth Map)在网页中嵌入 Plotly 图表总结什么是 Plotly Plotly…...

Golang 包详解以及go mod

Golang 中包的介绍和定义 包(package)是多个 Go 源码的集合,是一种高级的代码复用方案,Go 语言为我们提供了 很多内置包,如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等。 Golang 中的包可以分为三种:1、系统内置包 2、自定义包 3、第三方包…...

中级课程-SSRF(CSRF进阶)

文章目录 成因危害挖掘 成因 危害 挖掘...

C++命名空间

目录 格式 使用 命名空间的嵌套 使用 using声明 命名空间里面包含了逻辑结构上相互关联的一组类、函数、模板等。命名空间像是一个容器&#xff0c;把某些在逻辑结构上相关的 “ 对象 ” 放在一起并与外界区分。特别的&#xff0c;命名空间里的变量名或类名可以和命名空间外…...

阿里云服务器搭建Magento电子商务网站图文教程

本文阿里云百科分享使用阿里云服务器手动搭建Magento电子商务网站全流程&#xff0c;Magento是一款开源电商网站框架&#xff0c;其丰富的模块化架构体系及拓展功能可为大中型站点提供解决方案。Magento使用PHP开发&#xff0c;支持版本范围从PHP 5.6到PHP 7.1&#xff0c;并使…...

Docker安装 Kibana

目录 前言安装Kibana步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2&#xff1a;拉取 kibana 镜像拉取镜像查看已拉取的镜像 步骤3&#xff1a;创建容器创建容器方式1&#xff1a;快速创建容器 步骤…...

数字图像处理 --- 相机的内参与外参(CV学习笔记)

Pinhole Camera Model&#xff08;针孔相机模型&#xff09; 针孔相机是一种没有镜头、只有一个小光圈的简单相机。 光线穿过光圈并在相机的另一侧呈现倒立的图像。为了建模方便&#xff0c;我们可以把物理成像平面(image plane)上的图像移到实际场景(3D object)和焦点(focal p…...

基于新浪微博海量用户行为数据、博文数据数据分析:包括综合指数、移动指数、PC指数三个指数

基于新浪微博海量用户行为数据、博文数据数据分析&#xff1a;包括综合指数、移动指数、PC指数三个指数 项目介绍 微指数是基于海量用户行为数据、博文数据&#xff0c;采用科学计算方法统计得出的反映不同事件领域发展状况的指数产品。微指数对于收录的关键词&#xff0c;在指…...

金融反欺诈的应用实践

“根据980起全球重大金融欺诈事件分析&#xff0c;60%的欺诈发生在移动端&#xff0c;同比增长170%。“&#xff0c;在香港近日举办的金融科技沙龙上&#xff0c;顶象金融业务安全专家史博表示&#xff0c;金融业已成为不法分子重要的攻击对象。 本届金融科技沙龙由Databricks…...

Win10启动Jmeter报错提示jmeter.log拒绝访问问题

jmeter版本&#xff1a;5.4.1 查看版本 在dos命令窗口中进入jmeter安装目录下的bin目录中&#xff1a;执行jmeter - v命令 我启动的方式是&#xff1a;进入jmeter安装目录下的bin目录中双击jmeter.bat启动的。结果报错&#xff0c;但是不影响使用。 报错日志如下&#xff1a; …...

Vue中使用Tailwind css

1.什么是Tailwind 就是一个CSS框架&#xff0c;和你知道的bootstrap&#xff0c;element ui&#xff0c;Antd&#xff0c;bulma。一样。将一些css样式封装好&#xff0c;用来加速我们开发的一个工具。 Tailwind解释 tailwind css 中文文档 2.Vue使用Tailwind配置 1. 新建vu…...

承接各种设计

小弟985研究生毕业&#xff0c;目前攻读读博士&#xff0c;可做各种设计&#xff0c;包括但不限于Matlab 电力电子/电气工程&#xff0c;matlab/simulink 电气专业仿真MATLAB 电气工程专业&#xff0c;matlab建模 电力电子&#xff0c;电气工程&#xff0c;电力系统&#xff0c…...

HTTP请求性能分析 - 简单

使用随手可得的工具&#xff0c;尽量少的前置要求&#xff0c;来完成任务。 0. 目录 1. 前言2. 分析工具2.1 基于Chrome DevTools 的Timing2.1.1 关于Network标签页下的Timing部分2.1.2 一些注意项 2.2 基于Curl 命令 3. 剩下的工作 1. 前言 对于业务开发选手而言&#xff0c;…...

腾讯云标准型CVM云服务器详细介绍

腾讯云CVM服务器标准型实例的各项性能参数平衡&#xff0c;标准型云服务器适用于大多数常规业务&#xff0c;例如&#xff1a;web网站及中间件等&#xff0c;常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格&#xff0c;腾讯云服务器网来详细说下云服务器CVM标准…...

基于DEM tif影像的插值平滑和tif纹理贴图构建方法

准备数据是一个10米分辨率的Tif影像&#xff0c;直接用于生成DEM会十分的不平滑。如下图所示&#xff0c;平滑前后的对比效果图差异&#xff1a; 基于ArcGIS的DEM平滑插值 等值线生成&#xff08;指定加密间距&#xff09; 平滑线&#xff08;指定平滑容差平滑等高线&#xff0…...

Redis_五种数据类型及操作命令

5.redis常用的五种数据类型 5.1 Redis String字符串 5.1.1 简介 String类型在redis中最常见的一种类型string类型是二制安全的&#xff0c;可以存放字符串、数值、json、图像数据value存储最大数据量是512M 5.1.2 常用命令 set < key>< value>&#xff1a;添加…...

Mac如何打开隐藏文件中Redis的配置文件redis.conf

Redis下载(通过⬇️博客下载的Redis默认路径为&#xff1a;/usr/local/etc) Redis下载 1.打开终端进入/usr文件夹 cd /usr 2.打开/local/文件夹 open local 3.找到redis.conf并打开,即可修改配置信息...

3分钟永久激活Windows和Office:KMS_VL_ALL_AIO智能脚本终极指南

3分钟永久激活Windows和Office&#xff1a;KMS_VL_ALL_AIO智能脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活弹窗烦恼&#xff1f;Office突然变成只读模式让你束…...

ssm校园失物招领信息系统小程序(文档+源码)_kaic

第五章 系统实现 5.1用户端功能模块 用户登录&#xff0c;用户通过输入用户名和密码&#xff0c;选择角色并点击登录进行系统登录操作&#xff0c;如图5-1所示。 图5-1用户登录界面图 用户注册&#xff0c;通过填写用户名、密码、姓名、性别、手机、邮箱等信息&#xff0c;输…...

介绍玻璃线纹尺

玻璃线纹尺&#xff08;标准玻璃尺&#xff09;不是用来直接量零件的“普通尺子”&#xff0c;而是精密仪器和机床的“标尺”。它的核心作用是校准&#xff08;检定仪器精度&#xff09;和标定&#xff08;设定系统比例&#xff09;&#xff0c;通常需要配合显微镜或影像系统使…...

C语言结构体完全指南:从基础到底层内存布局

引言在C语言中&#xff0c;数组让我们能够存储一组相同类型的数据。但现实世界中的实体往往包含不同类型的信息——比如一个学生有姓名&#xff08;字符串&#xff09;、年龄&#xff08;整数&#xff09;、学号&#xff08;长整数&#xff09;、成绩&#xff08;浮点数&#x…...

告别瞎猜!用Python+SPOT算法,5分钟搞定流式数据异常检测(附避坑指南)

用Python实现流式数据异常检测&#xff1a;SPOT算法实战解析 在业务监控场景中&#xff0c;传统基于固定阈值的异常检测方法常常陷入两难&#xff1a;阈值设得太高会漏报关键异常&#xff0c;设得太低又会产生大量误报。服务器QPS突降50%但未触发阈值、交易量缓慢爬升却被误判为…...

别再只测电压了!用ACS712和STM32给你的Arduino项目加上电流监控(附完整代码)

从零构建高精度电流监测系统&#xff1a;ACS712与STM32的实战指南 在智能硬件开发中&#xff0c;电流监测往往是被忽视却至关重要的环节。无论是评估设备功耗、保护电路安全&#xff0c;还是优化能源效率&#xff0c;精确的电流数据都能为项目带来质的飞跃。本文将带你深入探索…...

CSS如何优化弹出菜单的淡入效果_通过CSS变量控制Opacity变化

应避免用 display: none 或 visibility: hidden 配合 opacity 实现淡入动画&#xff0c;而应保持 visibility: visible、仅用 opacity: 0 隐藏&#xff0c;并配合 transform 缓冲&#xff1b;优先使用 CSS property 定义可动画变量 --menu-opacity 控制透明度&#xff0c;绑定 …...

【flutter for open harmony】第三方库 Flutter 鸿蒙实战:get_it 依赖注入 + 模块化架构优化,项目秒变企业级✨

&#x1f680; Flutter 鸿蒙实战&#xff1a;get_it 依赖注入 模块化架构优化&#xff0c;项目秒变企业级✨ 欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net&#x1f44b; 前言 哈喽各位小伙伴&#xff01;我是持续深耕 Flutter 鸿蒙跨平台…...

从集合到点云:深入浅出图解Deep Sets的置换不变性到底在说什么

从集合到点云&#xff1a;深入浅出图解Deep Sets的置换不变性到底在说什么 想象一下&#xff0c;你面前有一堆散落的乐高积木&#xff0c;无论你怎么打乱它们的顺序&#xff0c;最终拼出来的城堡总是一样的。这就是置换不变性&#xff08;Permutation Invariance&#xff09;的…...

AI漫画翻译革命:零基础也能用的深度学习辅助翻译工具完整指南

AI漫画翻译革命&#xff1a;零基础也能用的深度学习辅助翻译工具完整指南 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearning 项目地址:…...