2. 动态测试


一、动态测试是什么?

动态测试(Dynamic Test)允许在运行时生成测试用例,而不是在编译时通过 @Test 静态定义。它通过 @TestFactory 注解标记的方法动态生成一组测试用例,适用于需要灵活生成测试场景的场景。

核心特点:
  • 运行时生成测试:测试用例在运行时动态创建。
  • 灵活性强:可根据外部数据、条件或复杂逻辑生成测试。
  • 独立执行:每个动态测试作为独立用例运行,失败不影响其他用例。

二、动态测试 vs 静态测试

特性静态测试(@Test动态测试(@TestFactory
定义时机编译时固定运行时动态生成
用例数量固定可动态变化
生命周期支持 @BeforeEach/@AfterEach不触发 @BeforeEach/@AfterEach
适用场景简单、固定的测试逻辑复杂数据驱动、条件组合测试

三、动态测试的核心组件

  1. @TestFactory
    标记一个方法为动态测试工厂,该方法返回 DynamicTest 的集合(如 StreamCollectionIterable)。

  2. DynamicTest
    表示单个动态测试用例,包含:

    • 名称:测试的显示名称。
    • 可执行体:测试逻辑(Lambda 或方法引用)。

四、使用场景

1. 数据驱动测试

从外部数据源(如 CSV、数据库)读取数据,动态生成测试用例。

2. 组合测试

生成多个参数组合的测试用例,覆盖不同输入组合。

3. 条件性测试

根据运行时环境或条件动态决定是否生成测试用例。

4. 动态错误处理

例如遍历一组操作,每个操作作为独立测试用例,即使部分失败也不影响其他用例。


五、使用示例

示例 1:基本动态测试
import org.junit.jupiter.api.*;import java.util.stream.Stream;class DynamicTestDemo {@TestFactoryStream<DynamicTest> dynamicTestsBasic() {return Stream.of(DynamicTest.dynamicTest("动态测试 1", () -> {Assertions.assertEquals(4, 2 + 2);}),DynamicTest.dynamicTest("动态测试 2", () -> {Assertions.assertTrue("Hello".startsWith("H"));}));}
}
示例 2:基于外部数据的动态测试(CSV 文件)

假设 test-data.csv 内容:

2,3,5
5,5,10

动态测试代码:

import org.junit.jupiter.api.*;
import java.nio.file.*;
import java.util.stream.*;class CsvDynamicTest {@TestFactoryStream<DynamicTest> dynamicTestsFromCsv() throws Exception {return Files.lines(Paths.get("src/test/resources/test-data.csv")).map(line -> line.split(",")).map(columns -> DynamicTest.dynamicTest("测试加法: " + columns[0] + "+" + columns[1],() -> {int a = Integer.parseInt(columns[0]);int b = Integer.parseInt(columns[1]);int expected = Integer.parseInt(columns[2]);Assertions.assertEquals(expected, a + b);}));}
}
示例 3:组合参数测试

生成多个参数的组合测试:

@TestFactory
Stream<DynamicTest> dynamicTestsWithParameters() {List<Integer> aList = List.of(1, 2, 3);List<Integer> bList = List.of(4, 5, 6);return aList.stream().flatMap(a -> bList.stream().map(b -> new int[]{a, b})).map(pair -> DynamicTest.dynamicTest("测试 " + pair[0] + " + " + pair[1],() -> Assertions.assertEquals(pair[0] + pair[1], pair[0] + pair[1])));
}
示例 4:条件性动态测试

根据条件决定是否生成测试:

@TestFactory
Stream<DynamicTest> conditionalDynamicTests() {boolean isProduction = checkEnvironment();Stream<DynamicTest> baseTests = Stream.of(DynamicTest.dynamicTest("基础测试", () -> Assertions.assertTrue(true)));if (isProduction) {Stream<DynamicTest> prodTests = Stream.of(DynamicTest.dynamicTest("生产环境测试", () -> Assertions.assertFalse(false)));return Stream.concat(baseTests, prodTests);}return baseTests;
}private boolean checkEnvironment() {return "prod".equals(System.getProperty("env"));
}

六、动态测试的注意事项

  1. 生命周期方法不触发
    动态测试不会执行 @BeforeEach@AfterEach,需手动管理资源。

  2. 返回值类型
    @TestFactory 方法必须返回 StreamCollectionIterable 类型的 DynamicTest

  3. 命名清晰
    动态测试的名称应明确描述测试内容,便于失败时快速定位。


七、动态测试 vs 参数化测试

特性动态测试参数化测试(@ParameterizedTest
灵活性高(可自由生成用例)中(依赖预定义的参数源)
生命周期@BeforeEach/@AfterEach支持生命周期方法
适用场景复杂逻辑生成用例固定参数组合测试

八、总结

动态测试在以下场景中尤为强大:

  • 需要从外部数据源动态生成测试。
  • 测试用例数量或参数组合在编译时未知。
  • 需要根据条件动态决定测试逻辑。

通过结合 @TestFactoryDynamicTest,可以极大提升测试的灵活性和覆盖率。建议在复杂数据驱动或条件组合测试时优先选择动态测试!

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

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

相关文章

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为&#xff1a;Word.docx&#xff1a;考生文件夹样式的复制样式的修改 样式的应用&#xff08;没有相似/超级多的情况下&#xff09;——替换 [ ]通配符&#x…

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外&#xff0c;还有一个小众的市场&#xff0c;那就是多媒体展厅场景&#xff0c;这个场景目前处于垄断地位的软件是HirenderS3&#xff0c;做的非常早而且非常全面&#xff0c;都是通用的需求&…

【零拷贝】

目录 一&#xff1a;了解IO基础概念 二&#xff1a;数据流动的层次结构 三&#xff1a;零拷贝 1.传统IO文件读写 2.mmap 零拷贝技术 3.sendFile 零拷贝技术 一&#xff1a;了解IO基础概念 理解CPU拷贝和DMA拷贝 ​ 我们知道&#xff0c;操作系统对于内存空间&…

全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)

目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式&#xff0c;由于跨域资源共享(cors)是浏览器的一种安全机制&#xff0c;它会阻止前端应用…

《Linux服务与安全管理》| 数据库服务器安装和配置

《Linux服务与安全管理》| 数据库服务器安装和配置 目录 《Linux服务与安全管理》| 数据库服务器安装和配置 任务一&#xff1a; 安装PostgreSQL数据库&#xff0c;设置远程登录&#xff0c;客户端可以成功登录并操作数据库。 任务二&#xff1a; 安装MySQL数据库&#xf…

Linux系统之whereis命令的基本使用

Linux系统之whereis命令的基本使用 一、whereis命令介绍二、whereis命令的使用帮助2.1 whereis命令的帮助信息2.2 whereis命令帮助解释 三、whereis命令的基本使用3.1 查找命令的位置3.2 仅查找二进制文件3.3 仅查找手册页3.4 输出实际使用的查找路径3.5 指定自定义搜索路径 四…

Autosar-以太网是怎么运行的?(Davinci配置部分)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 目录 1.Autosar ETH通讯软件架构 2.Ethernet MCAL配置 2.1配置对应Pin属性 2.2配置TXD引脚 2.3配…

【Block总结】CSAM,包含分割、关键点、切分等均适用!|即插即用

论文信息 标题: CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation 论文链接: https://arxiv.org/pdf/2311.04942 GitHub链接: https://github.com/aL3x-O-o-Hung/CSAM 创新点 CSAM&#xff08;跨切片注意力模块&#xff…

解决PyG安装中torch-sparse安装失败问题:详细指南

1 问题描述 最近在学习GNN&#xff0c;需要使用PyTorch Geometric&#xff08;PyG&#xff09;库。在安装PyG的过程中&#xff0c;遇到了torch-sparse安装失败的问题&#xff0c;错误提示为&#xff1a; ERROR: Failed building wheel for torch-sparse本文将详细记录问题的解…

鸟哥Linux私房菜笔记(三)

鸟哥Linux私房菜笔记&#xff08;三&#xff09; 该第三部分和第四部分主要为原书的第十一章&#xff08;正则表达式与文件格式化处理&#xff09;&#xff0c;第十二章学习shell脚本&#xff0c;第十六章&#xff08;进程管理与SElinux初探部分&#xff09;&#xff0c;第十七…

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理

【1】引言 前序学习进程中&#xff0c;对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像&#xff0c;每个像素点上的BGR值为三个整数&#xff0c;因为是三通道图像&#xff1b;对于灰度图像&#xff0c;各个像素上的BGR值是一个整数&#xff0c;因为这是单通…

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤&#xff1a; 第一步&#xff1a;发起请求到前端控制器(DispatcherServlet) 第二步&#xff1a;前端控制器请求HandlerMapping查找 Handler &#xff08;可以根据xml配置、注解进行查找&#xff09; 匹配条件包括…

小程序设计和开发:如何研究同类型小程序的优点和不足。

一、确定研究目标和范围 明确研究目的 在开始研究同类型小程序之前&#xff0c;首先需要明确研究的目的。是为了改进自己的小程序设计和开发&#xff0c;还是为了了解市场趋势和用户需求&#xff1f;不同的研究目的会影响研究的方法和重点。例如&#xff0c;如果研究目的是为了…

Vue3.0实战:大数据平台可视化(附完整项目源码)

文章目录 创建vue3.0项目项目初始化项目分辨率响应式设置项目顶部信息条创建页面主体创建全局引入echarts和axios后台接口创建express销售总量图实现完整项目下载项目任何问题都可在评论区,或者直接私信即可。 创建vue3.0项目 创建项目: vue create vueecharts选择第三项:…

Java自定义IO密集型和CPU密集型线程池

文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue&#xff08;实现 核心线程->最大线程数->队列&#xff09; 场景1&#xff1a;CPU密集型场景思路&…

【VM】VirtualBox安装ubuntu22.04虚拟机

阅读本文之前&#xff0c;请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点&#xff1a;https://developer.aliyun.com/mirror/ 找到如图所示位置&#xff0c;选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…

C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)

Made By 于子轩&#xff0c;2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件&#xff0c;或是使用Windows Script Host对象创建快捷方式&#xff0c;亦或是使用Shell32对象创建快捷方式&#xff0c;都对用户很不友好&#xff0c;今天小编为大家带来一种全新…

国产编辑器EverEdit - 输出窗口

1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果&#xff0c;主要包括&#xff1a; 查找类&#xff1a;查找全部&#xff0c;筛选等待操作&#xff0c;可以把查找结果打印到输出窗口中&#xff1b; 程序类&#xff1a;在执行外部程序时(如&#xff1a;命令窗…

Vue-data数据

目录 一、Vue中的data数据是什么&#xff1f;二、data支持的数据类型有哪些&#xff1f; 一、Vue中的data数据是什么&#xff1f; Vue中用到的数据定义在data中。 二、data支持的数据类型有哪些&#xff1f; data中可以写复杂类型的数据&#xff0c;渲染复杂类型数据时只要遵…

02.03 递归运算

使用递归求出 1 1/3 -1/5 1/7 - 1/9 ... 1/n的值。 1>程序代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #inc…