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还支持另一个重要且常见的测试:参数化测试。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【干货详解】全网最全白盒测试攻略大全

白盒测试&#xff08;White Box Testing&#xff09;又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结构和处理过程&#xff0c;而不测试软件产品的功能&#xff0c;用于纠正软件系统在描述、表示和规格上的错误&#xff0c;是进一步测…

Docker常用命令练习

文章目录 Docker常用命令练习1.docker 基础命令2.镜像命令3.保存镜像4.加载镜像5.容器命令6.环境变量7. --rm8. --networkhost Docker常用命令练习 1.docker 基础命令 安装docker yum install docker启动docker systemctl start docker关闭docker systemctl stop docker重…

外卖项目:用Redis实现缓存店铺营业状态、店铺菜品,优化商品浏览速度(debug一遍)

文章目录 一、设置店铺营业状态二、缓存菜品三、缓存套餐四、执行速度 一、设置店铺营业状态 针对店铺的营业状态&#xff0c;只涉及到一个字段&#xff0c;就没有设计表结构了&#xff0c;所有直接用redis存储来实现该功能。 约定&#xff1a;1表示营业 0表示打烊 先来看原先…

【Redis】Redis常见原理和数据结构

Redis 什么是redis redis是一款基于内存的k-v数据结构的非关系型数据库&#xff0c;读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 redis的数据类型 string&#xff1a;字符串 缓存对象&#xff0c;分布式ID&#xff0c;token&#xff0c;se…

手撕算法-二叉树的最大深度

描述&#xff1a;分析&#xff1a;求以节点root为根节点的树的最大深度。可以进行拆分&#xff1a;root为根节点的树的最大深度 max(左子树的最大深度, 右子树最大深度&#xff09;1 截止条件是节点为空&#xff0c;深度为0&#xff1b; 代码&#xff1a; public int maxDep…

CAN总线协议:过载帧与帧间隔

一. 简介 通过 CAN 总线传输数据是需要按照一定协议进行的。CAN 协议提供了 5 种帧格式来传输数据&#xff1a;数据帧、遥控帧、错误帧、过载帧和帧间隔。 前面几篇文章学习了CAN协议的的三种数据传输格式&#xff1a; CAN总线协议&#xff1a;数据帧-CSDN博客 CAN总线协议…

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

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

jmeter之常用函数-第六天

1.常见函数&#xff1a; _counter 计数器函数 TRUE(每个用户都有自己的计数器) FALSE(所有用户共用一个计数器) _Random 随机数函数 参数1:取值范围最小值(包含) 参数2:取值范围最大值(包含) _time 获取当前时间的函数 无参: 获取的是距离 1970/01/01 00:00:00 的毫秒值 参…

【计算机网络】计算机网络概述

文章目录 一、计算机网络的概念二、 计算机网络的功能1. 数据通信2. 资源共享3. 分布式处理4. 提高可靠性5. 负载均衡 补充&#xff1a; 计算机的发展阶段小结三、计算机网络的组成1. 组成部分2. 工作方式3. 功能组成 四、 计算机网络的分类1. 按分布范围2. 按使用者3. 按交换技…

代码随想录day24(2)二叉树:合并二叉树(leetcode617)

题目要求&#xff1a;将两个二叉树合并&#xff0c;要求是将同位置处的两个节点值相加&#xff0c;如果一个为空那就将另一个二叉树的值覆盖。 思路&#xff1a;如果使用迭代法&#xff0c;就是通过层序遍历&#xff0c;通过队列进行判断进行相加。如果使用递归法&#xff0c;…

【史上最全万字mysql进阶语法】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;书生♡&#xff0c;今天主要和大家分享一下mysql的进阶语法,数据库的分组/分页/排序/子查询以及详细案例&#xff0c;希望对大家有所帮助。 &#x1f49e;&#x1f49e;前路漫漫&#xff0c;希望大家坚持下去&am…

获取cookie

在Servlet9里设置cookie 在Servlet10里进行获取 访问Servlet9.do&#xff0c;再访问Servlet10.do

没有项目管理经验,可以参加PMP考试?

PMP考试的申请者需要具备项目管理经验&#xff0c;所需的项目管理经验小时数指的是与项目相关的经验&#xff0c;比如参与项目研发、测试、交付、运维、技术支持、售前等。项目经验是一个广义概念&#xff0c;国际上认为几乎所有工作都可以视为项目。 PMP报考条件&#xff1a; …

P2036 [COCI2008-2009 #2] PERKET

如果这是最后一页&#xff0c;在你离开之前&#xff0c;能否让我把故事重写 题目链接&#xff1a;P2036 [COCI2008-2009 #2] PERKET - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 解题思路&#xff1a; dfs模板题&#xff0c;枚举每种调料取和不取&#xff0c;至少选一种调…

【JavaScript】JavaScript 程序流程控制 ② ( 循环流程控制 | 循环要素 - 循环体 / 循环终止条件 | for 循环语法结构 )

文章目录 一、JavaScript 程序流程控制 - 循环流程控制1、循环流程控制2、循环要素 - 循环体 / 循环终止条件3、for 循环语法结构 - 循环控制变量 / 循环终止条件 / 操作表达式4、for 循环 完整代码示例 一、JavaScript 程序流程控制 - 循环流程控制 1、循环流程控制 在 程序开…

数据容器-tuple-Python

师从黑马程序员 列表可以修改&#xff0c;元祖不可以修改 元组的定义和使用 元组的元素类型不受限 #定义元组 t1(1,"Hello",True) t2() t3tuple() print(f"t1的类型是:{type(t1)},内容是:{t1}") print(f"t2的类型是:{type(t2)},内容是:{t2}")…

Macbook m1安装docker详细教程

下载安装包 进入官网 https://www.docker.com/ 下滑找到下载位置 下滑找到Mac对应安装包 等待下载完成即可。 安装 双击打开下载的安装包 将Docker拖到Applications中 安装完成后&#xff0c;找到安装的Docker 双击打开 点击accept同意 进入下面&#xff1a; 点fini…

​selenium+python做web端自动化测试框架与实例详解教程

最近受到万点暴击&#xff0c;由于公司业务出现问题&#xff0c;工作任务没那么繁重&#xff0c;有时间摸索seleniumpython自动化测试&#xff0c;结合网上查到的资料自己编写出适合web自动化测试的框架&#xff0c;由于本人也是刚刚开始学习python&#xff0c;这套自动化框架目…

The service already exists!怎么解决,Windows怎么安装/卸载服务?

问题描述 有时候,我们在Windows系统上安装服务时会遇到报错,The service already exists! 问题分析 这个报错说明此服务已经存在了,所以我们不能再次安装,但有时候我们明明是第一次安装,为什么也会报这个错误呢? 在Windows上注册服务通常需要使用命令行工具或者特定的…

BOM

是浏览器对象 目录 是浏览器对象 BOM概述&#xff1a; Windows常见的对象事件&#xff1a; 窗口加载事件&#xff1a; 传统方式&#xff1a; 新的加载方式&#xff1a; 回调函数&#xff1a; 调整窗口大小事件&#xff1a; 定时器setTimeout&#xff1a; 定时器setInt…