LinkedIn工程師兼Test Butler創建者Drew Hannay寫道,Test Butler是一款面向Android的開源測試工具,它允許開發人員對若干測試環境設置通過編程進行控制,從而使開發人員可以可靠地運行測試。
據Hannay介紹,Test Butler的靈感來自谷歌2014年的演講“環保之路:清理有毒的移動環境”。該演講介紹了如何解決反復出現并影響移動測試的問題,比如缺少可靠性和可再現性、速度緩慢等。Hannay表示,當結果可能受到環境因素影響時,測試就不可靠了,尤其是當它們出現在設備/操作系統層面時,比如Android模擬器的CPU突然休眠,不正常的設備方向變化,隨機出現的鎖屏,意外彈出的系統對話框,等等。所有那些事件都會導致Espresso UI測試失敗。
為了解決這些問題,按照最初的設計,Test Butler將作為一個后臺服務在Android模擬器上運行,提供一些旨在增加測試環境穩定性的特性,比如:
禁用動畫,這是Espresso正常運行所需要的; 通過安裝一個自定義的IActivityController禁用系統對話框; 監控模擬器的鎖屏、Wi-Fi和CPU,保證它們不會休眠。測試中的應用可以和Test Butler進行通信,并控制多個測試環境變量,比如:
啟用/禁用Wi-Fi; 在測試執行過程中通過編程改變設備方向; 模擬不同的定位服務模式,比如,省電模式或者高精度模式; 定義應用程序運行的區域設置。Test Butler的一個關鍵方面是,它使用面向內置Android模擬器的系統密鑰庫進行簽名。也就是說,它會自動取得自己所需的任何signature級的權限,而不需要通過ADB,或者篡改清單文件。
下面的代碼展示了如何設置應用,讓其和Test Butler一起工作:
public class ExampleTestRunner extends AndroidJUnitRunner { @Override public void onStart() { TestButler.setup(InstrumentationRegistry.getTargetContext()); super.onStart(); } @Override public void finish(int resultCode, Bundle results) { TestButler.teardown(InstrumentationRegistry.getTargetContext()); super.finish(resultCode, results); }}當應用和Test Butler的連接建立后,你可以使用TestButler類提供的多種方法控制測試環境,比如修改定位服務模式、設置Wi-Fi狀態、觸發設備反轉,等等。
據Hannay介紹,目前,LinkedIn每天使用Test Butler運行超過1百萬次測試。該工具是開源的,代碼托管在GitHub上。