測試基礎是每位測試工程師必須掌握的核心知識,包含測試金字塔、用例設計方法、覆蓋率分析等關鍵概念。
測試金字塔#
測試金字塔是一種測試策略模型,描述了不同類型測試的比例關係:
flowchart TB
subgraph pyramid[" "]
direction TB
E2E["🔺 E2E 測試<br>數量最少 | 成本最高 | 速度最慢"]
INT["🔷 整合測試<br>數量中等 | 成本中等 | 速度中等"]
UNIT["🟩 單元測試<br>數量最多 | 成本最低 | 速度最快"]
end
E2E --- INT
INT --- UNIT三層測試的特點#
| 測試類型 | 範圍 | 執行速度 | 維護成本 | 信心程度 |
|---|---|---|---|---|
| 單元測試 | 函式/類 | 毫秒級 | 低 | 對程式碼邏輯 |
| 整合測試 | 模組間 | 秒級 | 中 | 對介面協作 |
| E2E 測試 | 完整系統 | 分鐘級 | 高 | 對業務流程 |
最佳實踐比例:單元測試 70%、整合測試 20%、E2E 測試 10%。這個比例確保了快速反饋的同時,也覆蓋了關鍵業務場景。
測試分類#
按測試階段分類#
flowchart LR
A[單元測試<br>開發階段] --> B[整合測試<br>模組整合]
B --> C[系統測試<br>完整系統]
C --> D[驗收測試<br>交付確認]按測試方法分類#
| 方法 | 說明 | 適用場景 |
|---|---|---|
| 黑盒測試 | 不關心內部實現,只驗證輸入輸出 | 功能測試、驗收測試 |
| 白盒測試 | 基於程式碼邏輯設計測試 | 單元測試、程式碼覆蓋 |
| 灰盒測試 | 結合黑盒和白盒 | 整合測試、API 測試 |
按測試類型分類#
功能性測試:
- 單元測試、整合測試、系統測試、回歸測試
非功能性測試:
- 效能測試、安全測試、兼容性測試、可靠性測試
非功能性需求往往是決定軟體品質的關鍵因素。一個完整的測試策略必須同時覆蓋功能性和非功能性需求。
測試用例設計方法#
什麼是「好的」測試用例?#
核心觀點:「好的」測試用例是一個完備的集合,它能夠覆蓋所有等價類以及各種邊界值,而與能否發現缺陷無關。
池塘捕魚的比喻:
如果把被測軟體看作池塘,軟體缺陷是池塘中的魚,建立測試用例集的過程就像是在編織漁網。好的測試用例集是一張能覆蓋整個池塘的大漁網,只要池塘裡有魚,這張網就一定能撈到。
好的測試用例的三個特徵#
- 整體完備性:有效測試用例組成的集合,能完全覆蓋測試需求
- 等價類劃分的準確性:每個等價類中任一輸入測試通過,其他輸入也測試通過
- 等價類集合的完備性:所有可能的邊界值和條件都已正確識別
等價類劃分#
等價類劃分是將所有可能的輸入資料劃分成若干子集,每個子集中的任意輸入對於揭露缺陷具有同等效果。
示例:考試成績輸入#
假設成績取值範圍 0-100,及格分數線 60:
| 類型 | 等價類 | 測試資料示例 |
|---|---|---|
| 有效等價類 1 | 0-59 之間的整數(不及格) | 30 |
| 有效等價類 2 | 60-100 之間的整數(及格) | 75 |
| 無效等價類 1 | 小於 0 的負數 | -5 |
| 無效等價類 2 | 大於 100 的整數 | 120 |
| 無效等價類 3 | 0-100 之間的浮點數 | 59.5 |
| 無效等價類 4 | 非數字字符 | “abc” |
關鍵點:等價類劃分不僅要找出有效等價類,更要完整識別所有無效等價類。
邊界值分析#
邊界值分析是對等價類劃分的補充,因為大量錯誤發生在輸入輸出的邊界上。
選取邊界值的原則#
選取正好等於、剛剛大於、剛剛小於邊界的值作為測試資料。
示例:考試成績的邊界值#
邊界值集合:-1, 0, 1, 59, 60, 61, 99, 100, 101
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
最小 | 最小+1 | 及格+1 | 最大+1
邊界-1 最小邊界 及格邊界 最大-1 最大邊界錯誤推測法#
基於對被測軟體的理解、過往經驗及個人直覺,推測可能存在的缺陷。
常見的錯誤推測場景#
| 場景 | 推測內容 |
|---|---|
| Web GUI 測試 | 瀏覽器有快取和無快取下的表現 |
| API 測試 | 第三方 API 出錯時的處理邏輯 |
| 單元測試 | 輸入參數為空時的內部處理 |
降低個人依賴:建立常見缺陷知識庫,在測試設計過程中作為 checklist 使用。
測試覆蓋率#
測試覆蓋率用來衡量測試的充分性和完整性。
覆蓋率類型#
| 類型 | 定義 | 使用場景 |
|---|---|---|
| 需求覆蓋率 | 測試對需求的覆蓋程度 | 傳統瀑布模型 |
| 程式碼覆蓋率 | 被執行程式碼佔總程式碼的比例 | 敏捷開發、CI/CD |
程式碼覆蓋率指標#
// 示例程式碼
public String getGrade(int score) {
if (score >= 60) { // 判定點
if (score >= 90) { // 判定點
return "優秀";
}
return "及格";
}
return "不及格";
}| 指標 | 說明 | 要求 |
|---|---|---|
| 行覆蓋率 | 被執行語句佔總語句的百分比 | 最常用,要求最低 |
| 判定覆蓋率 | 每個判定的真假分支都被執行 | 中等要求 |
| 條件覆蓋率 | 每個條件的真假值都被測試 | 較高要求 |
| MC/DC | 每個條件獨立影響判定結果 | 最高要求(航空等安全關鍵系統) |
覆蓋率的局限性:高程式碼覆蓋率不一定保證軟體品質。程式碼覆蓋率基於現有程式碼,無法發現「未考慮某些輸入」或「未處理某些情況」的缺陷。
覆蓋率的價值#
高覆蓋率 ≠ 高品質
低覆蓋率 = 一定有測試盲區
覆蓋率的真正價值:
1. 找出潛在的遺漏測試用例
2. 識別不可達的廢棄程式碼
3. 為補充測試用例提供依據從需求到用例的映射#
flowchart LR
A[業務需求<br>用戶目標] --> B[軟體功能需求<br>系統功能]
B --> C[測試需求<br>測試點]
C --> D[測試用例<br>具體測試]用例設計的關鍵點#
- 全面識別測試需求:從功能需求出發,無遺漏地識別測試需求
- 綜合運用三種方法:等價類劃分 + 邊界值分析 + 錯誤推測
用戶登錄功能的測試用例設計示例
基礎功能測試:
- 正確用戶名 + 正確密碼 → 登錄成功
- 正確用戶名 + 錯誤密碼 → 登錄失敗
- 未註冊用戶名 → 登錄失敗
- 用戶名/密碼為空 → 提示錯誤
擴展測試:
- 大小寫敏感性
- 密碼框加密顯示
- 驗證碼功能
- 登錄後工作階段逾時處理
- 不同權限用戶的登錄
安全性測試:
- 密碼存儲是否加密
- 網路傳輸是否加密
- SQL 注入防護
- XSS 攻擊防護
- 暴力破解防護
效能測試:
- 單用戶回應時間 < 3 秒
- 高並行場景回應時間 < 5 秒
- 是否存在內存洩漏
兼容性測試:
- 不同瀏覽器
- 不同設備終端
- 不同分辨率
設計好用例的三個秘籍#
深入理解被測軟體的架構:不能把被測系統看作大黑盒,必須了解資料庫連線、讀寫分離、訊息中間件、快取系統等。
- 深入理解架構:設計出「有的放矢」的測試用例集
- 深入理解實現細節:避免只覆蓋「表面」
- 引入覆蓋率指標:需求覆蓋率和程式碼覆蓋率衡量完備性
切記:不要以開發程式碼的實現為依據設計測試用例。開發程式碼的錯誤會導致測試用例也出錯,應該根據原始需求設計測試用例。