自動化測試框架與測試工具實務經驗分享
這篇文章主要引用一個筆者很喜歡的自動化測試框架圖,
根據這個圖,筆者分享自己專案與上課學員的一些經驗。
到底 “自動化測式框架”是什麼? 要完成哪些事情? 有哪些工具可以幫忙?
測試哪些物件?建議的程式語言?
軟體開發週期
在介紹自動化測試框架與技術之前,先看看這張圖了解測試的策略與團隊的 Team practices.
Team Practices 指的是整體的自動化測試要有效果與效率需要整個團隊配合。各個不同時間的測試活動規劃建議如下:
每個 Iteration 規劃時:
- 紀錄整個系統的相互依存關係,例如所需要的測試資料、測試環境或是系統需求等
- End to End 的測試流程,從最終使用者觀點來看,完成之後整個使用流程
- 整合測試
測試執行時
- 單元測試: UnitTest。對於開發人員來說這可能是一個額外的負擔或是夢靨。不是QA之後會進行功能測試、整合測試、End2End測試嗎?為什麼還要事先進行單元測試。筆者聽過一個比喻還不錯。我們知道飛機零件有上千萬個組合而成。一架飛機只做最後的試飛測試。另外一架飛機每個零件都經過完整的測試,每個部份的組合也經過組裝的模組測試。如果你知道測試的過程,你會要搭哪一架飛機?
- 功能測試
- 整合測試
Iteration 驗收
- End to End 測試
- 整合測試
- 效能測試
- 安全測試
筆者特別提出效能與安全測試,這是最被容易忽略的部分。
通常會在產品主要的設計與架構完成不會有大的修改時進行。
效能測試包含負載測試、壓力測試。
一個是看目前系統在 100, 1000, 100000等使用者或是流量下長時間的系統反映。
壓力測試另一個是看系統在極端高負荷的情況下,系統的錯誤處理。
安全測試主要是針對系統的保護與安全機制測試。一般我們可以參考 OWASP Top 10的網站風險進行測試。
測試的本質在於預防
從這張圖可以看得出來,Defect越早發現對於產品品質與成本都會有正向的幫助
要做哪些事情可以幫助 Defect的預防呢? 這時候測試與開發團隊就要緊密的合作
- Pair programming: 兩個人相互檢查程式碼。
- Continuous Integration:透過自動化程式與持續集成 (Jenkins)整合達到 CI.
- TDD: 通常針對每個程式的段落進行 Unit Test。Java 可以使用 TestNG or JUnit。Python可以使用 UnitTest
- Requirement or Design review: 可以透過 Design Review 盡早把程式重大的缺失找出來或是從需求面釐清都會對於品質提升有幫助。例如:需求為支援IE, FireFox, Chrome瀏覽器。但是是支援最近三個版本呢? 還是最新五個版本? 這些都會影響未來相同性測試與設計上的不同。有些元件不相容只能用在特定瀏覽器等。這些問題其實都可以在 Requirement or Design review 的時候就發現。
測試標的物
測試的標的物會影響測試的方法與工具。筆者說幾個比較特別的。
- 資料庫: 資料的測試主要在於資料的準備、資料庫效能、架構設計上的Clustering/High Availability。採用NoSQL or SQL? 關聯式資料庫更強調 ACID的機制而NoSQL則是在於讀取效能與分散式資料處理的優勢。這些也是設計上或是測試要考量。
- 網頁
- 後端服務: 後端服務著重於 high Availability。因此主要在每次上線的測試、與上限後是否有持續監控自動化、當發生異常時的通知與回覆。
- 模組
- 手機 app: 手機測試有許多的工具。筆者推薦 Appium。因為Appium將 iOS or Andorid 與測試程式分離。只要學會一種程式語言透過 Appium就可以做不管是iOS 或是 Android的自動化測試。
- 架構
程式語言
到底自動化測試程式語言或是框架用哪一種程式語言比較好? 如果是 unitTest 那麼絕對是看該產品開發的程式語言是什麼決定。
除了 unitTest 之外的測試,例如 End2End 測試、整合、相容性等測試,可以使用的測試自動化程式語言很多。
筆者建議是:
- 選擇可以跨平台的。多半的程式語言都有這個特性。所以,可以選擇自己或是團隊比較熟悉的程式語言。
- 擴充性套件。Java or Python 對於擴充性的套件都有很多成熟的選擇。這邊指的擴充性套件像是 unitTest 、TDD、BDD、Testing report、Testing Execution等。
測試框架
筆者這邊指的框架為提供一定的自動測試步驟重現、驗證、測試結果等功能。
測試領域 |
解決的問題 |
測試框架/工具名稱 |
|
Record & Replay | 可以不需要寫程式就可以完成基本的自動化工作。 | Selenium IDE | |
分散式測試環境建構 | 透過多台電腦執行不同環境的相同性測試與縮短測試時間。 | Selenium GRID | |
網站的 End to End 測試 | 啟動瀏覽器模擬人的操作與驗證行為 | Selenium WebDriver | |
Testing Execution & Report | 測試個案的執行與測試結果報告 | Python Nose/PyTestJava TestNG | |
AutoIT | Windows UI | ||
Behavior Driven Testing | 透過使用者最後驗收的 user story 才進行驗證 | Java Cucumber/JbehavePython behave | |
TDD | 先定義設測預期的結果,再進行程式的開發。測試、開發、調整。 | Java TestNG/JunPython unitTest | |
Data Driven Testing | 測試時透過資料輸入的不同,自動測試成為不同的測試個案。 | Java TestNGPython DDT | |
效能測試 | 效能測試 | Bad BoyJmeter | |
雲端服務監控 | 從世界各處監控雲端服務的反應時間。 | Beatsoo | |
安全測試 | 安全性測試。 | ZAP | |
Page Object | 主要讓測試程式邏輯與網頁元件的位置相互分離。未來網頁元件有修改時,程式可以不會受到影響,比較容易維護。 | 套用Java or Python
物件導向的寫法 |
|
Continuous Integration | 當我們希望測試程式可以每天在 build 整合完成之後,可以自動呼叫策是執行執行。 | JenkinsGIT/SVN | |