隨著移動網際網路的深入發展,移動端APP的需求不斷增加,越來越多的數位化企業開始注重其APP的建設。在市場競爭日益加劇的今天,網際網路為快不破的方法論也影響著當下企業的決策。企業紛紛實行移動端產品的快速迭代模式:如阿里提出的2-1-1模式,美團的單周發版節奏等,這也給研發團隊帶來了移動端高效測試的壓力,各大公司紛紛開始了移動端自動化測試的探索與實踐之路。
相較於API自動化測試以及Web自動化測試而言,移動端自動化測試的實施成本相對較高,原因一方面是因為移動端由於Android與iOS兩大陣營都有自己獨立的生態體系,而且相比於Google的Android系統, 蘋果的iOS 系統生態更加封閉一些:如只能依靠蘋果提供的工具鏈等。同時由於開源工具和框架還不夠穩定和豐富,移動端自動化測試面臨了很多新的挑戰:不同的機型,系統版本,解析度,網絡抖動等等,都會影響到自動化測試執行的結果。要想在移動端做好自動化測試,團隊需要制定與其項目相匹配的測試策略與方法。
在設計移動端自動化測試策略的時候,我們可以思考以下幾個問題,看我們能否給出合理的理由:
為什麼要做移動端自動化測試,自動化測試的價值在哪裡
你的項目中質量內建成熟度如何?
如果單元測試足夠覆蓋的情況下,是否還有必要做端到端自動化測試?是否已經有移動端專項測試體系了,如性能,安全,兼容性,穩定性等?
你的團隊是否已經有完善的基礎設施了,如Mobile CI/CD ?
如果連打包,構建,分發都不是自動且持續的,先解決這個問題,再來考慮自動化測試吧。要想富,先修路。
分層測試策略
在不同的層,我們所關注的重點會有所不同。
因此需要使用分層測試策略,制定不同的測試目標:
實現核心穩定的用例自動化,用於每次的迭代回歸測試
對於新功能或者頻繁變動的功能,採用手工探索性測試
APP 的可用性與UX測試,可以引入產品和設計人員參與測試
對於一些UI樣式和兼容性等需求,使用自動遍歷測試
APP的穩定性,可以採用隨機測試,並且採集測試過程中的設備性能數據
APP性能和安全測試,需要採用安全和性能專項測試策略
用例穩定性設計
自動化測試用例的穩定性和可維護性非常重要,關係到自動化的成效,需要關注以下幾點:
1. 使用穩定的測試框架和工具
很多人喜歡造輪子,沒有對開源框架的優缺點進行評估和分析,就開始自己實現一個簡易版的框架和工具,在這裡是不太推薦的,
一個穩定的測試框架是自動化測試的基礎,在規模化的自動化測試工程中,穩定比靈活更加重要。我們可以在開源框架不符合需求的情況下,先進行二次開發,也不要貿然就從零開始自己寫一個。
2. 失敗重試機制,智能等待策略,智能判斷等
自動化測試執行過程中,可能會遇到各種各樣的突發異常,如網絡波動,內存溢出導致APP進程被系統強制殺死等,因此必須要考慮容錯處理,避免因環境的問題導致用例執行失敗。
3. 好的測試用例設計方法
好的用例設計方法,可以使我們的用例具備更好的可維護性以及可讀性。我們可以採用以下幾種業內常用的設計方法:
好的測試框架需要具備以下九個特點:
穩定性(框架必須有很多真實的使用案例,並且有穩定的版本,以及社區持續維護)
可擴展性 (用戶可以很方便進行二次開發)
清晰的架構 (框架的設計必須清晰,模塊化)
易於使用 (讓測試開發人員可以用更多的精力投入用例編寫上,而不是去耗費時間熟悉框架)
跨平臺支持(windows, linux, macos)
可集成性 (可以與不同的CI平臺集成,如Jenkins, GoCD, Bamboo等)
報告 (有易讀的測試報告)
日誌 (有友好的日誌與錯誤提示)
技術棧支持 (可以支持多種語言技術棧工具)
業內有很多開源的測試框架,大部分具備上述這些特點,如開源社區的Robot Frameowork, Cucumber, 提供商業支持的Katalon, 以及阿里的Macaca 和網易的Airtest等,深入研究其中一種即可,詳情可以參見這些項目的官網。
Robot Framework: https://robotframework.org/
Cucumber: https://cucumber.io/
Katalon: https://www.katalon.com/
Airtest: http://airtest.netease.com/
Macaca: https://macacajs.github.io/zh/
選擇移動端測試工具,目前業界使用比較多的移動端自動化測試工具有Appium, 它可以同時支持Android和iOS 模擬器和真機的自動化測試。下圖是Appium的一個技術原理圖。Appium採用B/S架構設計,整體分為服務端和客戶端兩個部分,Appium服務端是用nodejs實現的,提供REST API 服務的一個WEB伺服器,主要是用來管理測試執行和結果反饋的。Appium客戶端則提供了多種語言的三方庫支持,可以方便開發人員使用自己熟悉的語言調用Appium客戶端三方庫來與Appium服務端進行交互。
為什麼Appium是使用最廣的移動端自動化工具,這也與它的設計理念有關:
Appium 的理念
Appium 旨在滿足移動端自動化需求的理念,概述為以下四個原則:
你不應該為了自動化而重新編譯你的應用或以任何方式修改它。
你不應該被限制在特定的語言或框架上來編寫運行測試。
移動端自動化框架不應該在自動化接口方面重造輪子。
移動端自動化框架應該開源,在精神、實踐以及名義上都該如此
自動化測試腳本不僅僅是本地執行,從下圖 DORA給出的《2019 DevOps 報告》中可以看出,持續自動化測試是未來的趨勢,因此必須要將自動化測試腳本集成到CI環境中。
一個好的持續測試需要關注以下四點:
速度 (Speed)
可靠性 (Reliability)
數量 (Quantity)
維護性(Maintenance)
自動化測試工程腳手架
自動化測試工程腳手架的目的是用於快速初始化一個測試工程項目,並且引入一些最佳的規範實踐。同時對測試工程模塊化劃分,更有利於測試用例的開發與維護。
測試腳本版本控制管理
測試腳本也需要進行版本化管理,這樣可以方便多人協作用例的開發維護,同時使用一定的分支策略,也保障了測試腳本的穩定性。
腳本可維護性
BDD + PageObject 構建可讀性與可維護性的用例
用BDD的方式來編寫測試用例,基於Gherkin語法,Given-When-Then 這樣的用例更加易讀。
使用PageObject來對UI頁面和頁面上的操作進行封裝與頁面對象建模,從而實現對上層用例屏蔽底層的具體實現細節,達到更好的功能復用。
我們可以通過一些指標來度量自動化測試的效果,並且快速給出反饋。
測試的因素指標其他細節指標還有很多,可以選擇團隊中關注的部分來統計度量:
自動化測試需求覆蓋率
自動化測試在測試用例中的佔比
自動化測試通過率/失敗率
缺陷逃逸率
缺陷發現率
自動化測試執行時間
自動測試失敗流水線終止比率
Flaky Test不可靠測試用例數
更多.
我們可以用開源的框架和工具快速搭建一套多端自動化測試架構,並且具備高度的可擴展性。
工具清單🧾
通用測試框架:Robot Framework
APP測試工具:Appium
Web測試工具:Selenium
API測試工具:Requests
iOS底層框架:XCUITest
Android底層框架:Google UIAutomator2
持續集成平臺:Jenkins
消息通知平臺:Slack, 企業微信, Email
雲測平臺:Testin, SauceLabs, BrowserStack
執行環境:Docker
1. 如果單元測試足夠覆蓋的情況下,是否還有必要做端到端自動化測試?
從測試金字塔中可以看出,每一層的側重點不同,而且都是不可或缺的。
這是因為單元測試是對軟體中最小的單元進行功能驗證和測試(從內部結構上),完備的最小單元功能的測試覆蓋率並不能保證端到端不出問題。而UI端到端自動化測試是對軟體提供的端到端業務功能模擬用戶操作進行驗收(從外部行為上)。並且基於2/8原則:用戶最常用的功能大致佔軟體所提供功能的20%,我們可以重點保障高業務價值,且穩定的核心功能自動化,加快回歸測試效率,同時可以增強團隊信心。
2. 如果團隊已經實現了95%甚至更高的單元測試覆蓋率,「是否還有必要做端到端自動化測試」呢?
單元測試100%覆蓋率,覆蓋的是什麼,分支?語句?
高百分比的單元測試覆蓋率並不直接等同於高代碼質量,也可能出現需求漏做,異常漏處理等情況。更不能直接等同於業務功能需求的覆蓋率。單元測試有其自身的價值,如增強重構信心等;但是不能說100%的單元測試,就不需要其他測試手段,除非我們明確知道單元測試和外部行為的映射關係,那麼通常我們不太好說單元測試對外部行為的影響,因此也不能完全依賴於單元測試,而是需要多種測試手段從不同維度來保障系統功能正確性。
3. 對於移動端的可測性,目前有無相對成體系的評價標準?
移動端應用的可測性相對於API或者Web UI而言,還是偏低的;網絡/數據,應用狀態,APP內部存儲等都缺乏可觀察性,對可測性也帶來了挑戰;
目前業內也都在探索一些移動端可測性的一些方法,比如通過deeplink來直接進入到待測頁面,避免前序路徑複雜或者難以到達等,或者Mock數據來構造場景驗證UI功能等,不過體系化的評價標準,目前還沒有,大家都還在積累一些實踐經驗。