作者:趙麗娜
移動 APP 的 UI 自動化測試長久以來一直是一個難點,難點在于UI的”變”, 變化導緻自動化用例的大量維護。 從分層測試的角度,自動化測試應該逐層進行。 最大量實作自動化測試的應該是單元測試, 最容易實作也最容易在早期發現問題; 其次是接口級測試, 以驗證邏輯為目的進行自動化, 由于接口的相對穩定, 自動化測試成本相對也可以接受; 自動化成本最大的便是UI級自動化測試, 然而UI界面是直接回報給使用者的效果展示,适度的尤其是BVT級的自動化測試也是非常必要的。 本文通過分析幾種自動化架構的異同, 使測試人員在選擇自動化架構時有所參考。

https://developer.android.com/reference/android/app/Instrumentation.html
Instrumentaion 是Android自帶的一個測試架構,是很多其它測試架構的基礎,可以在同程序中加載被測元件。它有很多豐富的高層封裝,使用者可以使用基于instrumentation的其他架構,避免過多二次開發量。但Instrumentation不支援跨應用,導緻基于instrumentation的架構都繼承了這個缺點。
https://github.com/robotiumtech/robotium
Robotium是基于Instrumentation架構開發的一個更強的架構. 對常用的操作進行了易用性的封裝. 用于開發功能性、系統和驗收測試場景。它運作時綁定到GUI元件。它安裝了一個測試用例套件作為在Android裝置或仿真器上的應用程式,并提供用于執行測試的真實環境。
優點: 容易在最短的時間内編寫測試腳本,易用性高。 自動跟随目前activity。 由于運作時綁定到GUI元件,是以相比Appium,它的測試執行更快,更強大。 不通路代碼或不了解app實作,也可以工作。 支援Activities、Dialogs、Toasts、Menus、Context Menus和其他Android SDK控件。
缺點: 不能處理flash和web元件。在舊裝置上會變得很慢。 由于不支援iOS裝置,當自動化測試同時覆寫 android與iOS的情況時,測試會被中斷。 沒有内置的記錄和回放功能.,使用記錄功能需要 TestDroid 和 Robotium Recorder 這樣的收費工具。
https://google.github.io/android-testing-support-library/docs/uiautomator/
UIAutomator是由谷歌提供的測試架構,它提供了原生Android app和遊戲的進階UI測試。這是一個包含API的Java庫,用來建立功能性UI測試,還有運作測試的執行引擎。該庫自帶Android SDK。
優點:它在運作通路不同的程序時,會給JUnit測試案例特權。庫由谷歌社群支援和維護。
缺點:僅支援android 4.1(API level 16)及以上。 不支援腳本記錄。 支援的重點是Java。 你不能獲得目前活動或儀表化。 目前不支援web視圖。 庫僅支援使用Java,是以很難和使用Ruby的cucumber混合。如想支援BDD架構,建議使用Java自己的BDD架構,例如Jbehave。
https://google.github.io/android-testing-support-library/docs/espresso/index.html
Espresso是Google的開源自動化測試架構。相對于Robotium和UIAutomator,它的特點是規模更小、更簡潔,API更加精确,編寫測試代碼簡單,容易快速上手。因為是基于Instrumentation的,是以不能跨App。
https://github.com/calabash
Calabash是一個适用于iOS和Android開發者的跨平台app測試架構,可用來測試螢幕截圖、手勢和實際功能代碼。Calabash開源免費并支援Cucumber語言,Cucumber能讓你用自然的英語語言表述app的行為,實作BDD(Behavior Driven Development,行為驅動開發)。 Cucumber中的所有語句使用Ruby定義。
優點: 有大型社群支援。 清單項 簡單,類似英語表述的測試語句 支援在螢幕上的所有動作,如滑動,縮放,旋轉,敲擊等。 跨平台開發支援(同樣的代碼在Android和iOS裝置中都适用)。
缺點: 測試步驟失敗後,将跳過所有的後續步驟,這可能會導緻錯過更嚴重的産品問題。測試耗費時間,因為它總是預設先安裝app。 需要Calabash架構安裝在ios的ipa檔案中, 是以測試人員必須要有iOS的app源碼。 除了Ruby,對其他語言不友好。
http://appium.io/
Appium是一個開源的、跨平台的自動化測試工具,支援IOS、Android和FirefoxOS平台。 通過Appium,開發者無需重新編譯app或者做任何調整,就可以測試移動應用,可以使測試代碼通路後端API和資料庫。它是通過驅動蘋果的UIAutomation和Android的UiAutomator架構來實作的雙平台支援,同時綁定了Selenium WebDriver用于老的Android平台測試。開發者可以使用WebDriver相容的任何語言編寫測試腳本,如Java, OC, JS, PHP,Python, Ruby, C#,Clojure 和Perl語言。
https://www.gitbook.com/book/lihuazhang/selendroid/details
Selendroid 是一個基于Instrumentation的一個架構. 完全相容Webdriver協定。 Selendroid 可以在模拟器和實際裝置上使用,也可以內建網格節點作為縮放和并行測試。
http://robolectric.org/
Robolectric 是一款Android單元測試架構,但它并不依賴于Android提供的測試功能,它通過實作一套JVM能運作的Android代碼,然後在unit test運作的時候去截取android相關的代碼調用,然後轉到Robolectric實作的代碼(shadow objects)去執行這個調用的過程。是以它不像模拟器或裝置需要dexing(Android dex編譯器将類檔案編譯成Android裝置上的Dalvik VM使用的格式)、打包、部署和運作的過程,大大減少了測試執行的時間。Pivotal實驗室聲稱使用Robolectric可以在28秒内運作1047個測試。
除了實作Android裡面的類的現有接口,Robolectric還給每個Shadow類額外增加了很多接口,可以讀取對應的Android類的一些狀态。比如它為ImageView提供了getImageResourceId()方法,測試者可以通過getImageResourceId()接口來确定是不是正确顯示了期望的Image。
http://robospock.org/
RoboSpock是一個開源的Android測試架構,它提供了簡單的編寫BDD行為驅動開發規範的方法,使用Groovy語言,支援Google Guice庫。RoboSpock合并了Robolectic和Spock的功能。
http://cafe.baidu.com/#panel1
Cafe是百度出品的一個基于Robotium的測試架構,它提供了跨程序的測試解決方案。
http://code.taobao.org/p/athrun/wiki/index/
Athrun 是taobao出的一個移動測試架構,它支援Android和IOS。Android部分是基于Instrumentation,在Android原有的ActivityInstrumentationTestCase2類基礎上進行了擴充,提供了一整套面向對象的API。 IOS上的自動化測試包括注入式自動化架構AppFramework,和基于錄制的自動化架構Athrun_IOS, InstrumentDriver。
其他自動化架構還有應用于穩定性測試的Monkey系列(Monkey, Monkeyrunner, MonkeyTalk), 其中MonkeyTalk 支援iOS 和 Android,它可以為應用進行真實的,功能性互動測試。MonkeyTalk 提供簡單的 "smoke tests",複雜資料驅動的測試套件。MonkeyTalk 支援原生,移動和混合應用,真實裝置或者模拟器。MonkeyTalk 使得場景捕獲非常容易,可以記錄進階别,可讀的測試腳本。還有适用于浏覽器自動測試的Selenium WebDriver,可以真實測試使用者行為,使用者互動如觸摸、手指滾動、長按等,還支援HTML5的一些特性,比如本地存儲、session存儲、應用緩存等。而CTS則是應用于相容性測試的自動化工具, CTS大部分是基于Junit和儀表盤技術編寫的。還擴充了自動化測試過程,可以自動執行用例,自動收集和彙總測試結果。CTS采用XML配置檔案的方式将這些測試用例分組成多個測試計劃(plan),第三方也可以建立自己的plan。
各個測試架構的繼承關系如下, 繼承關系決定了有些架構的先天優勢或先天不足。在實際應用中可以內建多個架構。
基于Instrumentation的測試架構,比如Espresso,Robotium,Selendroid等,都不能支援跨APP使用。 如自動化測試中有跨APP操作,可以二次開發或者結合UiAutomator實作。
支援BDD的自動化架構比較少,可以在calabash 和 RoboSpock及Jbehave之間選擇。
若想同時支援Android和IOS,可選架構有Appium和Calabash,或AthRun。
若為單元測試選擇架構,可選Instrumentation或Robolectric。Robolectric實作了shadow object 類,耗時短。
https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/01-introduction.html
XCTest是蘋果在iOS 7和Xcode5引入的一個簡單而強大的測試架構,它的測試編寫起來非常簡單,并且遵循xUnit風格。XCTest的優點是與Xcode深度內建,有專門的Test導航欄,但因為受限于官方測試API,是以功能不是很豐富。
https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UIAutomation.html
UIAutomation是蘋果提供的UI自動化測試架構,使用Javascript編寫。基于UIAutomation有擴充型的工具架構和驅動型的架構。擴充型架構以JavaScript擴充庫方法提供了很多好用js工具,注入式的架構通常會提供一些Lib或者是Framework,要求測試人員在待測應用的代碼工程中導入這些内容,架構可以通過他們完成對app的驅動。驅動型UI Automation 在自動化測試底層使用了UI Automation庫,通過TCP通信的方式驅動UI Automation來完成自動化測試,通過這種方式,編輯腳本的語言不再局限于JavaScript。
http://www.testingwithfrank.com/
Frank是iOS平台一款非常受歡迎的app測試架構,它使用Cucumber語言來編寫測試用例, Frank包含一個強大的“app inspector”--Symbiote,可以用它來獲得運作中app的詳細資訊,便于開發者将來進行測試回顧。 它允許使用Cucumber編寫結構化英語句子的測試場景。 Frank要求測試時在應用程式内部編譯,這意味着對源代碼的改變是強制性的。操作方式為使用Cucumber和JSON組合指令,将指令發送到在本地應用程式内部運作的伺服器上,并利用UISpec運作指令。
優點: 測試場景是在Cucumber的幫助下,用可了解的英語句子寫的。 強大的Symbiote實時檢查工具。 活躍的社群支援。 不斷擴大中的庫。
缺點: 對手勢的支援有限。 在裝置上運作測試有點難。 修改配置檔案需要在實際裝置上運作。 記錄功能不可用。
http://www.oschina.net/translate/ios-ui-testing-with-kif
KIF是Keep It Functional項目的縮寫,是一款iOS app功能性測試架構,使用Objective-C語言編寫,對蘋果開發者來說非常容易上手,更是一款開發者廣為推薦的測試工具。KIF tester使用私有API來了解App中的視圖層級。但缺點是運作較慢。
詳見Calabash-android 描述。
http://inkling.github.io/Subliminal/
Subliminal是另一款與XCTest內建的架構。與KIF不同的是,它基于UIAutomation編寫,旨在對開發者隐藏UIAutomation中一些複雜的細節。
https://github.com/kiwi-bdd/Kiwi/wiki/Getting-Started-with-Kiwi-2.0
Kiwi是對XCTest的一個完整替代,使用xSpec風格編寫測試。 Kiwi帶有自己的一套工具集,包括expectations、mocks、stubs,甚至還支援異步測試。它是一個适用于iOS 開發的Behavior Driven Development(BDD)庫,優點在于其簡潔的接口和可用性,易于設定和使用,非常适合新手開發者。Kiwi使用Objective-C語言編寫,易于IOS開發人員上手。
IOS自動化測試架構繼承關系如下。 XCTest與 Xcode 的 IDE 直接內建,使用簡單, 但其不支援stub和mock, 是以單使用XCTest架構的較少。 Kiwi是一個iOS平台十分好用的行為驅動開發BDD的測試架構,有着非常漂亮的文法,可以寫出結構性強,非常容易讀懂的測試。 UI Automation是Apple官方提供的UI自動化測試的解決方法,但接口不夠豐富。
KIF、Frank、Calabash都是通過使用代碼的形式來模拟事件觸發,使得被測代碼就像是由使用者行為所觸發的一樣。但這樣的代價是插入一個額外層的複雜度。
IOS測試架構中支援BDD的有calabash 和Kiwi。
可選用的單元測試架構有Kiwi,Specta,Quick等,而KIF,Subliminal和calabash更适用于UI級驗收測試。
http://www.sikuli.org/
Sikuli 是由 MIT 的研究團隊釋出的新型圖形化程式設計技術。它以圖像檢索技術為基礎,提供了一套基于 Python 的腳本語言以及內建開發環境。使用者可利用螢幕截圖直接引用 GUI 元素進行程式設計,完成互動操作。Sikuli 的腳本編寫遵循 Python 文法規範。由于 Sikuli 基于 Python,其核心代碼由 Java 編寫,可在使用者自定義的 Java 工程中将其作為 Java 标準類庫進行引用。
它的腳本是這樣式的:
Sikuli将 GUI 對象的螢幕截圖作為函數的參數直接引用,整個代碼的語義清晰明了,可讀性極強。腳本執行過程中,利用圖像檢索算法分析比對目前螢幕中對應的控件,并對其應用相應的滑鼠或鍵盤操作。這種方式使得我們在腳本編寫時,既無需關心繁瑣的應用程式相關 API 亦不用擷取 Web 内容對象。
它的缺點是:
僅支援windows, MACOSX,和Linux平台,還不支援移動平台。
依賴螢幕截圖,使得1)在不同平台,不同分辨率,不同作業系統上需要維護一套圖形源檔案,不利于跨平台移植;2)若出現程式邏輯外的界面遮擋,則影響程式執行。
但作為現有自動化測試工具的補充,尤其是對無法擷取API的工程,比如flash 動畫, 是非常有效的。
雖然AppGrader不是一流的測試架構,但也有所長。它可以幫開發者将自己的應用與其他衆多同類型應用進行多方面比較,比如圖形和功能。通過對比結果,開發者可以更有針對性地提高和改進自己的應用。目前AppGrader僅支援Android平台。
FlipTest是一個優秀的iOS app A/B測試架構,可為app挑選最佳的UI。FlipTest會基于外觀和易用性等衆多因素傳回測試結果,進而幫開發者解決UI問題。用FlipTest進行測試無需向App Store重新送出應用或者大幅更改代碼,隻需要在app中添加一行代碼,節省了不少時間。