最近在作Android上的自動化測試,從最初的第三方自動化測試框架appium到後來的Android Support Testing Library,再到最終完成答疑君Android客戶端一些核心流程的自動化測試,期間也是經歷了各類大大小小的坑。這個系列的文章也是想經過描述整個探索道路來記錄一下整個Android自動化測試的入門過程,同時也採用了我本身所喜歡的step by step的模式來介紹整個流程,以便你們能夠很快地操做起來。
可是,在開始的開始,我認爲每一種語言或者特性可能在不一樣的環境中都有不一樣的實現方式,因此有必要在此貼上個人一些開發環境以做參考:
IDE: Android Studio
Android SDK: API Level 23
gradle version: 2.8
build tool version: 23.0.2
測試環境:真機(Nexus 6 with Android 6.0.1; MIUI phones若干)java
曾經和gemini聊到機器人統治地球的問題(這好像是異教徒們的願景orz...),後來想了想自動化測試這個東西其實也是,讓機器去模仿人的行爲,讓它本身去統治整個測試工做。既然是去模仿人的行爲,那實際上也應該認爲機器只能理解人所能理解的東西。比方說,當我去人爲地作一些測試的時候,我所期待的只是UI上的變化能夠符合個人預期,至於它背後的數據是怎樣的實際上我並不care。所以,在作自動化測試時我我的有個最基本的思路:android
把本身當成用戶,只關注我能看到的東西。
好了!終於能夠開始了!既然是採用Gradle進行Android工程的構建,那天然是少不了Gradle的配置啦!根據Gradle官方文檔的說明,咱們首先須要在咱們工程的build.gradle中添加以下配置:segmentfault
android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } }
這裏實際上只作了一件事情,就是爲咱們的工程指定一個TestInstrumentationRunner,TestInstrumentationRunner是用來跑咱們所寫的全部的測試用例的。當咱們採用test的模式來構建工程時,這個Runner便會自動爲咱們執行全部的的測試用例,而且返回相應的測試結果。
另外,咱們還須要在build.gradle中增長instrumentation testing所須要的依賴:app
dependencies { androidTestCompile 'com.android.support:support-annotations:23.1.1' androidTestCompile 'com.android.support.test:runner:0.4.1' androidTestCompile 'com.android.support.test:rules:0.4.1' }
好了!咱們如今有工具來跑測試了,接下來只要添加咱們的測試用例了!因而問題來了,咱們應該在哪裏添加測試用例呢?
若是你在Android Studio中新建一個工程,會發如今src目錄下,和main平行的還有一個androidTest目錄。通常而言,咱們將工程代碼放在src/main/java目錄下,將與之相關的測試代碼放在src/androidTest/java目錄下。以下所示:框架
src/ androidTest/java ----這裏存放instrumentation test相關的代碼 main/java ----這裏存放工程代碼
同時,爲了讓工程更容易維護,建議將相應Class的測試代碼放到相同名稱的包下面,好比,在Package-name下面有一個Class A:ide
src/main/java/package-name/A.java
那麼,建議將A的測試類放到androidTest下面對應的路徑下:工具
src/androidTest/java/package-name/ATest.java
好了!我要開始變身了!下面咱們要向testing的世界say hello了!
我在package-name/module/main包下面有一個AppStartActivity,做爲答疑君的啓動頁。在這個啓動頁上會顯示一段文字,我但願經過自動化測試來確認這個文字確實顯示在了屏幕上。測試
因而,我應該在androidTest/package-name/module/main下面建立一個AppStartActivityTest類,鍵入以下代碼:gradle
package im.dayi.app.student.module.main; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.ActivityInstrumentationTestCase2; import android.widget.TextView; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * Test for AppStartActivity * Created by Anchorer on 2016/1/13. */ @RunWith(AndroidJUnit4.class) public class AppStartActivityTest extends ActivityInstrumentationTestCase2<AppStartActivity> { private AppStartActivity mActivity; private TextView mContentView; public AppStartActivityTest() { // 全部的ActivityInstrumentationTestCase2子類都須要調用該父類的super(String)構造方法 super(AppStartActivity.class); } @Before public void setUp() throws Exception { super.setUp(); // @Before註解表示在執行全部的testCase以前要作的事情 injectInstrumentation(InstrumentationRegistry.getInstrumentation()); // getActivity()方法會在開始全部的testCase以前啓動相應的Activity mActivity = getActivity(); // findViewById()很熟悉吧?找到我要測試的控件 mContentView = (TextView) mActivity.findViewById(R.id.welcome_content); } @Test public void testPreconditions() { // @Test註解表示一個測試用例方法 assertNotNull("AppStartActivity is null", mActivity); } @Test public void testContentDisplayed() { // 這裏就是咱們測試的目標,判斷目標控件的text不爲空 String content = mContentView.getText().toString(); assertNotNull("AppStartActivity Content is Null", content); } }
相關代碼的說明請見註釋。ui
接下來,我要開始跑這個測試用例了。首先,打開Android Studio的Build variants窗口,將Test Artifact設爲Android Instrumentation Tests,而後Synchronize一下工程,會看到androidTest路徑下的背景顏色變成了綠色。
此時,在AppStartActivityTest.java點擊菜單,選擇Run 'AppStartActivityTest...',就能夠從控制檯看到測試已經在跑了:
從控制檯的日誌來看,整個測試過程初期,會向測試設備安裝兩個APK:APP APK和test APK。整個測試結束以後,會看到測試結果:
以上測試結果說明,全部test case所有測試經過。
好了!這就是整個自動化測試的大致流程了!接下來我已經火燒眉毛地想要把Android強大的自動化測試提供的特性分享出來了!!
Android自動化測試-從入門到入門(1) Hello Testing!
Android自動化測試-從入門到入門(2) Testing APIs
Android自動化測試-從入門到入門(3) Espresso入門
Android自動化測試-從入門到入門(4) uiautomatorviewer
Android自動化測試-從入門到入門(5) AdapterView的測試
Android自動化測試-從入門到入門(6) 會玩的Espresso
Android自動化測試-從入門到入門(7) UI Automator