1. 程式人生 > >淺談安卓自動化的思路

淺談安卓自動化的思路

一 前言 

什麼是自動化測試?

把以人為驅動的測試行為轉化為機器執行的一種過程,即模擬手工測試步驟,

通過執行測試指令碼自動地測試軟體,自動地完成軟體的單元測試、功能測試、負載測試或效能測試等全部工作。

自動化測試應該從提高工作效率和產品質量的根本目標出發,而不是為了自動化而自動化。

測試用例(test case):

是為了特定測試目的而設計一個特定的使用例項或場景,包括測試條件、測試資料及與之相關的測試規程或操作過程。

測試用例也可以被稱為有效地發現軟體缺陷的最小測試執行單元。

測試指令碼(test script):是進行自動化測試時所編寫的、可執行的一種程式,以實現測試用例的執行過程。

優越性: 高效率 準確可靠 複用性 可以完成手工測試無法完成的測試,適合負載測試、效能測試、迴歸測試。

缺   點: 只能發現軟體系統中30%的錯誤,70%的錯誤要依靠手工測試來發現。

黑盒測試也稱功能測試,它是通過測試來檢測每個功能是否都能正常使用。

在測試中,把程式看作一個不能開啟的黑盒子,在完全不考慮程式內部結構和內部特性的情況下,在程式介面進行測試。

它只檢查程式功能是否按照需求規格說明書的規定正常使用,程式是否能適當地接收輸入資料而產生正確的輸出資訊。

黑盒測試著眼於程式外部結構,不考慮內部邏輯結構,主要針對軟體介面和軟體功能進行測試。

白盒測試 又稱結構測試、透明盒測試、邏輯驅動測試或基於

程式碼的測試。

白盒測試是一種測試用例設計方法,盒子指的是被測試的軟體

白盒指的是盒子是可視的,你清楚盒子內部的東西以及裡面是如何運作的。"

白盒"法全面瞭解程式內部邏輯結構、對所有邏輯路徑進行測試。"白盒"法是窮舉路徑測試。

在使用這一方案時,測試者必須檢查程式的內部結構,從檢查程式的邏輯著手,得出測試資料。

白盒測試工具是對原始碼進行的測試。

二 測試工具分析

現在,已經有大量的Android自動化測試架構或工具可供我們使用,

其中包括:Activity Instrumentation,MonkeyRunner,Robotium,UiAutomator。

還有可以實現跨平臺測試的

Appium

1 單元測試

單元測試就是在開發的是時候,一步步的,一方法為單位的進行測試。

比如說你寫了一個類,這個類呢有很多的方法,你想知道你寫的這個方法到底對不對,那麼你就可以使用單元測試框架進行測試。

它也可以被用作快速檢驗新建工程或進行冒煙測試。

始終,單元測試是作為一種有效的、系統的檢驗應用程式各功能執行的方式。

Android SDK支援JUnit的自動化單元測試,很多測試工具都是複用Junit測試框架。

單元測試可以為邏輯測試,功能測試和使用者介面測試等,不再是專門手動測試移動應用。

Android提供了基於JUnit測試框架的測試API來書寫測試用例和測試程式。

另外,Android還提供了強大的Instrumentation框架,允許測試用例訪問程式的狀態及執行時物件。

第一,  就是java程式設計師最為熟悉和常用的JUnit,,

我們需要在執行單元測試時,一定要 用JDK來執行,利用java命令來啟動JUnit的某個Runner。

如果是用Eclipse的話,可以在Run Configuration裡新建一個JUnit。但是一定要記得在Classpath選項卡里將Bootstrap Entries中的Android Library改成JRE,並且新增junit.jar。

這種方法執行的JUnit執行在JDK之上的,而不是android,所以,只能測試一些和android無關的東西,比如業務邏輯,資料封裝,數值計算等等。並不能測試android api。

android中可利用的主要測試API。繼承自JUnit的TestCase,不能使用Instrumentation框架。

第二,  採用Instrumentation測試框架。

Android 測試環境的核心是一個Instrumentation框架,在這個框架下,你的測試應用程式可以精確控制應用程式。

使用Instrumentation, 你可以在主程式啟動之前,建立模擬的系統物件,如Context;控制應用程式的多個生命週期;傳送UI事件給應用程式;在執行期間檢查程式狀態。

Instrumentation框架通過將主程式和測試程式執行在同一個程序來實現這些功能。

Instrumentation implementation通過的AndroidManifest.xml中的標籤進行描述。

android.app.instrumentaion類分析請參考

你可以將Instrumentation理解為一種沒有圖形介面的,具有啟動能力的,用於監控其他類(用Target Package宣告)的工具類。

Android APIs提供的instrumentation類可以初始化Android應用程式程式碼,允許你監控應用程式的系統互動,配合KeyEvent、MotionEvent類,傳送使用者事件,進而實現GUI 層的自動化。

ActivityInstrumentationTestCase2 用來測試單個的Activity,被測試的Activity可以使用InstrumentationTestCase.launchActivity 來啟動,然後你能夠直接操作被測試的Activity。

侷限性:只能滿足單個活動的功能測試。

2  Robotium

Robotium是android測試中一個簡單而又強大的工具。

