JUnit 5简明教程

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

概述

写测试用例对于开发来说有2点好处,一是开发阶段写完的功能可以快速验证,第二就是在后期需求变动或修改BUG后可以快速测试当前改动是否带来其它问题。下面就了解一下Junit5写测试用例。
准备

创建一个maven项目
  1. mkdir junit5-tutorial
  2. cd junit5-tutorial
  3. mkdir -p src/main/java
  4. mkdir -p src/test/java
  5. mkdir -p src/main/resources
  6. mkdir -p src/test/resources
  7. # 编写pom.xml
  8. vi pom.xml
复制代码
添加依赖


  • 引入第三方断言库assertj
  • 支持json测试
  • 支持xml测试
pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <groupId>com.example.xxx</groupId>
  6.     <artifactId>junit5-tutorial</artifactId>
  7.     <version>1.0-SNAPSHOT</version>
  8.     <name>junit5-tutorial</name>
  9.     <url>https://www.xxx.com</url>
  10.     <properties>
  11.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12.         <maven.compiler.source>17</maven.compiler.source>
  13.         <maven.compiler.target>17</maven.compiler.target>
  14.     </properties>
  15.     <build>
  16.         <pluginManagement>
  17.             <plugins>
  18.                
  19.                
  20.                 <plugin>
  21.                     <artifactId>maven-surefire-plugin</artifactId>
  22.                     <version>3.0.0-M6</version>
  23.                 </plugin>
  24.                
  25.                 <plugin>
  26.                     <artifactId>maven-compiler-plugin</artifactId>
  27.                     <version>3.10.1</version>
  28.                 </plugin>
  29.             </plugins>
  30.         </pluginManagement>
  31.     </build>
  32.     <dependencyManagement>
  33.         <dependencies>
  34.             
  35.             <dependency>
  36.                 <groupId>net.bytebuddy</groupId>
  37.                 <artifactId>byte-buddy</artifactId>
  38.                 <version>1.12.10</version>
  39.             </dependency>
  40.             <dependency>
  41.                 <groupId>net.bytebuddy</groupId>
  42.                 <artifactId>byte-buddy-agent</artifactId>
  43.                 <version>1.12.10</version>
  44.                 <scope>test</scope>
  45.             </dependency>
  46.             
  47.             <dependency>
  48.                 <groupId>org.mockito</groupId>
  49.                 <artifactId>mockito-junit-jupiter</artifactId>
  50.                 <version>4.5.1</version>
  51.                 <scope>test</scope>
  52.             </dependency>
  53.         </dependencies>
  54.     </dependencyManagement>
  55.     <dependencies>
  56.         <dependency>
  57.             <groupId>org.assertj</groupId>
  58.             <artifactId>assertj-core</artifactId>
  59.             <version>3.22.0</version>
  60.             <scope>test</scope>
  61.         </dependency>
  62.         <dependency>
  63.             <groupId>io.github.classgraph</groupId>
  64.             <artifactId>classgraph</artifactId>
  65.             <version>4.8.146</version>
  66.         </dependency>
  67.         <dependency>
  68.             <groupId>org.junit.jupiter</groupId>
  69.             <artifactId>junit-jupiter</artifactId>
  70.             <version>5.8.2</version>
  71.         </dependency>
  72.         
  73.         <dependency>
  74.             <groupId>net.javacrumbs.json-unit</groupId>
  75.             <artifactId>json-unit-assertj</artifactId>
  76.             <version>2.33.0</version>
  77.             <scope>test</scope>
  78.         </dependency>
  79.         <dependency>
  80.             <groupId>com.fasterxml.jackson.core</groupId>
  81.             <artifactId>jackson-databind</artifactId>
  82.             <version>2.13.2.2</version>
  83.         </dependency>
  84.         <dependency>
  85.             <groupId>com.fasterxml.jackson.datatype</groupId>
  86.             <artifactId>jackson-datatype-jsr310</artifactId>
  87.             <version>2.13.2</version>
  88.         </dependency>
  89.         
  90.         <dependency>
  91.             <groupId>org.xmlunit</groupId>
  92.             <artifactId>xmlunit-assertj</artifactId>
  93.             <version>2.9.0</version>
  94.             <scope>test</scope>
  95.         </dependency>
  96.     </dependencies>
  97. </project>
复制代码
创建一个User
  1. public record User(String name, Integer age, Boolean blocked, LocalDate birthDate) {
  2. }
复制代码
测试

测试用例命名最佳实践

首先测试类名应该以Test结尾,测试用例名称最好遵从以下规则

  • 测试名称应表达特定要求
  • 测试名称应包含预期的输入或预期的结果
  • 测试名称应以陈述的形式
具体参考:https://osherove.com/blog/2005/4/3/naming-standards-for-unit-tests.html
断言
  1. @Test
  2. @DisplayName("User should be at least 18")
  3. void user_should_be_at_least_18() {
  4.     // junit5 的断言
  5.     assertTrue(user.age() >= 18);
  6.     // assertj 的断言
  7.     assertThat(user.age()).isGreaterThanOrEqualTo(18);
  8. }
复制代码
显示名称

测试类和测试方法可以声明自定义显示名称,可以使用空格、特殊字符、甚至emojis表情符号,这些名称会在runner和测试报告中显示。

参数化测试

参数化测试可以用不同的参数多次运行测试。它们和普通的@Test方法一样声明,但是使用@ParameterizedTest注解。还必须声明至少一个将为每次调用提供参数的来
使用@ValueSource来指定参数来源

它可以指定一个原生类型的数组,并且只能为每次调用提供一个参数
  1. @ParameterizedTest
  2. @ValueSource(ints = {20, 50, 80})
  3. void test_value_source(int age) {
  4.     assertThat(age).isGreaterThanOrEqualTo(18);
  5. }
复制代码
读取CSV文件内容作为参数来源

它可以让你使用classpath中的csv文件。csv文件中的每一行都会导致参数测试的一次调用
src/test/resources/friends.csv
  1. name,age
  2. lisa,20
  3. hans,30
  4. hanna,40
复制代码
  1. @ParameterizedTest
  2. @CsvFileSource(resources = "/friends.csv", numLinesToSkip = 1)
  3. void test_value_source_by_csv_file_source(String name, int age) {
  4.     assertThat(age).isGreaterThanOrEqualTo(18);
  5. }
复制代码
标签

我们可以给测试类或测试用例上面通过@Tag加标签,执行测试的时候可以指定标签,从而达到为测试用例分组的目的。
下面就给测试类打上一个integration的标签
  1. @Tag("integration")
  2. class User01Test {
  3.     // ...
  4. }
复制代码
可以使用如下命令来指定要执行的测试用例:
  1. mvn test -Dgroups="integration"
复制代码

左侧只执行了Running com.example.xxx.User01Test一个测试类,右侧则执行了3个
总结

本文介绍了如何使用Junit5写测试用例。
参考

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表