Junit 高级-ApiHug准备-测试篇-011

news2024/12/23 10:26:51

     🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓

  1. GitHub - apihug/apihug.com: All abou the Apihug   
  2. apihug.com: 有爱,有温度,有质量,有信任
  3. ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace

涉及到 Junit5 一些深度不太常用的功能, 例子在:advancedopen in new window。

#顺序

JUnit 5 支持下面几种 MethodOrderer:

  1. MethodName – 按照函数名字的字母排序。
  2. DisplayName – 按照显示名词的字母排序。
  3. OrderAnnotation – 按照 @Order annotation 排序,同order 排序方式可能不一致(所以尽量order 是散列的, 未标注的排最后面。
  4. Random – 随机排序 种子值可以通过系统配置: junit.jupiter.execution.order.random.seed 来配置。
  5. Custom – 定制扩展的排序类。

MethodNameOrderedTestsopen in new window 例子:

#MethodName

@TestMethodOrder(MethodOrderer.MethodName.class)
public class MethodNameOrderedTests 
{
    @Test
    void testE() {
        assertTrue(true);
    }
}

#DisplayName


@TestMethodOrder(MethodOrderer.DisplayName.class)
public class DisplayNameOrderedTests
{
    @DisplayName("5")
    @Test
    void testE() {
        assertTrue(true);
    }
}

#OrderAnnotation


@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class OrderAnnotationTests {
  @Order(5)
  @Test
  void testE() {
    assertTrue(true);
  }
}

#Random

修改 junit-platform.properties

junit.jupiter.execution.order.random.seed=9999

这个测试类, 每次执行的结果顺序都讲不一样!


@TestMethodOrder(MethodOrderer.Random.class)
public class RandomOrderedTests {
  @Test
  void testE() {
    assertTrue(true);
  }
}

#Custom

比如一个实现按照接口是否被 Deprecated, 排到最后进行测试:


public class DeprecatedInEndTestOrder implements MethodOrderer {

  private Comparator<MethodDescriptor> comparator =
      Comparator.comparing(md -> md.getMethod().isAnnotationPresent(Deprecated.class));

  @Override
  public void orderMethods(MethodOrdererContext context) {

    context.getMethodDescriptors().sort(comparator);
  }
}

然后参考测试用例:


@TestMethodOrder(DeprecatedInEndTestOrder.class)
public class CustomOrderTests {
  @Test
  @Deprecated
  void testC() {
    assertTrue(true);
  }

  @Test
  void testA() {
    assertTrue(true);
  }
}

当然也有正对,测试类自己的排序,这里不再赘述, 参考样例代码。

默认配置: junit.jupiter.testclass.order.default = org.junit.jupiter.api.ClassOrderer$OrderAnnotation


@TestClassOrder(ClassOrderer.OrderAnnotation.class)
class OrderedTestClassesExample {

  @Nested
  @Order(1)
  class SetupTests {

    @Test
    void test1() {}
  }

  @Nested
  @Order(2)
  class AppFlowTests {

    @Test
    void test2() {}
  }
}

#Temp Dir

@TempDir 尚在实验功能open in new window 但是在一些场景下非常有用。

@TempDir 可以使用在方法参数, 类参数, 静态方法,可以用于构建 Fixture, 举个例子 测试目录open in new window:


@Test
void tempDirectoryTestOne(@TempDir Path tempDir) throws IOException {
    Path tempFile = tempDir.resolve("test.txt");

    List<String> lines = Arrays.asList("dearxue.com");

    Files.write(tempFile, Arrays.asList("dearxue.com"));

    Assertions.assertTrue(Files.exists(tempFile), "Temp File should have been created");
    Assertions.assertEquals(Files.readAllLines(tempFile), lines);
}

@TempDir 作为成员变量, 那么每个测试用例都会创建一个新的临时测试目录, 然后再删除参考 TempDirTest2


test1 dir:  C:\Users\dearxue\AppData\Local\Temp\junit3449074755074304313
test2 dir:  C:\Users\dearxue\AppData\Local\Temp\junit7411092462858685015

@TempDir 作为静态成员变量, 和成员变量不一样, 这里一个测试类中不同测试方法会共享一个目录。

#测试名称

在一些场景下你希望获取测试名词, 可以通过 TestInfo 上下文获得 gettestname 例子open in new window:


@Test
void givenNumbers_whenOddCheck_thenVerify(TestInfo testInfo) {
    System.out.println("displayName = " + testInfo.getDisplayName());
    int number = 5;
    assertTrue(oddCheck(number));
}

获得输出:

displayName = givenNumbers_whenOddCheck_thenVerify(TestInfo)

参数化场景可以通过 @BeforeEach 获得:

private TestInfo testInfo;

  @BeforeEach
  void init(TestInfo testInfo) {
    this.testInfo = testInfo;
  }

  private boolean oddCheck(int number) {
    return (number % 2 != 0);
  }

  @ParameterizedTest(name = "givenNumbers_whenOddCheck_thenVerify{0}")
  @ValueSource(ints = {1, 3, 5, -3, 15})
  void givenNumbers_whenOddCheck_thenVerify(int number) {
    System.out.println("displayName = " + testInfo.getDisplayName());
    assertTrue(oddCheck(number));
  }

输出为:


displayName = givenNumbers_whenOddCheck_thenVerify5
displayName = givenNumbers_whenOddCheck_thenVerify-3
displayName = givenNumbers_whenOddCheck_thenVerify3
displayName = givenNumbers_whenOddCheck_thenVerify1
displayName = givenNumbers_whenOddCheck_thenVerify15

#Test Instance

默认情况下, Junit 会为每个测试方法创建一个新的instance,这样保持状态的隔离:


class AdditionTest {

    private int sum = 1;

    @Test
    void addingTwoReturnsThree() {
        sum += 2;
        assertEquals(3, sum);
    }

    @Test
    void addingThreeReturnsFour() {
        sum += 3;
        assertEquals(4, sum);
    }
}

比如这个测试用例, 两个测试方法执行前, 新的事例被创建, sum 被初始化为1, 所以每个方法都能成立。

如果共享一个事例, 那么第二个方法会失败。

但是在一些情况下我们需要, 共享这些变量, 比如一些非常耗时的操作, 这个时候 TestInstance 派上用场了。

@TestInstance 两种模式一个是:LifeCycle.PER_METHOD (默认的), 另外一个是LifeCycle.PER_CLASS。

在 PER_CLASS 模式下, 我们可以看到下面例子的变量和方法都不是 static 但是能够照常运行。

@TestInstance(LifeCycle.PER_CLASS)
class TweetSerializerUnitTest {

    private String largeContent;

    @BeforeAll
    void setUpFixture() {
        // read the file
    }

#手动启动测试

你可以直接从 java 启动测试用例, 对整个junit 运行逐层debug,洞悉运行过程。

testRuntimeOnly("org.junit.platform:junit-platform-launcher") {
        because 'allows tests to run from IDEs that bundle older version of launcher'
}

添加依赖, 例子参考open in new window

public void runOne() {
    LauncherDiscoveryRequest request =
        LauncherDiscoveryRequestBuilder.request()
            .selectors(selectClass(FirstUnitTest.class))
            .build();
    Launcher launcher = LauncherFactory.create();
    TestPlan testPlan = launcher.discover(request);

    launcher.registerTestExecutionListeners(listener);
    launcher.execute(request);
  }

输出:


junit-5:RunJUnit5TestsFromJava.main()

Test run finished after 171 ms
[         6 containers found      ]
[         0 containers skipped    ]
[         6 containers started    ]
[         0 containers aborted    ]
[         6 containers successful ]
[         0 containers failed     ]
[        18 tests found           ]
[         0 tests skipped         ]
[        18 tests started         ]
[         0 tests aborted         ]
[        18 tests successful      ]
[         0 tests failed          ]

我们

api-hug-contact

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

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

相关文章

MYSQL之增删改查(下)

前言&#xff1a; 以下是MySQL最基本的增删改查语句&#xff0c;很多IT工作者都必须要会的命令&#xff0c;也 是IT行业面试最常考的知识点&#xff0c;由于是入门级基础命令&#xff0c;所有所有操作都建立在单表 上&#xff0c;未涉及多表操作。 4.3 高级查询 4.3.1 聚合函…

【python】使用python和selenium实现某平台自动化上传作品的全步骤

第一&#xff0c;我们需要下载python并安装 下载地址&#xff1a;https://www.python.org/downloads/release/python-3123/ 3.x版本的python自带pip工具&#xff0c;因此不需要额外下载。 ModuleNotFoundError: No module named seleniumpip用于下载python适用的各类模块&…

最小化横穿北达科他州的直排轮滑补水次数

最小化横穿北达科他州的直排轮滑补水次数 问题定义算法设计伪代码C代码示例策略的正确性和运行时间分析结论 问题定义 Gekko教授计划使用直排轮滑从明尼苏达州东部边境的大福克斯市出发&#xff0c;横穿北达科他州&#xff0c;抵达靠近蒙大拿州西部边境的威利斯顿市。他计划携…

24华中杯ABC题更新完成,B题将提供论文参考,AC题将在下午完成论文

以下内容&#xff0c;将在文章最后放置链接 2024华中杯A题12页思路数据可执行代码参考论文https://mbd.pub/o/bread/ZZ6am5dw 2024华中杯B题24页思路数据可执行代码参考论文https://mbd.pub/o/bread/ZZ6am5hp 2024华中杯C题10页思路数据可执行代码参考论文https://mbd.pub/o/br…

Nginx part2.1

目录 搭建目录网页 为网页设置用户登录 做一个文件目录网页&#xff0c;并进行登陆 示范 搭建目录网页 启动nginx&#xff1a; systemctl start nginx 开机自启动nginx&#xff1a; systemctl enable nginx 启动完服务后&#xff0c;查看自己的nginx的状态&#xff1a;sys…

volatility内存取证

记录一道volatility内存取证的题目&#xff0c;第一次遇到&#xff0c;现场把环境搞出来&#xff0c;现记录一些操作指令。 一、安装volatility3 1、新建一个kali虚拟机 新建的过程不再赘述。 2、下载volatility3 GitHub - volatilityfoundation/volatility3: Volatility …

基于Springboot的职称评审管理系统

基于SpringbootVue的获取源码 联系方式 &#x1f447;&#x1f3fb;的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 评审条件 论坛信息 系统公告 后台登录…

CTFshow-PWN-前置基础(pwn26-pwn31)

目录 1、pwn26 2、pwn27 3、pwn28 4、pwn29 5、pwn30 6、pwn31 1、pwn26 设置好 ASLR 保护参数值即可获得flag 首先我们需要知道什么是 ASLR&#xff1f; ASLR&#xff08;Address Space Layout Randomization&#xff09;是一种操作系统级别的安全功能&#xff0c;它通…

【VSLAM】VINO-Mono安装部署与运行

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍VINO-Mono安装部署与运行。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…

数学建模--非线性规划模型+MATLAB代码保姆式解析

目录 1.简单介绍 2.求解方法 3.适用赛题 4.典型例题及相关分析 &#xff08;1&#xff09;问题引入 &#xff08;2&#xff09;决策变量&约束条件 &#xff08;3&#xff09;确定目标函数 &#xff08;4&#xff09;建立数学模型 5.MATLAB代码祝逐字句讲解 1.简单…

什么是AIoT?

什么是AIoT? AIoT&#xff0c;即人工智能物联网&#xff0c;是一种将人工智能&#xff08;AI&#xff09;技术与物联网&#xff08;IoT&#xff09;相结合的新型应用形态。它不仅实现了设备之间的互联互通&#xff0c;还赋予了它们更智能化的特性。AIoT的核心在于通过AI的数据…

Ubuntu 系统安装 VS Code 并配置 C++ 环境

Linux 系列教程&#xff1a; VMware 安装配置 Ubuntu&#xff08;最新版、超详细&#xff09;FinalShell 远程连接 Linux&#xff08;Ubuntu&#xff09;系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️ ➡️VS Code 官方教程&#xff1a;Using C on Linux in VS Code&…

掌握字幕艺术:pysrt 库指南

文章目录 掌握字幕艺术&#xff1a;pysrt 库指南第一部分&#xff1a;背景介绍第二部分&#xff1a;库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解决方…

基于Kubernetes集群构建MongoDB

基于Kubernetes集群构建MongoDB 作者:行癫(盗版必究) 一:基础环境 1.Kubernetes集群正常运行 2.Harbor私有仓库正常运行 二:MongoDB项目部署 ​ MongoDB项目对应Kubernetes的yaml文件: --- apiVersion: v1 kind: Namespace metadata:name: m

深入了解PBKDF2:密码学中的关键推导函数

title: 深入了解PBKDF2&#xff1a;密码学中的关键推导函数 date: 2024/4/20 20:37:35 updated: 2024/4/20 20:37:35 tags: 密码学对称加密哈希函数KDFPBKDF2安全密钥派生 第一章&#xff1a;密码学基础 对称加密和哈希函数 对称加密&#xff1a;对称加密是一种加密技术&…

ECharts:五大卓越在线示例库助力高效数据可视化开发

1. ECharts官方示例库 ECharts官网提供的示例库是最权威、最新的展示平台&#xff0c;涵盖了所有基础和高级图表类型&#xff0c;每个示例都配有详尽的代码解释和配置说明。开发者可以直接查看源代码&#xff0c;复制粘贴后稍加修改就能应用于实际项目中。 2. Make A Pie - EC…

【声呐仿真】学习记录1-配置dave、uuv_simulator

【声呐仿真】学习记录1-配置dave、uuv_simulator 1.介绍2.配置3.一些场景 1.介绍 家|DAVE项目 — Home | Project DAVE 2.配置 参考官方教程安装|DAVE项目 — Installation | Project DAVE mkdir -p ~/uuv_ws/src cd ~/uuv_ws/src git clone https://github.com/Field-Robot…

Jmeter 性能-死锁问题定位+分析

1、环境搭建 ①准备脚本&#xff0c;执行压测 ②用Jstack 打印日志 jstack 112759 >dead.log ③下载日志到本地 sz dead.log 2、问题定位 ①打开dead.log&#xff0c;搜索deadlock ②查看死锁的线程 ③查看死锁位置 3、问题分析 ①下载死锁的类文件 Sz CaseControlle…

Redis系列之Cluster集群搭建

在上一篇博客&#xff0c;我们学习Redis哨兵Sentinel集群的搭建&#xff0c;redis的哨兵模式提供了比如监控、自动故障转移等高可用方案&#xff0c;但是这种方案&#xff0c;容量相对固定&#xff0c;要进行持续扩容或者数据分片就不适合&#xff0c;所以有另外一种更复杂的集…

某零售企业招聘管理体系搭建咨询项目

科学岗位分析&#xff0c;改善招聘流程&#xff0c;提高招聘及时率随着公司不断发展壮大&#xff0c;企业规模逐渐增大&#xff0c;部门设置也日益增多&#xff0c;因此对人员的需求也日益提高。但是目前该企业在人员招聘方面逐渐暴露出一些诸如岗位分析不到位、缺乏整体面试计…