谷歌安卓UI自動化測試策略
原文 http://www.infoq.com/cn/news/2015/04/android-ui-testing
為了使大家確信“應做單元測試,就一定能做單元測試”,谷歌測試工程師Mona El Mahdy專門寫了一篇博客,提出了幾種執行安卓應用用戶界面單元測試的方法。Mahdy推薦使用 Robolectric 和Android Studio Gradle 插件 做常規的單元測試,用 Espresso 或 UI Automator 創建和運行單元測試。
端到端的測試 。Mahdy提出的第一種UI測試方法是E2E。這樣的測試應該可以啟動安卓應用及其所有與之相關的后端系統,使之可以在真實的場景中完成UI測試。重復 執行這些的測試是很困難的,因為“存在很多的影響因素,比如網絡帶寬、實際服務器的認證、系統規模等”,所以就很難做到“E2E測試的調試排查和穩定化處 理”。為簡化這些點,Mahdy也提出了一些其他的測試策略。
用隔離的服務器測試 。 隔離的服務器 是指與外界隔離的服務器,是在本地運行的一臺單獨的服務器,不連接網絡。在運行的時間通過依賴注入(可能需要綁定到這臺服務器的靜態文件)的方式提供與其 他服務器的連接,如果需要的話,還可以在本地文件或內存存儲中偽造一些響應數據。另一個選擇是,為隔離的服務器提供一系列記錄好的響應,以模擬真實終端服 務器的返回值。
針對測試目的,隔離的服務器作為被測系統在同一臺機器上本地運行,其上運行安卓模擬器。雖然這種方式提高了測試的執行速度,有時也會消除一些網 絡連接的碎片,但是它需要單獨的集成測試以確保客戶端應用與后端是同步的。出于這個目的,Google+團隊用了一組“黃金的”需求/響應文件,大家都知 道它們包含了客戶端應用到終端服務器的正確的傳輸序列。用黃金的需求文件根據這臺服務器的所有響應生成一個文件,然后再用這個文件與黃金的響應文件進行比 較。
Mahdy提出,使用隔離的服務器比E2E測試可以更好地完成測試,但是調試卻仍舊是個難題,而且這臺隔離的服務器可能會導致一些通訊碎片。所以,她提出了另一個改進方案。
使用依賴注入( DI ) 。移動應用可以設計成支持依賴注入的,在測試期間有些模塊可以用仿造模塊代替。應用將和仿造的網絡模塊進行通訊,這個網絡模塊為所有請求提供應答,以取代剛才所講的使用網絡模塊的隔離的服務器。這會使UI測試更快更可靠。在DI這一方面,Mahdy建議使用 Dagger 。
多重類庫 。如果安卓應用比較大,Mahdy建議把它分割成更多小的組件,每個和它自己的模塊和視圖把包到一個單獨的類庫中。然后,你們就可以使用單獨的DI、模擬 模塊和測試進行每個組件的開發和測試了。為確保整個應用的運轉,需要集成的測試。這一方式更是進一步提升了測試的速度。
最后,Mahdy總結道:“組件化的UI測試要比E2E測試快得多,并具備99%的穩定性。快速而穩定的測試從根本上提升了開發人員的生產效率。”