123
实验项目名称:实验四
一、 实验目的
1、掌握单元测试的基本理论和作用。
2、掌握典型单元测试工具 JUnit 的使用
二、 实验内容
实验题目
三、 实验步骤及结果
源代码不用写在报告中,源代码上传学习通,在报告中可写:源程序见学习通平台。
1、实验任务 2:闰年判断程序及测试
实验步骤(简洁版,侧重任务特有逻辑)
需求分析
闰年定义:能被 4 整除但不能被 100 整除,或能被 400 整除的年份。
需覆盖的测试场景:
正常闰年(如 2020,能被 4 整除且非整百年)。
整百年闰年(如 2000,能被 400 整除)。
整百年非闰年(如 1900,能被 100 整除但不能被 400 整除)。
非闰年(如 2021,不能被 4 整除)。
编写闰年判断类 LeapYear
public class LeapYear {
public boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
}
设计测试用例与编写测试类 LeapYearTest
使用参数化测试覆盖不同年份,重点验证边界条件(整百年)。
@ParameterizedTest
@CsvSource({
"2000, true", // 能被400整除,是闰年
"1900, false", // 能被100整除但不能被400整除,非闰年
"2004, true", // 能被4整除且非整百年,是闰年
"1999, false" // 不能被4整除,非闰年
})
void parameterizedLeapYearTest(int year, boolean expected) {
assertEquals(expected, leapYear.isLeapYear(year));
}
运行测试与结果验证
执行测试后,所有用例应通过,确保闰年逻辑正确处理边界条件。
. 需求分析
输入:三角形三边长度(支持浮点数)。
输出:分类结果(非法边长、非三角形、等边、等腰、直角、钝角、锐角)。
核心逻辑:
边长合法性检查(边长≤0 则非法);
三角形成立条件(任意两边之和大于第三边);
类型判断优先级:等边 > 直角 > 等腰 > 钝角 / 锐角(确保 “等腰直角三角形” 优先判定为直角三角形)。
package org.example;
import java.util.Arrays;
public class TriangleClassifier {
public String classifyTriangle(double a, double b, double c) {
// 边长合法性检查
if (a <= 0 || b <= 0 || c <= 0) {
return "非法边长(边长需>0)";
}
// 三角形成立条件检查
if (a + b <= c || a + c <= b || b + c <= a) {
return "非三角形";
}
// 排序边长以便后续判断
double[] sides = {a, b, c};
Arrays.sort(sides);
double maxSide = sides[2];
double sumSq = sides[0] * sides[0] + sides[1] * sides[1];
double maxSq = maxSide * maxSide;
// **关键判断顺序:先直角后等腰,确保等腰直角三角形正确分类**
if (a == b && b == c) {
return "等边三角形";
} else if (Math.abs(sumSq - maxSq) < 1e-9) { // 优先判断直角三角形
return "直角三角形";
} else if (a == b || a == c || b == c) { // 再判断等腰三角形
return "等腰三角形";
} else if (maxSq > sumSq) {
return "钝角三角形";
} else {
return "锐角三角形";
}
}
}
设计测试用例与测试类TriangleClassifierTest
参数化测试:覆盖所有分类场景,包括非法边长、非三角形、等边、等腰、直角、钝角、锐角,以及浮点精度场景(如等腰直角三角形)。
package org.example;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.*;
class TriangleClassifierTest {
private TriangleClassifier classifier;
@BeforeEach
void setUp() {
classifier = new TriangleClassifier();
}
@ParameterizedTest
@CsvSource({
// 非法边长
"0, 3, 4, 非法边长(边长需>0)",
"-1, 2, 3, 非法边长(边长需>0)",
// 非三角形
"3, 4, 8, 非三角形",
"2, 2, 5, 非三角形",
// 等边三角形
"3, 3, 3, 等边三角形",
// 等腰三角形(非直角)
"3, 3, 4, 等腰三角形",
// 直角三角形(含等腰直角)
"3, 4, 5, 直角三角形",
"1, 1, 1.41421356, 直角三角形", // 浮点精度测试(√2近似值)
// 钝角三角形
"2, 3, 4, 钝角三角形",
// 锐角三角形
"4, 5, 6, 锐角三角形"
})
void parameterizedTriangleTest(double a, double b, double c, String expected) {
assertEquals(expected, classifier.classifyTriangle(a, b, c));
}
} }

浙公网安备 33010602011771号