說它簡單,是因為Robotium是基於Android測試框架InstrumentationTestCase2進行的2次封裝,把一些基本操作又簡化了一遍。

通過反射等手段,呼叫系統隱藏的功能,實現instrumentation無法實現的功能。

它的文件只有一個Solo類,而且配置步驟是固定的幾步。對程式上的每一個按鈕,文字控制元件,影象,等都可以捕捉到,既可以使用按鈕顯示的名字進行點選,也可以使用座標進行點選。

優點:主要針對某一個APK進行自動化測試,APK可以有原始碼,也可以沒有原始碼,功能強大;在黑盒測試裡面比monekyrunner效率更好,

缺點:針對APK操作,而且需要對APK重新簽名(有工具),因此操作相對複雜;

          需要第三方廠商提供debug版本或者將釋出的版本重新打包簽名,才能將測試用例注入到待測試應用的程序裡面。

3 Monkey

為支撐黑盒自動化測試,Android SDK提供了Money和MonkeyRunner兩個測試工具。

Monkey是一個命令列工具,可以執行在模擬器裡或實際裝置中,它是一種輕量級的效能測試工具。

它向系統傳送偽隨機的事件流,模擬使用者觸控式螢幕幕、滑動Trackball、按鍵等操作來對裝置上的程式進行壓力測試,檢測程式多久的時間會發生異常。

除了生成隨機的事件序列,也支援接收指令碼的解釋執行命令。

可以在monkey的 --help裡面查到。但官方沒有。

不足:

缺少必要的條件判斷等命令,難以在功能測試上有所作為。

將其作為生成隨機事件的工具,測試應用的健壯性。

4 MonkeyRunner

MonkeyRunner工具提供了一個API,使用此API寫出的程式可以在Android程式碼之外控制Android裝置和模擬器。

通過MonkeyRunne,您可以寫出一個Python程式去安裝一個Android應用程式或測試包,執行它,

向它傳送模擬擊鍵,擷取它的使用者介面圖片,並將截圖儲存於工作站上。

MonkeyRunner工具的主要設計目的是用於測試功能框架水平上的應用程式和裝置,或用於執行單元測試套件。

與monkey的區別在工作站上通過API定義的特定命令和事件控制裝置或模擬器。

優點:操作最為簡單,可以錄製測試指令碼,視覺化操作;

缺點:主要生成座標的自動化操作,移植性不強,雖然有python和Java類庫的支援,但是自身提供的API有限,需要通過外掛來擴充套件其功能,功能最為侷限

5 Appium

Google在sdk4.0以後提供了一個自動化解決方案uiautomator:

優點:可以跨應用了;這可是親生的;

缺點:必須sdk4.0以上版本;要想實現的好,最好有開發配合;java專案編譯為jar後需要push到手機才能執行,

Appium 是一個開源、免費的移動端自動化測試框架,可以用來測試原生和混合移動應用,

同時支援測試多種平臺(Ios、Android、FirefoxOS)下應用,是跨平臺的,可以用在osx,windows以及linux桌面系統上,

底層是採用 WebDriver JSON Wire 協議去實現的。

由SauceLabs支援,一家業界領先的測試產品公司, 有成熟的企業測試解決方案。

為什麼選擇appium ?

1.    你不需要以任何方式重新編譯或者修改你的app,就可以在所有的平臺上使用標準的自動化APIs

2.    你可以用你喜歡的開發工具使用任何 WebDriver 相容的語言來編寫測試用例.比如 Java, Objective-C, JavaScript with Node.js (in both callback and yield-basedflavours), PHP, Python, Ruby, C#, Clojure, 或者 Perl 可以使用標準的Selenium WebDriver API和特定語言的客戶端庫.

3.    你可以使用任何測試框架.

依託 WebDriver 意味著你可以押寶在一個已經成為事實上標準的獨立,自由和開放的協議.而不會被限制在任何的專利中

如果在沒有使用Appium的情況,你使用了Apple的UIAutomation庫就只能通過Javascript,並且只能通過Instruments application插樁應用來執行你的測試. 同樣的,在Google的UiAutomator體系下,你只能用Java寫你的測試案例. Appium最終開啟了跨平臺原生移動自動化的可能.

工作原理

Appium驅動Apple的UIAutomation庫提供IOS支援. UIAutomation基於Dan Cuellar’s

Android支援上, 在新版本的Android使用了Uiautomator框架,老版本的android上使用了Selendroid

FirefoxOS的支援依賴一個基於Gecko平臺並且相容WebDriver的自動化驅動Marionette,不過暫不翻譯了.因為暫時用不到

Android

支援版本: android 2.3 平臺及以上

 android 4.2 平臺及以上通過Appium自有的 UiAutomator類 庫支援. 預設在自動化後臺。

 從android 2.3 到 4.3 平臺 ,Appium是通過繫結Selendroid,實 現自動化測試的,

windows

如果你在windows上安裝appium,你沒法使用預編譯專用於OS X的.app檔案,你也將不能測試IOS apps,

因為appium依賴OS X專用的庫來支援IOS測試。這意味著你只能通過在mac上來執行IOS的app測試。這點限制挺大。