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號