实训报告4:JUnit单元测试实训
·
JUnit单元测试实训报告
1. 基本信息
| 名称 | JUnit单元测试 |
|---|---|
| 时间 | X月X日 |
| 测试人 | XXX |
| 学号 | xxxxxxxxx |
| 年级专业班级 | xxxx级xxxx专业xxxxxx班 |
| 目标 | 理解JUnit作为白盒测试工具的本质,通过编写代码验证方法逻辑的正确性,关注程序内部执行路径的覆盖。学习JUnit的核心注解(@Test、@Before、@After)和断言方法(如Assert.assertEquals),实现测试用例的独立执行与结果验证。构建自动化测试能力,提升持续集成与高质量交付工程能力。 |
2. 测试思路与测试环境
测试思路的具体说明
本次测试主要针对Triangle类的功能进行单元测试,重点验证三角形类型的判断逻辑是否正确,以及面积、周长计算等功能是否符合预期。通过JUnit框架,我们设计了多个测试用例,涵盖以下场景:
- 边长超出范围的情况(无效三角形)。
- 等边三角形、等腰三角形、直角三角形、一般三角形的判断。
- 无法构成三角形的情况。
- 面积和周长的计算验证。
toString方法输出的正确性。
所有测试用例均使用JUnit的@Test注解,并通过Assertions类中的断言方法验证结果。
测试环境的具体说明
- 开发工具:IntelliJ IDEA 2024.3.5
- 测试框架:JUnit 5
- 操作系统:Windows 11
- 编程语言:Java 21
3. 测试内容
1. 测试对象分析说明
测试对象为Triangle类,该类的主要功能包括:
- 判断三角形类型(等边、等腰、直角、一般、无法构成、无效)。
- 计算三角形的面积(基于海伦公式)。
- 计算三角形的周长。
- 提供
toString方法,返回三角形类型的字符串描述。
2. 测试步骤说明
- 创建
Triangle类实例时,传入不同的边长参数,验证构造函数是否正确抛出异常或初始化对象。 - 调用
getType方法,验证返回的三角形类型是否符合预期。 - 调用
getArea方法,验证面积计算是否正确。 - 调用
getCircumference方法,验证周长计算是否正确。 - 调用
toString方法,验证返回的字符串描述是否正确。
3. 具体的测试用例列表及执行结果
| 测试用例编号 | 测试用例描述 | 输入数据 | 预期结果 | 实际结果 | 测试状态 |
|---|---|---|---|---|---|
| getType01 | 边长超出范围 | a=101, b=101, c=101 | 抛出异常 | 抛出异常 | 通过 |
| getType02 | 等边三角形 | a=50, b=50, c=50 | TriangleType.Equilateral | TriangleType.Equilateral | 通过 |
| getType03 | 无法构成三角形 | a=3, b=4, c=8 | TriangleType.NoTriangle | TriangleType.General | 不通过 |
| getType04 | 等腰三角形 | a=3, b=3, c=4 | TriangleType.Isosceles | TriangleType.Isosceles | 通过 |
| getType05 | 直角三角形 | a=3, b=4, c=5 | TriangleType.RightAngled | TriangleType.RightAngled | 通过 |
| getType06 | 一般三角形 | a=2, b=3, c=4 | TriangleType.General | TriangleType.General | 通过 |
| getArea | 面积计算 | a=3, b=4, c=5 | 6.0 | 6.0 | 通过 |
| getCircumference | 周长计算 | a=3, b=4, c=5 | 12 | 12 | 通过 |
| testToString | 字符串描述 | a=3, b=4, c=5 | “直角三角形” | “直角三角形” | 通过 |
4. 测试结果与分析
测试结果
在本次单元测试中,大部分测试用例均通过,但测试用例 getType03 未能通过,具体原因如下:
| 测试用例编号 | 测试用例描述 | 输入数据 | 预期结果 | 实际结果 | 测试状态 |
|---|---|---|---|---|---|
| getType01 | 边长超出范围 | a=101, b=101, c=101 | 抛出异常 | 抛出异常 | 通过 |
| getType02 | 等边三角形 | a=50, b=50, c=50 | TriangleType.Equilateral | TriangleType.Equilateral | 通过 |
| getType03 | 无法构成三角形 | a=3, b=4, c=8 | TriangleType.NoTriangle | TriangleType.General | 不通过 |
| getType04 | 等腰三角形 | a=3, b=3, c=4 | TriangleType.Isosceles | TriangleType.Isosceles | 通过 |
| getType05 | 直角三角形 | a=3, b=4, c=5 | TriangleType.RightAngled | TriangleType.RightAngled | 通过 |
| getType06 | 一般三角形 | a=2, b=3, c=4 | TriangleType.General | TriangleType.General | 通过 |
| getArea | 面积计算 | a=3, b=4, c=5 | 6.0 | 6.0 | 通过 |
| getCircumference | 周长计算 | a=3, b=4, c=5 | 12 | 12 | 通过 |
| testToString | 字符串描述 | a=3, b=4, c=5 | “直角三角形” | “直角三角形” | 通过 |
分析
-
类型判断问题:
- 在测试用例
getType03中,输入的三角形边长为a=3, b=4, c=8,根据三角形不等式(任意两边之和大于第三边),该组边长无法构成三角形。 - 预期结果为
TriangleType.NoTriangle,但实际返回了TriangleType.General,表明getType方法的逻辑存在问题。
- 在测试用例
-
代码问题定位:
- 检查
Triangle类的getType方法发现,以下条件判断存在逻辑错误:if (this.sideA + this.sideB > this.sideC || this.sideA + this.sideC > this.sideB || this.sideB + this.sideC > this.sideA) { if (this.sideA == this.sideB || this.sideB == this.sideC || this.sideA == this.sideC) return TriangleType.Isosceles; else return TriangleType.General; } else return TriangleType.NoTriangle; - 上述代码使用了逻辑或 (
||) 运算符,导致只要满足其中一个条件(如sideA + sideB > sideC),就会误判为可以构成三角形。 - 正确的判断应改为逻辑与 (
&&) 运算符,确保所有三角形不等式都成立时才认为可以构成三角形。
- 检查
-
修复建议:
- 修改
getType方法中的条件判断逻辑,将逻辑或 (||) 替换为逻辑与 (&&):if (this.sideA + this.sideB > this.sideC && this.sideA + this.sideC > this.sideB && this.sideB + this.sideC > this.sideA) { if (this.sideA == this.sideB && this.sideA == this.sideC) return TriangleType.Equilateral; if (this.sideA == this.sideB || this.sideB == this.sideC || this.sideA == this.sideC) return TriangleType.Isosceles; if (this.sideA * this.sideA == this.sideB * this.sideB + this.sideC * this.sideC || this.sideB * this.sideB == this.sideA * this.sideA + this.sideC * this.sideC || this.sideC * this.sideC == this.sideA * this.sideA + this.sideB * this.sideB) return TriangleType.RightAngled; return TriangleType.General; } else { return TriangleType.NoTriangle; }
- 修改
-
改进后测试结果:
- 修复代码后重新运行测试用例
getType03,实际结果变为TriangleType.NoTriangle,与预期结果一致,测试通过。
- 修复代码后重新运行测试用例
总结
通过本次测试,我们发现了 Triangle 类中 getType 方法的逻辑错误,并及时进行了修复。修复后,所有测试用例均通过,验证了程序的正确性。同时,这次测试也提醒我们在编写代码时需仔细检查逻辑条件,尤其是涉及多个分支判断的场景。未来可以通过更全面的测试用例覆盖,进一步提高代码的可靠性。
更多推荐

所有评论(0)