鋪墊:敏捷開發價值觀、原則與實踐

有什麼開發,就有什麼測試,傳統開發就有傳統測試,敏捷開發就應該要推行敏捷測試。在討論敏捷測試前,應該先理解敏捷開發模式,否則理解敏捷測試會很困難。

敏捷開發是一種思想或稱作方法論,通過不斷迭代與增量發布,最終交付符合用戶價值的產品。

書中提到一些敏捷開發的歷史、演進與框架

  • PDCA 循環
  • 輕量級軟體開發 減少複雜的文件,強調人員的互動
  • 敏捷宣言
  • XP(eXtreme Programing):較多是著重在軟體開發,例如 TDD、pair programing、CI 等等。
  • BDD(行為驅動開發):使用「通用語言」來描述測試案例,將 User Story 的細節進行完整地描述。 Feature(特性): 購物車功能 Scenario(情境): 添加商品到購物車
    • Given(假設): 用戶已經登錄到購物平台並且正在瀏覽商品
    • When(當): 用戶點擊某個商品的「添加到購物車」按鈕
    • Then(那麼): 該商品應該被添加到用戶的購物車中
    • And(並且): 購物車中的商品總數應該更新
  • FDD(特性驅動開發):使用制式結構來建構特性列表

<action> the <result> <by|for|of|to> a(n) <object>

  • Scrum:確保每天、每個階段都向著目標明確進行的一種「方法」。 推薦看 Scrum 提倡者自己寫的 SCRUM:用一半的時間做兩倍的事

DevOps 與敏捷的關係

DevOps 可以看作是敏捷的延伸,打通軟體開發、測試、交付、維護中的層層牆壁。

敏捷宣言

藉著親自並協助他人進行軟體開發,我們正致力於發掘更優良的軟體開發方法。透過這樣的努力,我們已建立以下價值觀:

  • 個人與互動 重於 流程與工具
  • 可用的軟體 重於 詳盡的文件
  • 與客戶合作 重於 合約協商
  • 回應變化 重於 遵循計劃

也就是說,雖然右側項目有其價值,但我們更重視左側項目。


敏捷測試之道

敏決測試不是一種測試方法,而是為了適應敏捷開發而設計的一套軟體測試解決方案。

敏捷測試宣言

  • Full Lifecycle Testing OVER Isolated Testing Phase
  • Team Shared Responsibility OVER Testers Ensure Quality
  • Continuous Targeted Automation OVER Widespread Regression Testing
  • Quality Built-in OVER Defect Detection

Full Lifecycle Testing

強調測試左移與右移,並非將測試「移動」到兩個端點,而是全程測試的介入。

  • 左移:更好的理解需求,減少理解不一致的浪費。
  • 右移:充分利用生產環境的數據來最佳化開發、測試流程。

Team Shared Responsibility

強調團隊一起為軟體品質負責。

Continuous Targeted Automation

強調不要一昧的追求程式碼測試的覆蓋率,是要追求精準的業務邏輯覆蓋率。 不讓軟體隨著程式碼的迭代,而被破壞。同時功能的迭代也會需要新增、修改測試的涵蓋。

Quality Built-in

測試是全程參與的,並非到了最後才在驗收。

固定性思維、成長性思維、敏捷思維

The power of believing that you can improve 其實敏捷思維就是(但不完全等同)成長性思維,回歸到測試領域,我們可以切換我們的 Test mindset

場景 固定性思維 成長性思維
被批評測試能力弱 我不是一個優秀的測試工程師 我目前的能力就是這樣,但我會努力
Mgr 表揚了另一個測試工程師 我不如他 他是怎麼做得、我應該去問問他如何辦到的、我該如何超越他。
軟體上線後遇到問題 我就爛、或怪給開發人員。 我該如何避免再次發生。
任務太多了 我做不完 我該如何做得更快

Scrum 下的測試流程

