〈微軟測試之道〉閱讀筆記
February 13, 2018
測試工程師常見的任務
- 開發測試工具
- 開發針對安全或性能測試的工具
- API 或協議測試的自動化
- BUG 大掃除 ( bug bashes )
- 撰寫測試計畫
- 寫測試案例的文件
- 執行手工測試
- 核心測試範例自動化
從這裡面我可以切出 8 張票
- [ ] 1, 撰寫 scripts 自動測試
- [ ] 1.1. 單元測試
- [ ] 1.2. 效能測試
- [ ] 1.3. 安全測試
- [ ] 2. API 測試自動化
- [ ] 3. 安排時間 Bug bashes (大家一起找 bug)
- [ ] 撰寫測試計畫
- [ ] 添加到規格書中
- [ ] 寫測試案例的文件
- [ ] 針對核心測試範例寫文件
里程碑模式
對項目的版本做規劃,每個里程碑都要有:
- 階段標準 Exit Criteria
- 關鍵功能完畢
- 中期測試目標達到 ( 代碼覆蓋率 + 測試完成率達標 )
- 缺陷目標達到 ( 無 P1 Bug , 第一嚴重 BUg )
- 非功能目標達到 ( 性能, 負荷測試完成, 無嚴重問題 )
各里程碑(M1,M2,M3,Release) 的目標
- M0
- 準備各種定義
- 目標文件
- 專案管理流程
- 發布目標
- 功能規格書
- 功能優先次序表
- 里程碑進度
- 準備各種定義
- M1
- 執行:無要求
- 覆蓋:都能測量並生成報告
- 可靠性:無要求
- 功能:無要求
- 性能:完成性能測試並生成報告
- M2
- 執行:P1 Case 都能執行
- 覆蓋:65%
- 可靠性:解決 M1 中 50% Issue
- 功能:20% 擁有公開介面
- 性能:確立性能基準線與目標性能
- M3
- 執行:P1 Case + P2 Case 都能執行
- 覆蓋:75%
- 可靠性:解決 M2 中 50% Issue
- 功能:50% 擁有公開介面
- 性能:全面性能測試自動化完成
- Private Build:
- 一個介在 M3 與 Release 之間的版本
- Release:
- 所有 Case 都能執行
- 覆蓋:80%
- 解決 M3 中 70% Issue
- 功能:100% 公開介面
- 性能:全面性能目標達到
- MQ:
- Release 之後到下個階段之前,空檔時間能還債
- 大量 debug
- 規劃一個 Code Review 流程
- 衡量所有 bug 哪些 bug 可以在更早之前里程碑解決掉, 並找到衡量方法
- 例如 for 迴圈 20 行
質量門檻
- L1 所有測試都通過
- L2 功能性 Bug 都修復, Issue 都關閉
- L3 性能要求達標
- L4 測試計畫書完成,對所有測試都有提供說明
- L5 所有程式碼都通過審查
- L6 文件完成
- L7 安全性的應對計畫已完成
- L8 代碼覆蓋率達 80%
- L9 所有功能在不同環境中都能正常運作
宏觀視野
- 開發人員的輸出粒度:
- 程式碼 Code
- 函數 functionality
- 產品功能 feature
- 戰術:怎麼工作的更有效率
- 專案 Project
- 戰略&戰術
- 產品線 Product
- 長期戰略
- 業務需求
各階段版本
- LKG (Last Know Good) 已知最近一個符合特定質量標準的版本
- L1 LKG, L2 LKG, L3 LKG, L4 LKG …
- Self-host 自用版 - 內部團隊可以在日常生活中使用的版本
- Visual freeze 介面凍結版本
- 在某個時間點開始視覺效果和 API 介面被凍結, 在發行前不再改變
- debug build 除錯版 裡面支援很多除錯功能的版本
- free build 銷售版 為發行而做各種最後優化得到的版本
- Alpha 目標是得到功能和可用性的初步回饋的版本
- Beta 預定發布的版本,希望得到反饋
測試規格
- 目標與摘要
- 策略
- 功能測試
- 元件測試
- 整合測試
- 互操作性測試
- 一致性測試
- 國際化測試/全球化測試
- 性能測試
- 安全測試
- 安全或部屬測試
- 依賴關係釐清
- 各種度量方法
測試用例
- 驗證測試
- 錯誤避免測試
- 開心路徑
功能測試
- 等價類劃分 Equivalence class partitioning ECP
- 如何對等價類劃分為合法和非法子集? 變數分解
- 過量分解會造成 false negatives / false positives
- 總是避免冗餘測試
- 四種啟發式方法
- 範圍
- 分組
- 唯一值
- 特殊值
- 子集分類以 v 開頭 ex: v1, v2, v3, v4
- 建立 "測試設計矩陣"
- ECP 目的主要是暴露 "單點故障"
- 單點故障假設 : 通常系統很少是 2 或多個故障共同作用的結果
- 如何對等價類劃分為合法和非法子集? 變數分解
- 邊界值分析 BVA
- 邊界值的測試數量可以用 4n+1 來計算, n = 獨立參數個數
- 建立 BVA 測試矩陣
- 隱性邊界
- 不是所有邊界都能透過數字輸入輸出確定
- 例如視窗高低, 循環指令的邊界
- the deja-vu heuristic 定義最小邊界值和忽上忽下於邊界值的數值
- 循環指令的邊界以內, 不准進入錯誤處理分支
- 循環指令的邊界上和外,必須初始化錯誤處理分支
- 組合分析
- 對於半耦合 (semicouple) 的參數的測試方法
- 分支測試 EC
- 對每個變數都測試至少一次
- 基準測試 BC
- 指定一組變數作為基準來測試
- 通常是快樂路徑常用的變量狀態組合
- 正交陳列 OA
- 組合測試 t=n
- 可以隨機化生成這些矩陣, 方便提高廣度
- 矩陣中的配對, 可以盡可能找到合適的覆蓋率
- 以及可以接受的未覆蓋函數量
- 窮舉測試 AC
- 分支測試 EC
- 對於半耦合 (semicouple) 的參數的測試方法
- 標準覆蓋率
- 這個階段主要依賴腳本化測試
- 實際可達覆蓋率
- 這個階段透過探索性測試
- 並再依定情況開始採用結構測試
結構測試
- 塊狀測試 Block Test
- 針對程式碼中的一個個 Block 做測試
- 另一個重要性是在異常處理 Exception Handling
- 決策測試 Decision Testing
- 主要對 if/else 來測試
- 不能有效評估複合條件判斷流程
- 條件測試 Condition Testing
- 多個條件語句 AND/OR 組合而成
- 劃出控制流程圖
- 在寫出函數中各個條件的 true/false 的測試矩陣以及期待值
- 基礎路徑測試 Basic Path Testing
- 對整個控制流程進行測試
- 圈複雜度 cyclomatic complexity
- 基礎路徑技術 baseline path technique
- 簡化基礎路徑技術 simplified baseline path technique
- 實用基礎路徑技術 practical baseline path technique
程式碼複雜度
- LOC 程式碼行數
- 圈複雜度 cyclomatic complexity
- 1-10 低風險
- 11-20 中等複雜度
- 21-50 高度複雜度
- 50+ 非常高風險/不可測試
- 圈複雜度高不代表缺陷就多
- 煙霧警告度量:煙多不保證火災
- Halstead 測量
- 主要用於衡量可維護姓
- 對物件的測量
- 類權重方法 WMC 類中的方法數
- 繼承樹深度 DIT 一個類繼承的類總數
- 物件間耦合度 CBO 一個類引用其他類的總數
- 扇入扇出 fan-in/fan-out 衡量一個類有調用到其他類多少次
- 如果一個類方法被調用 5 次而這 5 次會造成他調用其他 10 個類
- 那扇入就是 5 而扇出就是 10
基於模型的測試
- MBT Model-based testing
- 基於模型的刺是不是為了 end-to-end scenario
- 而是為了中間的過程變化
- smart monkey test 聰明猴子測試, 隨機行走
- 在整個模型流程中隨機執行跳轉各步驟
Bug 處理流程
- 運行測試 -> 建立 bug 報告 -> 三方會審 triage
- 重現 Reproduction
- How Found: 怎麼重現錯誤
- Issue Type: 程式碼問題, 設計問題, 文件問題
- Bug Type: 安全, 性能, 功能 …
- Source: 測試來源
- 缺陷沒有被批准就不修正
- 重複的 bug (duplicate)
- 推遲 Postpone
- 外部錯誤 External
- 設計錯誤 By Design
- 批准了就要開始調查 inverstigation approved 看是什麼問題
- 必須修正 Must Fix
- 應修正 Should Fix
- 有時間就修正 Fix if time
- 提出如何修正
缺陷的衡量 Metric
- 修復的缺陷/所有解決的缺陷相對其他 Issue 的比例
- 用這個來衡量開發處於早期還是晚期
- 各種程式語言/平台的缺陷比例
- 衡量環境問題和開發的是否有特定領域瓶頸
- 缺陷發現率
- 太高或太低都要擔心, 對峰值進行解釋
- 錯誤修正率
- 當標準提高後, 修正比例應該下降
- 根據不同領域來看缺陷數
- 可能那個領域需要更多測試或協助
- 不同嚴重性的缺陷數
- 隨著發展嚴重性S1,S2 應該要像降, 而S3,S4會上升 Severity
- 一般期待在早期發現更多嚴重的缺陷
- 缺陷重新復發比率
- 這是一個衡量程序修正質量很好的標準
- 當專案快要結束時, 這個會開始變多和達到最大
- 平均反映缺陷時間
- 跟蹤開發團隊對缺陷的反應速度
- 平均關閉缺陷時間
- 反映大家對問題的解決速度
- 缺陷門檻 (缺陷 bars)
- 指一個開發人員在一定時間內所能接受的缺陷數量
- 當超過這個數量介會被停止開發功能, 必須立即修補缺陷
- 但也可能被濫用, 大家分工缺陷量
測試用例模板
- 測試用例編號
- 功能區
- 功能分區
- 優先級 (1,2,3,4)
- 類別 (功能性?性能?負載?)
- 頻率 (每次構建?)
- 版本驗證測試 BVT
- 每夜測試
- 里程碑測試
- 內部迭代至少一次
- 測試時間
- 運行方式
- 手動/半自動化(需要一定程度手動)/自動化
- 描述
- 測試目的
- 到底要驗證什麼
- 初始條件和背景
- 確定那些條件是重要的先決條件
- 步驟(測試點 Test Point) 1.
- 測試目的
2.
3.
- 預期結果
- 通過 Pass
- 受一個具體的檢查點 checkpoint 規範
- 備註
自動化測試
- 設置 Setup
- 將環境設定好
- 執行 Execution
- 執行測試的特定步驟,充分錯誤處理,其他相關工作
- 分析 Analysis
- 分析為什麼失敗
- 報告 Reporting
- 報告包含日誌/資料庫/其他分析結果文件
- 清理 Cleanup
- 清理當前環境狀態已讓下次繼續進行
- 幫助 Help
- 在其測試生命週期如何保持可維護性
- 測試日誌應該包含的元素
- 測試ID Test ID
- 測試名稱 Test Name
- 環境訊息 Environment Information
- 被測程式訊息 Application Under Test Information AUT Info
- 測試結果 Test Result
- 測試結果的分類
- 通過 Pass
- 失敗 Fail
- 跳過 SKip 跳過環境不支援的特定測試
- 放棄 Abort 測試失效時就直接放棄
- 阻斷 Block 被阻止不會讓測試失敗率更加增高
- 警告 Warn 雖然通過了旦指出需要更細緻檢查某些地方
其他工具
- churn 改動: 在一段時間內, 文件和模塊被修改的次數
- 也就是被改動的次數
- 修改次數
- 增加行數
- 刪除行數
- 修改行數
- 也就是被改動的次數
- Total churn 可以顯示出在哪個地方可能有最多潛在 bug
- 驗收測試 BATs Build acceptance tests/ BVTs Build verification tests
- 應該每天或更頻繁的 Build
- rolling builds 滾動構建
- 自動同步到最新的 code
- BATs 比 BVT 範圍小一點
- BVT 屬性
- Automate Everything (在每次 Build 前運行)
- Test a little (驗證基本功能的簡單測試, 確保構建可被用於測試)
- Test Fast (要求快速幾分鐘測試, 快速給予反饋)
- Fail Perfectly 如果 BVT 失敗要立即修復失敗的地方
- Test Broadly not Deeply 盡可能多涵蓋關鍵功能
- Debuggable and Maintainable (BVT 會自動到 code 裡面找哪個change造成)
- Trustworthy 可信 (要能信任 BVT 通過)
- Critical 關鍵 (BVT 應該由最值得信賴的人建立)
- 程式碼分析成本 Code Analysis Overload
- 全新項目早期分析的缺陷幾乎注意不到
- 成熟階段使用帶來額外工作量
後記
花一個晚上看完,覺得收穫良多,裡面還有推薦很多參考書籍,未來可以看看
Buzz Word
- TTM ( Time to market ) 產品從構思到銷售的總時間
- assign 指派修正
- postpone 推辭處理 -> 技術負債
- 不要聽河馬的
- 河馬 HiPPO ( Highest Paid Person's Opinion ) 指最高薪資的人
- BDUF - Big Design Up Front 指各種費時的預先設計和撰寫文件的動作
- look and feel 外再體驗