JUnit5的条件测试、嵌套测试、重复测试

news2024/12/26 20:58:24

条件测试

JUnit5支持条件注解,根据布尔值判断是否执行测试。

自定义条件

@EnabledIf@DisabledIf注解用来设置自定义条件,示例:

 
  1. @Test

  2. @EnabledIf("customCondition")

  3. void enabled() {

  4. // ...

  5. }

  6. @Test

  7. @DisabledIf("customCondition")

  8. void disabled() {

  9. // ...

  10. }

  11. boolean customCondition() {

  12. return true;

  13. }

其中customCondition()方法用来返回布尔值,它可以接受一个ExtensionContext类型的参数。如果定义在测试类外部,那么需要是static方法。

内置条件

JUnit5的org.junit.jupiter.api.condition包中内置了一些条件注解。

操作系统条件

@EnabledOnOsDisabledOnOs,示例:

  1. @Test

  2. @EnabledOnOs(MAC)

  3. void onlyOnMacOs() {

  4. // ...

  5. }

  6. @TestOnMac

  7. void testOnMac() {

  8. // ...

  9. }

  10. @Test

  11. @EnabledOnOs({ LINUX, MAC })

  12. void onLinuxOrMac() {

  13. // ...

  14. }

  15. @Test

  16. @DisabledOnOs(WINDOWS)

  17. void notOnWindows() {

  18. // ...

  19. }

  20. @Target(ElementType.METHOD)

  21. @Retention(RetentionPolicy.RUNTIME)

  22. @Test

  23. @EnabledOnOs(MAC)

  24. @interface TestOnMac {

  25. }

JRE条件

@EnabledOnJre@DisabledOnJre用于指定版本,@EnabledForJreRange@DisabledForJreRange用于指定版本范围,示例:

 
  1. @Test

  2. @EnabledOnJre(JAVA_8)

  3. void onlyOnJava8() {

  4. // ...

  5. }

  6. @Test

  7. @EnabledOnJre({ JAVA_9, JAVA_10 })

  8. void onJava9Or10() {

  9. // ...

  10. }

  11. @Test

  12. @EnabledForJreRange(min = JAVA_9, max = JAVA_11)

  13. void fromJava9to11() {

  14. // ...

  15. }

  16. @Test

  17. @EnabledForJreRange(min = JAVA_9)

  18. void fromJava9toCurrentJavaFeatureNumber() {

  19. // ...

  20. }

  21. @Test

  22. @EnabledForJreRange(max = JAVA_11)

  23. void fromJava8To11() {

  24. // ...

  25. }

  26. @Test

  27. @DisabledOnJre(JAVA_9)

  28. void notOnJava9() {

  29. // ...

  30. }

  31. @Test

  32. @DisabledForJreRange(min = JAVA_9, max = JAVA_11)

  33. void notFromJava9to11() {

  34. // ...

  35. }

  36. @Test

  37. @DisabledForJreRange(min = JAVA_9)

  38. void notFromJava9toCurrentJavaFeatureNumber() {

  39. // ...

  40. }

  41. @Test

  42. @DisabledForJreRange(max = JAVA_11)

  43. void notFromJava8to11() {

  44. // ...

  45. }

JVM系统属性条件

@EnabledIfSystemProperty@DisabledIfSystemProperty,示例:

 
  1. @Test

  2. @EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*")

  3. void onlyOn64BitArchitectures() {

  4. // ...

  5. }

  6. @Test

  7. @DisabledIfSystemProperty(named = "ci-server", matches = "true")

  8. void notOnCiServer() {

  9. // ...

  10. }

环境变量条件

@EnabledIfEnvironmentVariable@DisabledIfEnvironmentVariable,示例:

 
  1. @Test

  2. @EnabledIfEnvironmentVariable(named = "ENV", matches = "staging-server")

  3. void onlyOnStagingServer() {

  4. // ...

  5. }

  6. @Test

  7. @DisabledIfEnvironmentVariable(named = "ENV", matches = ".*development.*")

  8. void notOnDeveloperWorkstation() {

  9. // ...

  10. }

 
  1. 现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。

  2. 如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受

  3. 可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛

  4. 分享他们的经验,还会分享很多直播讲座和技术沙龙

  5. 可以免费学习!划重点!开源的!!!

  6. qq群号:110685036

嵌套测试

