软件测试04
实验项目名称:实验四
一、 实验目的
1、掌握单元测试的基本理论和作用。
2、掌握典型单元测试工具 JUnit 的使用。
二、 实验内容
实验任务 1 :
请按以下操作步骤完成一个基本的 JUnit 测试实例。
以下是在IntelliJ IDEA环境下使用JUnit对Calculator类进行单元测试的详细步骤:
步骤1:创建Java项目
1. 打开IntelliJ IDEA → 新建项目 → 选择"Java" → 设置项目名称和路径 → 创建
步骤2:创建Calculator类
public class Calculator {
// 加法
public int add(int a, int b) {
return a + b;
}
// 减法
public int subtract(int a, int b) {
return a - b;
}
// 乘法
public int multiply(int a, int b) {
return a * b;
}
// 除法
public double divide(int a, int b) {
if(b == 0) throw new ArithmeticException("Cannot divide by zero");
return (double) a / b;
}
}
步骤3:添加JUnit依赖
1. 右键项目 → Open Module Settings
2. 选择"Libraries" → "+" → From Maven
3. 输入org.junit.jupiter:junit-jupiter-api:5.8.2 → 确定
4. 重复添加:
- org.junit.jupiter:junit-jupiter-engine:5.8.2
- org.junit.jupiter:junit-jupiter-params:5.8.2
步骤4:创建测试类
1. 在src/test/java目录右键 → New → Java Class → 命名为CalculatorTest
2. 添加测试类注解:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
void testAdd() {
assertEquals(5, calculator.add(2, 3));
assertEquals(-1, calculator.add(2, -3));
}
@Test
void testSubtract() {
assertEquals(1, calculator.subtract(4, 3));
assertEquals(7, calculator.subtract(10, 3));
}
@Test
void testMultiply() {
assertEquals(6, calculator.multiply(2, 3));
assertEquals(-6, calculator.multiply(2, -3));
}
@Test
void testDivide() {
assertEquals(2.0, calculator.divide(6, 3));
assertEquals(3.333, calculator.divide(10, 3), 0.001);
}
@Test
void testDivideByZero() {
assertThrows(ArithmeticException.class, () -> calculator.divide(5, 0));
}
}
步骤5:运行测试
1. 点击测试类左侧的绿色箭头图标 ▶️
2. 选择"Run 'CalculatorTest'"
3. 查看结果:
- 绿色进度条:所有测试通过
- 红色进度条:存在失败的测试
实验任务 2 :编写程序判断闰年,设计测试⽤例并⽤Junit进⾏测试。
实验任务3:编写程序判断非三角形,等腰三角形,等边三角形,直角三角形,钝角三角形,锐角三角形,设计测试用例并用JUnit进行测试。
三、 设计思路及结果
实验任务 1
根据下面的说明,建立一个基于 JUnit4 的测试项目,对一个类当中的多个方法进行单元测试,进一步体验一下单元测试的作用和 JUnit 测试的应用。
首先新建一个项目叫 JUnitTest,我们编写一个 Calculator 类,这是一个能够简单实现加减乘除、平方、的计算器类,然后对这些功能进行单元测试。该类代码如下:
package org.example;
public class Calculator {
// 加法
public int add(int a, int b) {
return a + b;
}
// 减法
public int subtract(int a, int b) {
return a - b;
}
// 乘法
public int multiply(int a, int b) {
return a * b;
}
// 除法
public double divide(int a, int b) {
if (b == 0) throw new ArithmeticException("Cannot divide by zero");
return (double) a / b;
}
}
将 JUnit4 单元测试包引入这个项目,生成 JUnit 测试框架,进行测试。
添加 JUnit 依赖(Maven)
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
创建测试类 CalculatorTest
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
void testAdd() {
assertEquals(5, calculator.add(2, 3));
assertEquals(-1, calculator.add(2, -3));
}
@Test
void testSubtract() {
assertEquals(1, calculator.subtract(4, 3));
assertEquals(7, calculator.subtract(10, 3));
}
@Test
void testMultiply() {
assertEquals(6, calculator.multiply(2, 3));
assertEquals(-6, calculator.multiply(2, -3));
}
@Test
void testDivide() {
assertEquals(2.0, calculator.divide(6, 3));
assertEquals(3.333, calculator.divide(10, 3), 0.001);
}
@Test
void testDivideByZero() {
assertThrows(ArithmeticException.class, () -> calculator.divide(5, 0));
}
}
运行测试:
实验任务 2
编写程序判断闰年,设计测试⽤例并⽤Junit进⾏测试。
package org.example;
public class LeapYear {
public boolean isLeapYear(int year) {
if (year <= 0) {
throw new IllegalArgumentException("年份必须为正整数");
}
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
}
package org.example;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class LeapYearTest {
private LeapYear leapYear;
@BeforeEach
void setUp() {
leapYear = new LeapYear();
}
@Test
void testLeapYears() {
assertTrue(leapYear.isLeapYear(2020)); // 普通闰年
assertTrue(leapYear.isLeapYear(2000)); // 世纪闰年
}
@Test
void testNonLeapYears() {
assertFalse(leapYear.isLeapYear(1900)); // 世纪平年
assertFalse(leapYear.isLeapYear(2021)); // 普通平年
}
@Test
void testInvalidYear() {
assertThrows(IllegalArgumentException.class, () -> leapYear.isLeapYear(0));
assertThrows(IllegalArgumentException.class, () -> leapYear.isLeapYear(-400));
}
}
运行截图:
实验任务 3
编写程序判断一般三角形,等腰三角形,等边三角形,设计测试用例并用JUnit进行测试。
package org.example;
import java.util.Arrays;
public class TriangleClassifier {
public String classify(double a, double b, double c) {
double[] sides = {a, b, c};
Arrays.sort(sides); // 升序排序,便于判断角度
a = sides[0];
b = sides[1];
c = sides[2];
// 判断非三角形
if (a + b <= c || a <= 0 || b <= 0 || c <= 0) {
return "非三角形";
}
// 判断等边
if (a == b && b == c) {
return "等边三角形";
}
// 判断等腰
if (a == b || b == c || a == c) {
return "等腰三角形";
}
// 勾股关系判断角度
double a2 = a * a, b2 = b * b, c2 = c * c;
if (Math.abs(a2 + b2 - c2) < 1e-6) {
return "直角三角形";
} else if (a2 + b2 < c2) {
return "钝角三角形";
} else {
return "锐角三角形";
}
}
}
package org.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class TriangleClassifierTest {
TriangleClassifier classifier = new TriangleClassifier();
@Test
void testNonTriangle() {
assertEquals("非三角形", classifier.classify(1, 2, 3));
assertEquals("非三角形", classifier.classify(0, 1, 1));
assertEquals("非三角形", classifier.classify(-1, 1, 2));
}
@Test
void testEquilateralTriangle() {
assertEquals("等边三角形", classifier.classify(3, 3, 3));
}
@Test
void testIsoscelesTriangle() {
assertEquals("等腰三角形", classifier.classify(5, 5, 8));
assertEquals("等腰三角形", classifier.classify(5, 8, 5));
}
@Test
void testRightTriangle() {
assertEquals("直角三角形", classifier.classify(3, 4, 5));
assertEquals("直角三角形", classifier.classify(5, 12, 13));
}
@Test
void testObtuseTriangle() {
assertEquals("钝角三角形", classifier.classify(3, 4, 6));
}
@Test
void testAcuteTriangle() {
assertEquals("锐角三角形", classifier.classify(5, 6, 7));
}
}
运行截图:
|
测试用例编号 |
输入边长 a,b,c |
预期结果 |
用例说明 |
|
TC01 |
1, 2, 3 |
非三角形 |
两边之和等于第三边 |
|
TC02 |
3, 3, 3 |
等边三角形 |
三边相等 |
|
TC03 |
5, 5, 8 |
等腰三角形 |
两边相等 |
|
TC04 |
3, 4, 5 |
直角三角形 |
满足勾股定理 |
|
TC05 |
3, 4, 6 |
钝角三角形 |
c² > a² + b² |
|
TC06 |
5, 6, 7 |
锐角三角形 |
c² < a² + b² |
|
TC07 |
0, 4, 5 |
非三角形 |
有边为 0 |
|
TC08 |
-1, 4, 5 |
非三角形 |
有负边长 |
三、实验总结
通过本次实验,我掌握了 JUnit 框架在 Java 单元测试中的应用,针对计算器功能、闰年判断及三角形分类等场景设计了覆盖正常逻辑、边界条件和异常情况的测试用例。JUnit 的注解(如@Test、@BeforeEach)和断言方法(assertEquals、assertThrows)简化了测试代码编写,让我能够高效验证代码的正确性与健壮性。在实践中,我深刻体会到单元测试需全面考虑输入边界(如负数年份、零边长)和异常处理(如除零错误、非法参数),而测试驱动的思维(先定义预期结果再实现逻辑)能显著减少代码漏洞。此外,处理浮点精度断言和三角形边长排序逻辑时的调试经历,让我认识到细节把控和逻辑严谨性的重要性。单元测试不仅是质量保障的第一道防线,更是提升代码可维护性和协作效率的关键,未来我会将其融入日常开发流程,培养 “测试先行” 的良好习惯。

浙公网安备 33010602011771号