持續測試:

  • 測試需求分析與定義:確保 Story 是具有「可測試性」。
  • 測試計畫:根據上下文調整、完整化測試目標、測試項目。
  • 測試設計:粗粒度的測試設計,例如事件流程、狀態變化。
  • BVT(版本建構測試):包含冒煙測試、程式碼弱掃、靜態分析,確保這個程式是能被建構成版本的,通常是能自動執行的。
  • 持續測試:PR、單元測試、回歸測試、性能測試等等都涵蓋在這裡面。確保了軟體的品質。
  • 版本驗收測試:從業務邏輯出發的 e2e 測試。
  • 測試交付與反思:找到測試不足的地方並完整化軟體測試。

其他敏捷測試的通用流程:BDD、TDD、ATDD、FDD 等等,不在此贅述。

不僅要把 bug 回報給開發人員,更要藉此去挖掘品質風險與問題的本質,例如可能是溝通有問題對需求沒有理解等等。


人是決定性因素

敏捷團隊究竟需不需要專職測試人員

Modern Testing Principle 的第七條:把測驗的方法和能力擴展到整個團隊,並認同團隊會逐漸減少或取消專職的測試專家存在。

微軟與 Google 幾乎沒有測試團隊,也很少專職測試人員,取而代之的是 Engineering productivity,不為產品做測試,而是為開發人員提供測試工具和技術。

顯然的答案不是簡單的要或不要。

什麼情況可以考慮沒有專職的測試人員

  • 「品質內建」的團隊文化已養成,每個開發人員都為軟體品質負責
  • 軟體是以 Saas 發布,具有灰度發布機制、能快速部屬與回滾。
  • 軟體並非重要業務(例如金融與電信、航空、核能等等無法回滾的)

回顧「成長性思維」,每個人不是天生的專家,開發人員透過參與測試,便能累積軟體開發實需注意的眉角,回饋到開發上避免缺陷的產生。

測試負責人(Test Owner)

你公司不是 Google,你公司還不是 Google,你公司本來就不是 Google。

Test Owner(TO) 是以敏捷中最流行的 Scrum 方式來定義這個角色的名字 也可以稱為測試教練、測試顧問或者QA 叫什麼不重要,重要的是這個角色要承擔哪些責任:

  • 制定軟體產品研發的迭代測試計劃
  • 協調測試計劃的執行
  • 促進提高軟體的可測試性
  • 指導團隊成員進行測試工作
  • 承擔部分QA責任

如何創建有強烈品質亦是的學習型團隊

該如何應對有限的專職測試人員的情況

  1. 擁有共同的目標:品質就是客戶的滿意度。例如阿里巴巴的品質文化就是「讓客戶百分之百放心」
  2. 營造良好的品質文化氛圍:例如騰訊每週從客服團隊抽 10 則客戶投訴的錄音來播放。
  3. 創建學習行團隊:要讓團隊成員「永不滿足於現狀」

如何更好地為測試而學習

  1. 系統性的思維訓練 軟體測試全景圖
  2. 創造性思維訓練 視訊會議臨界測試圖
  3. 借力提昇自己
    1. 看大神的 blog
    2. 參與研討、會議、工作坊

產品、測試、開發如何協作

回顧一下敏捷宣言的第一項:「個人與互動 重於 流程與工具」,在談使用什麼工具前,應該先減少團隊內的困難。

達成共識後,溝通的技巧

  1. 要有勇氣回報品質問題
  2. 高情商: 比如在需求評估時,發現了需求的問題,不要說「我認為這個地方是不對的」,可以這樣說「假如我們是用戶,在某個場景下,如果碰到這種情況,我們大概會這樣處理,而不會那麼處理,對吧」
  3. 不要指望團隊會「自然」的更好,要持續努力前進。

建構強大的敏捷測試基礎設施

CI/CD、IaC,對 infra 也要進行測試(針對 IaC 的部份)

虛擬化技術的應用

  1. containerize
  2. sidecar
  3. numa & dpdk
  4. hoverfly
  5. molecule
  6. k8s
  7. 自動部署
  8. Ansible & Chef
  9. IaC 工具:Terrafrom & CloudFormation
  10. 管道即代碼(PaC):Concourse & Drone(CI)
  11. Serverless