嵌套测试可以帮助我们对测试结构进行分层。借助于Java嵌套类的语法,JUnit5可以通过@Nested注解,实现嵌套测试,示例:

 
  1. import static org.junit.jupiter.api.Assertions.assertEquals;

  2. import static org.junit.jupiter.api.Assertions.assertFalse;

  3. import static org.junit.jupiter.api.Assertions.assertThrows;

  4. import static org.junit.jupiter.api.Assertions.assertTrue;

  5. import java.util.EmptyStackException;

  6. import java.util.Stack;

  7. import org.junit.jupiter.api.BeforeEach;

  8. import org.junit.jupiter.api.DisplayName;

  9. import org.junit.jupiter.api.Nested;

  10. import org.junit.jupiter.api.Test;

  11. @DisplayName("A stack")

  12. class TestingAStackDemo {

  13. Stack<Object> stack;

  14. @Test

  15. @DisplayName("is instantiated with new Stack()")

  16. void isInstantiatedWithNew() {

  17. new Stack<>();

  18. }

  19. @Nested

  20. @DisplayName("when new")

  21. class WhenNew {

  22. @BeforeEach

  23. void createNewStack() {

  24. stack = new Stack<>();

  25. }

  26. @Test

  27. @DisplayName("is empty")

  28. void isEmpty() {

  29. assertTrue(stack.isEmpty());

  30. }

  31. @Test

  32. @DisplayName("throws EmptyStackException when popped")

  33. void throwsExceptionWhenPopped() {

  34. assertThrows(EmptyStackException.class, stack::pop);

  35. }

  36. @Test

  37. @DisplayName("throws EmptyStackException when peeked")

  38. void throwsExceptionWhenPeeked() {

  39. assertThrows(EmptyStackException.class, stack::peek);

  40. }

  41. @Nested

  42. @DisplayName("after pushing an element")

  43. class AfterPushing {

  44. String anElement = "an element";

  45. @BeforeEach

  46. void pushAnElement() {

  47. stack.push(anElement);

  48. }

  49. @Test

  50. @DisplayName("it is no longer empty")

  51. void isNotEmpty() {

  52. assertFalse(stack.isEmpty());

  53. }

  54. @Test

  55. @DisplayName("returns the element when popped and is empty")

  56. void returnElementWhenPopped() {

  57. assertEquals(anElement, stack.pop());

  58. assertTrue(stack.isEmpty());

  59. }

  60. @Test

  61. @DisplayName("returns the element when peeked but remains not empty")

  62. void returnElementWhenPeeked() {

  63. assertEquals(anElement, stack.peek());

  64. assertFalse(stack.isEmpty());

  65. }

  66. }

  67. }

  68. }

外部测试类通过@BeforeEach向内部测试类传递变量。

执行后结果:

writing tests nested test ide

重复测试

@RepeatedTest注解能控制测试方法的重复执行次数,示例:

 
  1. import static org.junit.jupiter.api.Assertions.assertEquals;

  2. import java.util.logging.Logger;

  3. import org.junit.jupiter.api.BeforeEach;

  4. import org.junit.jupiter.api.DisplayName;

  5. import org.junit.jupiter.api.RepeatedTest;

  6. import org.junit.jupiter.api.RepetitionInfo;

  7. import org.junit.jupiter.api.TestInfo;

  8. class RepeatedTestsDemo {

  9. private Logger logger = // ...

  10. @BeforeEach

  11. void beforeEach(TestInfo testInfo, RepetitionInfo repetitionInfo) {

  12. int currentRepetition = repetitionInfo.getCurrentRepetition();

  13. int totalRepetitions = repetitionInfo.getTotalRepetitions();

  14. String methodName = testInfo.getTestMethod().get().getName();

  15. logger.info(String.format("About to execute repetition %d of %d for %s", //

  16. currentRepetition, totalRepetitions, methodName));

  17. }

  18. @RepeatedTest(10)

  19. void repeatedTest() {

  20. // ...

  21. }

  22. @RepeatedTest(5)

  23. void repeatedTestWithRepetitionInfo(RepetitionInfo repetitionInfo) {

  24. assertEquals(5, repetitionInfo.getTotalRepetitions());

  25. }

  26. @RepeatedTest(value = 1, name = "{displayName} {currentRepetition}/{totalRepetitions}")

  27. @DisplayName("Repeat!")

  28. void customDisplayName(TestInfo testInfo) {

  29. assertEquals("Repeat! 1/1", testInfo.getDisplayName());

  30. }

  31. @RepeatedTest(value = 1, name = RepeatedTest.LONG_DISPLAY_NAME)

  32. @DisplayName("Details...")

  33. void customDisplayNameWithLongPattern(TestInfo testInfo) {

  34. assertEquals("Details... :: repetition 1 of 1", testInfo.getDisplayName());

  35. }

  36. @RepeatedTest(value = 5, name = "Wiederholung {currentRepetition} von {totalRepetitions}")

  37. void repeatedTestInGerman() {

  38. // ...

  39. }

  40. }

其中name可以用来自定义重复测试的显示名字,{currentRepetition}{totalRepetitions}是当前次数和总共次数的变量。

