项目准备
项目准备¶
应用场景¶
单元测试是软件开发中的一项关键实践,它涉及对软件中的单独单元(通常是函数、方法、类或模块)进行独立测试的过程。以下是进行单元测试的一些主要原因:
- 验证代码的正确性:单元测试可以验证代码的各个部分是否按照预期工作。通过针对每个函数或方法编写测试用例,开发人员可以确保其实现是正确的。
- 提高代码质量:单元测试有助于提高代码的整体质量。通过在开发过程中频繁运行单元测试,开发人员可以更早地发现和纠正代码中的错误,从而减少后期调试的时间。
- 及早发现问题:单元测试可以帮助开发人员在代码进入生产环境之前及早发现和修复问题。这有助于减少在生产中出现的意外问题,提高软件的稳定性。
- 降低回归测试成本:随着项目的演进,可能会频繁地进行回归测试,以确保新的更改没有破坏现有功能。单元测试可以自动运行,降低了回归测试的成本和时间。
总体而言,单元测试是一种有效的实践,有助于提高软件的质量、可维护性和可靠性。它是构建健壮、可靠软件的关键步骤。
单元测试步骤¶
单元测试是一种用于验证软件中单独单元(如函数、方法、类或模块)是否按照预期工作的测试方法。
- 确定被测试单元:确定要进行单元测试的具体单元,可能是一个函数、方法、类或模块。这是测试的起点。
- 编写测试用例:为被测试的单元编写测试用例。测试用例应覆盖各种输入情况和边界条件,以确保被测试单元在各种情况下都能正确工作。
- 导入测试框架:如果使用测试框架(如 JUnit、pytest 等),确保在测试中导入框架。测试框架可以提供便捷的断言和测试组织结构。
- 编写测试代码:编写测试代码来调用被测试的单元,并使用测试框架提供的断言来验证实际输出是否符合预期输出。
- 运行单元测试:运行单元测试。测试框架会执行测试用例,并提供有关每个测试用例是否通过的反馈。这可以通过命令行、集成开发环境(IDE)或持续集成工具来完成。
- 分析测试结果:分析测试结果以确定哪些测试用例通过,哪些失败。如果有失败的测试用例,查看失败的原因,并检查是否需要进行代码修复。
这些步骤有助于确保被测试的单元在不同情况下都能够按照预期工作,并提供了一种有效的方法来捕捉和修复潜在的问题。
项目地址与工具¶
- 项目地址:https://github.com/spring-projects/spring-petclinic/blob/main/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java
- 工具:
- Java
- JUnit
- Allure
JUnit5 安装¶
创建 maven 项目,对应在 pom 文件中导入如下依赖即可自动安装:
<properties>
<!-- 对应junit Jupiter的版本号;放在这里就不需要在每个依赖里面写版本号,导致对应版本号会冲突 -->
<junit.jupiter.version>5.9.1</junit.jupiter.version>
</properties>
<!-- 物料清单 (BOM)-->
<dependencyManagement>
<dependencies>
<!--当使用 Gradle 或 Maven 引用多个 JUnit 工件时,此物料清单 POM 可用于简化依赖项管理。不再需要在添加依赖时设置版本-->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>${junit.jupiter.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- junit5 -->
<!-- 创建 Junit5 测试用例的 API-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<!--对应添加的依赖的作用范围-->
<scope>test</scope>
</dependency>
<!-- 兼容 JUnit4 版本的测试用例-->
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
<!--suite套件依赖 -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<includes>
<include>**/*Test</include>
<include>**/Test*</include>
</includes>
</configuration>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
</dependencies>
</plugin>
Allure 安装¶
- 本地安装:下载地址
- Allure 本地安装配置参考链接:Allure安装配置
- 本地环境验证:
allure --version
Java allure 安装¶
<properties>
<!-- allure报告 -->
<allure.version>2.19.0</allure.version>
<aspectj.version>1.9.9.1</aspectj.version>
<allure.maven.version>2.11.2</allure.maven.version>
<allure.cmd.download.url>
https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline
</allure.cmd.download.url>
</properties>
<dependencies>
<!-- allure报告-->
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-junit5</artifactId>
<version>${allure.version}</version>
</dependency>
</dependencies>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
</argLine>
</configuration>
</plugin>
<plugin>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-maven</artifactId>
<version>${allure.maven.version}</version>
<configuration>
<reportVersion>${allure.version}</reportVersion>
<allureDownloadUrl>${allure.cmd.download.url}/${allure.version}/allure-commandline-${allure.version}.zip</allureDownloadUrl>
</configuration>
</plugin>