其他

如何完成全自動的 BVT 靜態測試與測試報告生成 單元測試框架


測試左移更體現敏捷測試的價值

TDD/ATDD/BDD/DDD

ATDD

Acceptance Test-Driven Development,接受測試驅動開發 並不是什麼高深的技巧,鼓勵團隊成員(包括產品擁有者、開發者和測試者)在開發過程的早期合作,以確定和了解需求。

寫單元測試不一定要採用 TDD,但開發需求不能不採用 ATDD。ATDD 之所以重要是因為大家都遇過:

  • 需求分析還沒理解清楚、甚至還沒有定案,就- 進開發。
  • 開發到一半發現哪裡怪怪的,才回去問 PM,發現根本開發錯方向。

如果一開始就把事情作對,那成本是最低的。這也是測試左移的精神所在

可測試性

需求的可測試性:在敏捷終究是 User Story 的可測試性,User Story 需要明確的描述,且需求要是可被測試的。

  • 差:作為一個註冊用戶,我希望能快速登錄到系統。 問題:究竟快是多快,十個人有十種答案。
  • 優:作為一個購物網站的買家,我希望可以查看查詢歷史訂單,以便查看某個訂單的詳細情形。 以下展開細節討論:
    • 需要被查詢的歷史訂單是多久以前的?預設是一年的。
    • 是否支持模糊查詢?是。
    • 如果沒有查到,該如何提示?顯示零筆紀錄。
    • 默認排序是?倒序。

不可忽視的設計評估

傳統開發下,測試人員很少參與設計評估,也會導致測試案例與需求與實做大相逕庭 更細一點會關注 Design Doc 內有沒有做冗餘設計、UI 套件能不能支援多數瀏覽器、涉及身份驗證的模組有沒有做權限控管等等

範例

場景:線上圖書館管理系統

假設我們正在開發一個線上圖書館管理系統。其中一個功能是,用戶能夠搜索並借閱書籍。

1. 定義需求

首先,產品擁有者、開發者和測試者共同定義用戶故事。例如,用戶故事可能是:“作為一個圖書館會員,我想要通過書名搜索書籍,以便找到並借閱它。”

2. 創建驗收標準

團隊合作創建驗收測試。這些測試應該是具體的、可測試的標準,它們描述了用戶故事的成功條件。例如,一個驗收標準可能是:“當我輸入‘哈利·波特’並點擊搜索時,系統應該顯示所有與‘哈利·波特’相關的書籍。”

3. 實施驗收測試

在開發功能之前,測試人員或開發人員會根據驗收標準寫出自動化的驗收測試。這些測試最初將會失敗,因為功能尚未實現。

4. 開發功能

開發團隊接下來會根據用戶故事和驗收標準開發功能。他們的目標是使之前編寫的驗收測試通過。

5. 重複測試直到通過

開發過程中,自動化的驗收測試會被不斷地執行,以確保新開發的功能符合需求。一旦所有的驗收測試都通過了,這個用戶故事就被認為是完成的。

6. 交付和回顧

完成的功能被交付給產品擁有者和用戶以進行確認。團隊可能會進行回顧,討論過程中的學習點和改進機會。


敏捷測試的分析與計畫

敏捷測試的主要風險在哪

無論用什麼技術與方法,測試都是不徹底的,我們無法保證經過測試的軟體不存在任何缺陷。

  1. 需求不清晰 溝通做得不好、沒有定義驗收標準、優先級定義有誤
  2. 需求頻繁變更 即便敏節能快速面對變更,但仍會需要變更 User Story 與優先順序
  3. 時間太緊張 再怎麼敏捷也無法只用一個月幹掉 OpenAI
  4. 自動化測試的有效性 例如 3rd API,若第三方破壞性的變更了 req/res,那測試也會壞掉 自動化時間過長,提供反饋的速度較慢

探索式測試與基於腳本的測試

探索是測試也就是打開 APP/WEB,開始亂點亂按,「自由」的進行測試,最極端的探索性測試就是連猴子都會用。 基於腳本的測試則為照著定義好的路徑走一遍,最極端的 ST 則為程式碼的自動化測試。