执行结果:

 
  1. ├─ RepeatedTestsDemo ✔

  2. │ ├─ repeatedTest() ✔

  3. │ │ ├─ repetition 1 of 10 ✔

  4. │ │ ├─ repetition 2 of 10 ✔

  5. │ │ ├─ repetition 3 of 10 ✔

  6. │ │ ├─ repetition 4 of 10 ✔

  7. │ │ ├─ repetition 5 of 10 ✔

  8. │ │ ├─ repetition 6 of 10 ✔

  9. │ │ ├─ repetition 7 of 10 ✔

  10. │ │ ├─ repetition 8 of 10 ✔

  11. │ │ ├─ repetition 9 of 10 ✔

  12. │ │ └─ repetition 10 of 10 ✔

  13. │ ├─ repeatedTestWithRepetitionInfo(RepetitionInfo) ✔

  14. │ │ ├─ repetition 1 of 5 ✔

  15. │ │ ├─ repetition 2 of 5 ✔

  16. │ │ ├─ repetition 3 of 5 ✔

  17. │ │ ├─ repetition 4 of 5 ✔

  18. │ │ └─ repetition 5 of 5 ✔

  19. │ ├─ Repeat! ✔

  20. │ │ └─ Repeat! 1/1 ✔

  21. │ ├─ Details... ✔

  22. │ │ └─ Details... :: repetition 1 of 1 ✔

  23. │ └─ repeatedTestInGerman() ✔

  24. │ ├─ Wiederholung 1 von 5 ✔

  25. │ ├─ Wiederholung 2 von 5 ✔

  26. │ ├─ Wiederholung 3 von 5 ✔

  27. │ ├─ Wiederholung 4 von 5 ✔

  28. │ └─ Wiederholung 5 von 5 ✔

小结

本文分别对JUnit5的条件测试、嵌套测试、重复测试进行了介绍,它们可以使得测试更加灵活和富有层次。除了这些,JUnit5还支持另一个重要且常见的测试:参数化测试。

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

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

相关文章

动态规划课堂6-----回文串问题

目录 引言&#xff1a; 例题1&#xff1a;回文子串 例题2&#xff1a;回文串分割IV 例题3&#xff1a;分割回文串II 例题4&#xff1a;最长回文子序列 例题5&#xff1a;让字符串成为回文串的最小插入次数 引言&#xff1a; 回文字符串 是正着读和倒过来读一样的字符串。…

Sora后时代文生视频的探索

一、写在前面 按常理&#xff0c;这里应该长篇大论地介绍一下Sora发布对各行业各方面产生的影响。不过&#xff0c;这类文章已经很多了&#xff0c;我们今天主要聊聊那些已经成熟的解决方案、那些已经可以“信手拈来”的成果&#xff0c;并以此为基础&#xff0c;看看Sora发布…

PHP全新美化广告横幅在线制作源码

源码简介 可以做网站的引流不需要安装上传就可以使用&#xff0c;在第一版基础上做了二次开发更加好用 注意&#xff1a;主机和服务器均可架设搭建,如果使用宝塔架设点击访问的时候提示找不到文件路径的时候,记得点击网站目录把防跨站攻击先关闭,这样就可以正常访问了,这款是…

用pdf2docx将PDF转换成word文档

pdf2docx是一个Python模块&#xff0c;可以将PDF文件转换为docx格式的Word文档。 pdf2docx模块基于Python的pdfminer和python-docx库开发&#xff0c;可以在Windows、Linux和Mac系统上运行。它可以从PDF文件中提取文本和图片&#xff0c;并将其转换成可编辑的Word文档&#xf…

手撕算法-二叉搜索树与双向链表

牛客BM30。 描述&#xff1a;https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId295&tqId23253&ru/exam/oj&qru/ta/format-top101/question-ranking&sourceUrl%2Fexam%2Foj分析&#xff1a;二叉搜索树的中序遍历是递增序列。可以利用…

相聚武汉氢能展_2024武汉国际氢能源及燃料电池产业博览会

相聚武汉氢能展_2024武汉国际氢能源及燃料电池产业博览会 2024武汉国际氢能源及燃料电池产业博览会 2024 Wuhan International Hydrogen Energy and Fuel Cell Industry Expo 同期举办&#xff1a;2024世界汽车制造技术暨智能装备博览会 时间&#xff1a;2024.8.14-16 地…

【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目

本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C算法&#xff1a;滑动窗口总结 多重背包 LeetCode2902. 和带限制的子多重集合的数目 给你一个下标从 0 开始的非负整数数组 nums 和两个整数 l 和 r 。 请你…

拷贝他人maven仓库jar包到自己本地仓库,加载maven依然提示无法下载对应依赖

