軟件測試
實驗項目名稱:實驗四
一、 實驗目的
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號