Maven的单元测试

ops/2025/2/1 1:14:07/

1. 单元测试的基本概念

单元测试(Unit Testing) 是一种软件测试方法,专注于测试程序中的最小可测试单元——通常是单个类或方法。通过单元测试,可以确保每个模块按预期工作,从而提高代码的质量和可靠性。

2.安装和配置 JUnit 5

使用 Maven 配置 JUnit 5

首先,在项目的 pom.xml 文件中添加 JUnit 5 的依赖项。

java"><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example.myproject</groupId><artifactId>my-application</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><name>My Application</name><description>A sample application using Maven and JUnit 5</description><dependencies><!-- 添加 JUnit 5 依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin></plugins></build>
</project>

3.编写单元测试

示例项目结构

假设我们有一个简单的数学工具类 MathUtils,我们将为其编写单元测试

java">my-maven-project/
├── pom.xml
├── src/
│   ├── main/
│   │   └── java/
│   │       └── com/example/myproject/
│   │           └── MathUtils.java
│   └── test/
│       └── java/
│           └── com/example/myproject/
│               └── MathUtilsTest.java
创建 MathUtils 类

src/main/java/com/example/myproject/MathUtils.java

java">package com.example.myproject;public class MathUtils {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}public double divide(int a, int b) {if (b == 0) {throw new IllegalArgumentException("Cannot divide by zero");}return (double) a / b;}public int multiply(int a, int b) {return a * b;}
}

运行结果:

 

java">private MathUtils mathUtils;@BeforeEach
void setUp() {mathUtils = new MathUtils();
}
  • @BeforeEach 注解表示该方法在每个测试方法执行前都会被调用,用于初始化测试对象。

编写测试方法:

  • 测试加法

java">@Test
void testAdd() {assertEquals(5, mathUtils.add(2, 3), "2 + 3 should equal 5");
}
  • @Test 注解表示这是一个测试方法。
  • assertEquals(expected, actual, message) 断言期望值与实际值相等,并提供自定义消息。

测试减法:

java">@Test
void testSubtract() {assertEquals(-1, mathUtils.subtract(2, 3), "2 - 3 should equal -1");
}

测试除法:

java">@Test
void testDivide() {assertEquals(2.5, mathUtils.divide(5, 2), 0.001, "5 / 2 should equal 2.5");Exception exception = assertThrows(IllegalArgumentException.class, () -> {mathUtils.divide(1, 0);});assertEquals("Cannot divide by zero", exception.getMessage(), "Exception message should be 'Cannot divide by zero'");
}
  • assertThrows(exceptionType, executable) 断言抛出指定类型的异常。
  • assertEquals(expected, actual, delta, message) 用于比较浮点数时允许一定的误差范围。

高级特性

参数化测试

JUnit 5 支持参数化测试,允许你使用不同的输入数据多次运行同一个测试方法。

java">package com.example.myproject;import static org.junit.jupiter.params.provider.Arguments.arguments;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;import java.util.stream.Stream;class MathUtilsTest {private MathUtils mathUtils;@BeforeEachvoid setUp() {mathUtils = new MathUtils();}@ParameterizedTest(name = "{index} => add({0}, {1}) = {2}")@MethodSource("addProvider")void testAdd(int a, int b, int expected) {assertEquals(expected, mathUtils.add(a, b));}private static Stream<Arguments> addProvider() {return Stream.of(arguments(2, 3, 5),arguments(-1, 1, 0),arguments(0, 0, 0));}
}
动态测试

JUnit 5 允许你在运行时动态生成测试用例。

java">package com.example.myproject;import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.DynamicNode;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.function.Executable;import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;import static org.junit.jupiter.api.DynamicTest.dynamicTest;class MathUtilsTest {private MathUtils mathUtils;@BeforeEachvoid setUp() {mathUtils = new MathUtils();}@TestFactoryStream<DynamicNode> dynamicTestsFromStream() {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);return numbers.stream().map(number ->dynamicTest("multiply " + number + " by 2",() -> assertEquals(number * 2, mathUtils.multiply(number, 2))));}
}


http://www.ppmy.cn/ops/154620.html

相关文章

Nginx中部署多个前端项目

1&#xff0c;准备前端项目 tlias系统的前端资源 外卖项目的前端资源 2&#xff0c;nginx里面的html文件夹中新建&#xff0c;tlias和sky两个文件夹。 切记这是在nginx/html下创建的 mkdir sky mkdir tlias 把tlias和sky的资源都放到对应的文件夹中 3&#xff0c;编辑配置ngi…

JxBrowser 7.41.7 版本发布啦!

JxBrowser 7.41.7 版本发布啦&#xff01; • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 &#x1f517; 点击此处了解更多详情。 &#x1f193; 获取 30 天免费试用。

基于物联网的智能环境监测系统(论文+源码)

1系统的功能及方案设计 本课题为基于物联网的智能环境监测系统的设计与实现&#xff0c;整个系统采用stm32f103单片机作为主控制器&#xff0c;通过DHT11传感器实现智能环境监测系统温度和湿度的检测&#xff0c;通过MQ传感器实现CO2浓度检测&#xff0c;通过光照传感器实现光照…

浅谈Linux 权限、压缩、进程与服务

概述 放假回家&#xff0c;对Linux系统的一些知识进行重新的整理&#xff0c;做到温故而知新&#xff0c;对用户权限管理、文件赋权、压缩文件、进程与服务的知识进行了一次梳理和总结。 权限管理 Linux最基础的权限是用户和文件&#xff0c;先了解基础的用户权限和文件权限…

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

代码1实现逻辑回归并保存模型 import torch import numpy as np import torch.nn as nn from torch.utils.data import DataLoader, TensorDatasetdata [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6],[0.…

EtherNet/IP转Modbus协议网关在现代工业自动化领域的应用

在一个典型的工业自动化环境中&#xff0c;可能存在多种不同品牌和型号的设备&#xff0c;这些设备往往采用不同的通信协议进行数据传输。例如&#xff0c;某些品牌的PLC可能采用EtherNet/IP协议&#xff0c;而一些较旧的仪表和传感器则可能使用Modbus协议。这种协议的不一致性…

C++小病毒-1.0勒索(更新次数:2)

内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 在C20环境下,并在虚拟机里运行此代码!&#xff0c;病毒带来后果自负! 使用时请删除在main()里的注释,并修改位置至C:\\(看我代码注释)//可以改成WIN Main() #include <iostream> #i…

C语言中危险函数

在 C 语言中&#xff0c;有一些函数因为存在缓冲区溢出、格式字符串漏洞等问题&#xff0c;被认为是“危险函数”。这些函数通常不能有效地检查输入的长度或数据&#xff0c;容易导致程序崩溃、内存泄漏或安全漏洞。常见的危险函数有&#xff1a; 1. gets() gets() 函数用于从…