所遇问题&#xff1a; 拷贝他人maven仓库jar包到自己本地maven仓库repository下的对应依赖位置&#xff0c;重新加载idea的maven依然提示无法下载对应依赖。 解决办法&#xff1a; 在maven->repository找到对应报错依赖路径&#xff0c;删除xxx.repositories 和 xxx.lastU…

记录开发STM32遇到的卡死问题-串口

背景&#xff1a;以STM32作为主控&#xff0c;广州大彩显示屏显示&#xff0c;主控实时采集数据&#xff0c;串口波特率115200.设置收发频率为50Hz&#xff0c;即单片机每秒发送50帧数据&#xff0c;每秒接收50帧数据&#xff0c;每帧数据大概14字节。 问题&#xff1a;系统长…

Beamer模板——基于LaTeX制作学术PPT

Beamer模板——基于LaTeX制作学术PPT 介绍Beamer的基本使用安装和编译用于学术汇报的模板项目代码模板效果图 Beamer的高级特性动态效果分栏布局定理环境 介绍 在学术领域&#xff0c;演示文稿是展示和讨论研究成果的重要方式。传统的PowerPoint虽然方便&#xff0c;但在处理复…

C#中右键通过listview来控制datagridview字段值的是否显示、显示顺序,并存储到XML中。

最终显示效果&#xff0c;如下图所示&#xff1a; datagridview开始显示通过调用XML存储的字段值及顺序来显示&#xff0c;右键调出Tools来控制显示的顺序及是否显示&#xff0c;通过加号和减号进行调整顺序。 XML存储字段值及顺序 主要代码及事件&#xff1a; 获取datagridv…

SG5032VAN差分晶振X1G004261001100专用于5G通讯设备

差分晶体振荡器(DXO)是目前行业中公认高技术&#xff0c;高要求的一款晶体振荡器&#xff0c;是指输出差分信号使用2种相位彼此完全相反的信号,从而消除了共模噪声,并产生一个更高性能的系统。差分晶振一般为六脚贴片晶振&#xff0c;输出类型分为好几种,LVDS&#xff0c;LV-PE…

责任链模式(处理逻辑解耦)

前言 使用设计模式的主要目的之一就是解耦&#xff0c;让程序易于维护和更好扩展。 责任链则是将处理逻辑进行解耦&#xff0c;将独立的处理逻辑抽取到不同的处理者中&#xff0c;每个处理者都能够单独修改而不影响其他处理者。 使用时&#xff0c;依次调用链上的处理者处理…

前后端分离项目springsecurity实现用户登录认证快速使用

目录 1、引入依赖 2、创建类继承WebSecurityConfigurerAdapter &#xff08;1&#xff09;重写里面的configure(HttpSecurity http)方法 &#xff08;2&#xff09;重写AuthenticationManager authenticationManagerBean() &#xff08;3&#xff09;密码加密工具 3、继承…

P8597 [蓝桥杯 2013 省 B] 翻硬币 Python

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果…

【CNN轻量化】ParameterNet: Parameters Are All You Need 参数就是你所需要的

论文链接&#xff1a;http://arxiv.org/abs/2306.14525 代码链接&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones 一、摘要 现有的低FLOPs模型&#xff08;轻量化模型&#xff09;无法从大规模预训练中受益。本文旨在增加大规模视觉预训练模型中的参数数量…

UE4_官方动画内容示例1.3_ 运动混合空间(Locomotion BlendSpace)

如何使用运动&#xff08;Locomotion&#xff09;混合空间将Actor在不同方向上及不同速度的运动混合起来。&#xff08;例如&#xff0c;展示了一个混合了以不同速度向后、前、左和右走路/跑步动作的Actor&#xff09;。 一、相关知识点&#xff1a; 混合空间是允许根据多个输…

UniTask 异步任务

文章目录 前言一、UniTask是什么&#xff1f;二、使用步骤三、常用的UniTask API和示例1.编写异步方法2.处理异常3.延迟执行4.等待多个UniTask或者一个UniTas完成5.异步加载资源示例6.手动控制UniTask的完成状态7.UniTask.Lazy延迟任务的创建8.后台线程切换Unity主线程9.不要返…

java数据结构与算法刷题-----LeetCode406. 根据身高重建队列

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 从高到底排序 1. 从高到底排序 解题思路&#xff1a;时间复杂…

MCU技术的创新浪潮与产业变革

MCU技术的创新浪潮与产业变革 一、MCU技术的创新发展 MCU&#xff0c;即微控制器&#xff0c;作为现代电子设备的核心部件&#xff0c;一直在不断地创新与发展。随着科技的进步&#xff0c;MCU的性能得到了极大的提升&#xff0c;功能也越来越丰富。从8位到32位&#xff0c;再…