敏捷擁抱探索性測試,回歸到敏捷宣言:可工作的產品 勝於 詳盡的文檔,操作起來很怪的產品,即便 unit test 寫的 100% coverage 還是大便。


敏捷測試的設計與執行

這個章節稍微介紹了 DoD

Story:作為購物網站的買家,我要通過商品名稱查詢歷史訂單

驗收標準:

  • 預設查詢過去一年的訂單
  • 如果沒查到,詢問用戶是否選擇一個查詢的時段,不選擇就退出
  • 用戶可以任意選擇起始、結束,以十年內為限,跨度不超過三年。
  • 支持模糊查詢
  • 按匹配度來排序,其次為時間
  • 每頁最多十筆
  • 只顯示訂單編號、訂單名稱、價格、日期
  • 點擊可以查看訂單詳情

轉換為場景(使用者路徑)

  1. 什麼都沒輸入
  2. 輸入關鍵字、選擇了時段(無效時段)
  3. 輸入關鍵字、選擇了時段(有效時段)
  4. 輸入關鍵字、沒有選擇時段 -> 沒有查到結果
  5. 輸入關鍵字、沒有選擇時段 -> 有查到結果 -> 點擊詳細頁面後退出
  6. 輸入關鍵字、沒有選擇時段 -> 有查到結果 -> 點擊詳細頁面後退出 -> 再點擊另一個

再來介紹了事件流與有限狀態機

探索式測試

主要是來檢驗傳統測試上可能被忽略的測試。

帶著批判性思維來進行探索,這邊的批判性並非是溝通上的尖銳,而是指不斷「提出」問題(質疑系統)並構思使用者會不會被指引到錯誤的路徑。

角色扮演

例如 Udemy 類型的線上課程 APP

  • 30 歲 996 單身男工程師,每天大眾交通通勤上下班,消費能力驚人,會購買大量的課程但沒有時間看。
  • 16 歲天才男高中生,每天姐一堆數學問題,可能不會花這麼多錢在購買課程上,但會花費大量時間在反覆閱讀艱澀的課程。
  • 25 歲黑客,專門在跨過付費牆,即便這是非法的。

探索未知的,自動化已知的


測試右移,從敏捷到 DevOps

線上壓力測試

  • 情境
    • 雙 11
    • 巴魯司
  • 流量回放: 模擬真實流量、放大或縮小流量 https://github.com/buger/goreplay
  • 調用鏈:tracing
  • 混沌工程:例如 Chaos Monkey,隨機中止生產環境的機器,進行災難演練。

敏捷測試的收尾與改進

如何分析測試結果與評估測試工作的品質

從理論上來說有很多面向,覆蓋率、缺漏率、測試效率、驗證週期

以敏捷的角度來說:看重什麼,就度量什麼;想提高什麼,就度量什麼。

  1. 程式碼覆蓋率
  2. 功能覆蓋率:所有測試案例分解為子功能、子子功能後,每個小 function 的 function point:test case 的 function point / total function point。
  3. 業務覆蓋率:使用者路徑的覆蓋率:已覆蓋的場景/需要測試的場景。
  4. 缺陷分析測試品質:誤報率,無效的 bug / 總回報的 bug

敏捷過程的反思與持續改進

守-破-離:

  • 守:固守最佳實踐,也可以照搬成熟的方法、框架。
  • 破:慢慢領悟背後的原因,在結合自己的團隊進行改變。PDCA
    • Plan
    • Do
    • Check
    • Action
  • 離:不斷實踐、創新、再實踐,慢慢形成自己的敏捷測試方法,脫離既有框架。

敏捷測試的展望

人工智能助力敏捷測試

  • 基於圖片識別,協助 UI 測試
  • 測試數據、測試腳本自動生成
  • 程式碼深度分析

敏捷測試工具的未來

  • 智能化
  • 雲化
  • 機器人過程自動化
  • 模型化
  • 新的技術領域(萬物互聯)
  • 無代碼化
  • 敏捷化

Reference