一 前言
什麼是自動化測試?
把以人爲驅動的測試行爲轉化爲機器執行的一種過程,即模擬手工測試步驟,
通過執行測試腳本自動地測試軟件,自動地完成軟件的單元測試、功能測試、負載測試或性能測試等全部工作。
自動化測試應該從提高工作效率和產品質量的根本目標出發,而不是爲了自動化而自動化。
測試用例(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。
具體的設置可以參考:http://developer.android.com/guide/appendix/faq/troubleshooting.html#addjunit。
這種方法運行的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類分析請參考
http://blog.csdn.net/zhaoweixing1989/article/details/8532940
你可以將Instrumentation理解爲一種沒有圖形界面的,具有啓動能力的,用於監控其他類(用Target Package聲明)的工具類。
Android APIs提供的instrumentation類可以初始化Android應用程序代碼,允許你監控應用程序的系統交互,配合KeyEvent、MotionEvent類,發送用戶事件,進而實現GUI 層的自動化。
參考:http://www.cnblogs.com/carbs/archive/2013/01/12/2857596.html
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通過多種原生自動化框架來提供基於Selenium的 WebDriver JSON wire protocolapi
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測試。這點限制挺大。