JBuilder 2005 內建 JUnit 整合,提供可視化測試用例生成、測試套件組裝、圖形化運行報告。本系列以兩個典型業務類為例,演示從代碼分析到測試代碼編寫的完整流程。
getValue(int d) 根據輸入區間返回不同計算結果:
| 條件區間 | 返回值 | 邊界點 |
|---|---|---|
d < -2 | Math.abs(d) | -3 → 3, -2 → 4 |
-2 ≤ d < 2 且 d ≠ 0 | d * d | -2 → 4, -1 → 1, 1 → 1 |
d = 0 | 100 (特殊標記值) | 0 → 100 |
d ≥ 2 | d * d * d | 2 → 8, 3 → 27, 32 → 32768 |
public class Subsection {
public static int getValue(int d) {
if (d == 0) {
return 100;
} else if (d < -2) {
return Math.abs(d);
} else if (d >= -2 && d < 2) {
return d * d;
} else { // d >= 2
// 潛在 Bug:d > 32 時 d*d*d 溢出 int 範圍 (32767)
// 註釋掉的保護邏輯:
// if (d > 32) { return Integer.MAX_VALUE; }
return d * d * d;
}
}
public static int sign(double d) {
if (d < 0) return -1;
else if (d > 0) return 1;
else return 0;
}
}
| 分類 | 測試數據 | 預期結果 | 覆蓋目標 |
|---|---|---|---|
| 等價類-負區間 | -5, -3 | 5, 3 | d < -2 分支 |
| 邊界值 | -2 | 4 | d >= -2 邊界 |
| 等價類-零附近 | -1, 1 | 1, 1 | -2 ≤ d < 2 分支 |
| 特殊值 | 0 | 100 | d == 0 分支 |
| 邊界值 | 2 | 8 | d >= 2 邊界 |
| 正常區間 | 3, 5 | 27, 125 | d ≥ 2 分支 |
| 溢出風險 | 33 | 溢出為負數 / 異常 | 缺陷暴露: d*d*d > Integer.MAX_VALUE |
| sign 函數 | -1.5, 0, 2.5 | -1, 0, 1 | 三分支覆蓋 |
string2Array(String str, char splitChar, boolean trim):
splitChar 分割字符串trim=true 時移除首尾分隔符產生的空元素null 輸入返回 nullpublic class StringUtils {
public static String[] string2Array(String str, char splitChar, boolean trim) {
if (str == null) return null;
String tempStr = str;
if (trim) tempStr = trim(tempStr, splitChar); // 移除首尾分隔符
int arraySize = getCharCount(tempStr, splitChar) + 1;
String[] resultArr = new String[arraySize];
int fromIndex = 0, endIndex = 0;
for (int i = 0; i < resultArr.length; i++) {
endIndex = tempStr.indexOf(splitChar, fromIndex);
if (endIndex == -1) {
resultArr[i] = tempStr.substring(fromIndex);
break;
}
resultArr[i] = tempStr.substring(fromIndex, endIndex);
fromIndex = endIndex + 1;
}
return resultArr;
}
private static String trim(String str, char splitChar) {
int begin = 0, end = str.length();
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) != splitChar) { begin = i; break; }
}
for (int i = str.length(); i > 0; i--) {
if (str.charAt(i-1) != splitChar) { end = i; break; }
}
return str.substring(begin, end);
}
private static int getCharCount(String str, char splitChar) {
int count = 0;
for (int i = 0; i < str.length(); i++)
if (str.charAt(i) == splitChar) count++;
return count;
}
}
| 場景 | 輸入 | splitChar | trim | 預期輸出 | 驗證點 |
|---|---|---|---|---|---|
| null 輸入 | null | , | false | null | 空值保護 |
| 空字符串 | "" | , | false | {""} | 單空元素 |
| 無分隔符 | "a" | , | false | {"a"} | 單元素 |
| 標準分割 | "a,b,c" | , | false | {"a","b","c"} | 多元素 |
| 首尾分隔符 | ",a,b," | , | false | {"","a","b",""} | 保留空元素 |
| trim 模式 | ",a,b," | , | true | {"a","b"} | 移除首尾空元素 |
| trim 對比 | ",a,b," | , | false/true | 不同 | 參數行為差異 |
下篇將演示:
assertEquals, assertTrue, 自定義數組比較)TestSuite 批量運行掌握「業務規約 → 測試點矩陣 → 測試代碼」轉化思維,是單元測試從形式走向實效的關鍵。