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

条件测试

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.mzph.cn/news/758722.shtml

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

相关文章

Java并发基石ReentrantLock:深入解读其原理与实现

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在Java的并发编程库中&#xff0c;ReentrantLock是一种非常重要的同步工具&#xff0c;它提供了一种比内置synchronized关键字更加…

科研学习|研究方法——实验法

1.实验方法的渊源 今天我们说物理学、生物学是实验的科学&#xff0c;应该不会有人再持异议了&#xff0c;然而连物理学这样的学科在历史上也并非一开始就是实验科学。在2000多年以前的亚里士多德时代&#xff0c;众人都认为物理学是非实验性质的&#xff0c;物理学成为实验科学…

netty基础_12.用 Netty 自己实现简单的RPC

用 Netty 自己实现简单的RPC RPC 基本介绍我们的RPC 调用流程图己实现 Dubbo RPC&#xff08;基于 Netty&#xff09;需求说明设计说明代码封装的RPCNettyServerNettyServerHandlerNettyClientHandlerNettyClient 接口服务端(provider)HelloServiceImplServerBootstrap 客户端(…

第四百一十四回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容&#xff0c;本章回中将介绍自定义Action菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

【呼市经开区建设服务项目水、电能耗监测 数采案例】

实施方案 针对能耗采集中的水、电能源数据采集&#xff0c;因客观因素条件&#xff0c;数据采集方面存在较大难度。大多数国网电表485接口由于封签限制&#xff0c;不能实施采集&#xff0c;不让拆机接线&#xff0c;采集实施存在困难。水量能耗采集&#xff0c;存在类似问题&a…

腾讯云GPU服务器深度计算怎么收费?1小时、一个月和一年报价

腾讯云GPU服务器怎么收费&#xff1f;GPU服务器1小时多少钱&#xff1f;一个月收费价格表和一年费用标准&#xff0c;腾讯云百科txybk.com分享腾讯云GPU服务器GPU计算型GN10Xp、GPU服务器GN7、GPU渲染型 GN7vw等GPU实例费用价格&#xff0c;以及NVIDIA Tesla T4 GPU卡和V100详细…

Jmeter Ultimate Thread Group 和 Stepping Thread Group

线程组&#xff1a;使用复杂场景的性能测试 有时候我们做性能测试时&#xff0c;只依靠自带的线程组&#xff0c;显示满足不了性能测试中比较复杂的场景&#xff0c;下面这两种线程组可以帮助你很好的完成复杂的场景 第一种&#xff1a;Stepping Thread Group 在取样器错误后…

Socket类

2.2 Socket类 Socket 类&#xff1a;该类实现客户端套接字&#xff0c;套接字指的是两台设备之间通讯的端点。 构造方法 public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null &#xff0c;则相当于指定地址为回送…

Appium —— 移动应用自动化测试开源工具!

Appium介绍 Appium是一个用于自动化移动应用程序的开源工具&#xff0c;它支持iOS和Android平台。通过Appium&#xff0c;开发人员可以使用各种编程语言&#xff08;如Java、Python、Ruby等&#xff09;编写测试脚本&#xff0c;以自动化测试移动应用程序的功能和用户界面。Ap…

基于springboot+vue的小区团购管理

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

如何在Windows系统使用VS Code制作游戏网页并实现无公网IP远程访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程&#xff0c;我们将通过VS Code实现远程开发MENJA小游戏&#xff0c;并通过cpolar内网穿透发布到公网&#xff0c;分…

《操作系统实践-基于Linux应用与内核编程》第10章--实验 Qt聊天程序

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容&#xff0c;所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者&#xff1a;房胜、李旭健、黄…

微信小程序调试、断点调试

1、wxml 查看对应的页面组件 2、console面板可以用来打印信息 3、sources 用来断点调试 4、network面板用来调试接口 5、storage面板 可以查看每个key对应的value内容&#xff0c;这些数据在用户使用小程序时被持久化保存在本地。

【mac M3】idea删除不用或者失效的jdk

【mac M3】idea删除不用或者失效的jdk 不用&#xff08;重复&#xff09;或者失效的jdk如下&#xff1a; 重复或者已失效的JDK版本出现在下拉列表中不仅影响美观&#xff0c;也影响效率&#xff0c;删除jdk的步骤如下&#xff1a; 步骤1.点击File 步骤2.选择Project Structure…

【C语言】文件操作揭秘:C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作揭秘&#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客&…

Java AOP 简单实例演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

WT32-ETH02 plus 串口转以太网开发,WT32-ETH01网关开发板升级款!

广受欢迎的WT32-ETH01网关开发板迎来了升级。 就是这款启明云端新推出的嵌入式串口转以太网开发板——WT32-ETH02 plus。应广大客户的需求&#xff0c;在WT32-ETH01的基础上增加了POE供电&#xff0c;可广泛应用于智能家居和网关等应用。开发板搭载2.4GHz Wi-Fi和蓝牙双模的SO…

一键部署灵境矩阵,属于自己的ai智能平台。

灵境矩阵 | 想象即现实 “灵境杯”智能体创意大赛&#xff0c;瓜分百万超级奖励 打造专属AI智能平台&#xff1a;一键部署灵境矩阵的无限可能 在数字化浪潮席卷全球的今天&#xff0c;人工智能技术已逐渐成为推动社会进步的关键力量。面对这一趋势&#xff0c;许多企业和个人…

永续合约多空双开“戴套”策略的逻辑是什么,胜率惊人的96%是怎么做到的,其实并没有想的那么复杂,会代码的都可以写出来

为什么叫多空双开“戴套”量化策略呢&#xff0c;因为这个策略的特点是永远有一个仓位是被套的&#xff0c;但是这个不影响我们盈利&#xff0c;具体怎么实现大家看下面这个图就明白是怎么回事了。 这个策略的逻辑很简单也容易理解&#xff0c;就是多空双开&#xff0c;盈利平仓…

FREERTOS空闲任务和低功耗

空闲任务 空闲任务是 FreeRTOS 必不可少的一个任务&#xff0c;其他 RTOS 类系统也有空闲任务&#xff0c;比如uC/OS。看名字就知道&#xff0c;空闲任务是处理器空闲的时候去运行的一个任务&#xff0c;当系统中没有其他就绪任务的时候空闲任务就会开始运行&#xff0c;空闲任…