软件测试
实验项目名称:实验四
一、 实验目的
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) {
if (year % 4 != 0) return false;
if (year % 100 == 0 &&
year % 400 != 0) return false;
return true;
}
}
设计测试用例与编写测试类 LeapYearTest
使用参数化测试覆盖不同年份,重点验证边界条件(整百年)。
class LeapYearTest {
private LeapYear leapYear = new
LeapYear();
@ParameterizedTest(name = "{0} 是否闰年?预期:{1}")
@CsvSource({
"2000,true",
"1900,false",
"2024,true",
"2100,false",
"2023,false",
"2016,true"
})
void parameterizedLeapYearTest(int
year, boolean expected) {
assertEquals(expected,
leapYear.isLeapYear(year));
}
}
运行测试与结果验证
执行测试后,所有用例通过,闰年逻辑正确处理边界条件。
2、实验任务 3:三角形判断程序及测试——实验步骤
分析
输入:三角形三边长度(支持浮点数)。
输出:分类结果(非法边长、非三角形、等边、等腰、直角、钝角、锐角)。
判定逻辑:
边长合法性检查(边长≤0 则非法);
三角形成立条件(任意两边之和大于第三边);
类型判断优先级:等边
> 直角 > 等腰 > 钝角 / 锐角(确保
“等腰直角三角形” 优先判定为直角三角形)。
编写三角形判断类:
public class Triangle {
/**
* 判断三角形类型
* @return "非三角形", "等边三角形", "等腰三角形", "直角三角形", "钝角三角形", "锐角三角形"
*/
public
String determineTriangleType(double a, double b, double c) {
// 检查三边是否为正数
if (a <= 0 || b <= 0 || c
<= 0) {
return "非三角形";
}
// 检查三角形不等式
if (a + b <= c || a + c <=
b || b + c <= a) {
return "非三角形";
}
// 判断等边三角形
if (a == b && b == c) {
return "等边三角形";
}
// 判断等腰三角形
if (a == b || b == c || a == c) {
return "等腰三角形";
}
// 排序边的长度,使得a <= b <= c
double[] sides = {a, b, c};
java.util.Arrays.sort(sides);
a = sides[0];
b = sides[1];
c = sides[2];
// 判断直角、钝角、锐角三角形
double epsilon = 1e-9; // 浮点数比较的精度
if (Math.abs(a*a + b*b -
c*c) < epsilon) {
return "直角三角形";
} else if (a*a + b*b < c*c) {
return "钝角三角形";
} else {
return "锐角三角形";
}
}
}
设计测试用例与测试类TriangleClassifierTest
参数化测试:覆盖所有分类场景,包括非法边长、非三角形、等边、等腰、直角、钝角、锐角,以及浮点精度场景(如等腰直角三角形)。
class TriangleTest {
private Triangle triangle;
@BeforeEach
void setUp() {
triangle = new Triangle();
}
@Test
void testNonTriangle() {
// 任意一边小于等于0
assertEquals("非三角形",
triangle.determineTriangleType(0, 4, 5));
assertEquals("非三角形",
triangle.determineTriangleType(3, -1, 5));
assertEquals("非三角形",
triangle.determineTriangleType(3, 4, -2));
// 不满足三角形不等式
assertEquals("非三角形", triangle.determineTriangleType(1,
2, 3));
assertEquals("非三角形",
triangle.determineTriangleType(1, 10, 5));
}
@Test
void testEquilateralTriangle() {
assertEquals("等边三角形",
triangle.determineTriangleType(5, 5, 5));
assertEquals("等边三角形",
triangle.determineTriangleType(10, 10, 10));
}
@Test
void testIsoscelesTriangle() {
assertEquals("等腰三角形",
triangle.determineTriangleType(5, 5, 8));
assertEquals("等腰三角形",
triangle.determineTriangleType(5, 8, 5));
assertEquals("等腰三角形", triangle.determineTriangleType(8, 5, 5));
}
@Test
void testRightTriangle() {
assertEquals("直角三角形",
triangle.determineTriangleType(3, 4, 5));
assertEquals("直角三角形",
triangle.determineTriangleType(5, 12, 13));
assertEquals("直角三角形",
triangle.determineTriangleType(8, 15, 17));
}
@Test
void testObtuseTriangle() {
assertEquals("钝角三角形",
triangle.determineTriangleType(2, 3, 4.5));
assertEquals("钝角三角形", triangle.determineTriangleType(3,
4, 6.5));
}
@Test
void testAcuteTriangle() {
assertEquals("锐角三角形",
triangle.determineTriangleType(4, 5, 6));
assertEquals("锐角三角形",
triangle.determineTriangleType(7, 8, 9));
}
@ParameterizedTest(name =
"[{index}] 三边 {0}, {1},
{2} 形成:{3}")
@CsvSource({
"0, 4, 5, 非三角形",
"3, -1, 5, 非三角形",
"1, 2, 3, 非三角形",
"5, 5, 5, 等边三角形",
"5, 5, 8, 等腰三角形",
"3, 4, 5, 直角三角形",
"2, 3, 4.5, 钝角三角形",
"4, 5, 6, 锐角三角形",
"7, 8, 9, 锐角三角形"
})
void parameterizedTriangleTest(double
a, double b, double c, String expected) {
assertEquals(expected,
triangle.determineTriangleType(a, b, c));
}
}
运行测试与结果验证
执行测试后,所有用例通过,闰年逻辑正确处理边界条件。
四、 个人体会
通过本次实验,我掌握了参数化测试和复杂条件分支的覆盖方法。在三角形分类任务中,需特别注意浮点数精度和三边排序问题。单元测试能有效验证边界条件(如三边相等)和异常处理(如负数边长)。

浙公网安备 33010602011771号