Android自動化測試-從入門到入門(1)Hello Testing!

BrentonTuck 8年前發布 | 41K 次閱讀 Android開發 移動開發

來自: http://segmentfault.com/a/1190000004338384


開始的開始

最近在做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若干)

入門之前

曾經和gemini聊到機器人統治地球的問題(這好像是異教徒們的愿景orz...),后來想了想自動化測試這個東西其實也是,讓機器去模仿人的行為,讓它自己去統治整個測試工作。既然是去模仿人的行為,那實際上也應該認為機器只能理解人所能理解的東西。比方說,當我去人為地做一些測試的時候,我所期待的只是UI上的變化可以符合我的預期,至于它背后的數據是怎樣的實際上我并不care。因此,在做自動化測試時我個人有個最基本的思路:

把自己當成用戶,只關注我能看到的東西。

Start from Gradle

好了!終于可以開始了!既然是采用Gradle進行Android工程的構建,那自然是少不了Gradle的配置啦!根據Gradle官方文檔的說明,我們首先需要在我們工程的build.gradle中添加如下配置:

android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

這里實際上只做了一件事情,就是為我們的工程指定一個TestInstrumentationRunnerTestInstrumentationRunner是用來跑我們所寫的所有的測試用例的。當我們采用test的模式來構建工程時,這個Runner便會自動為我們執行所有的的測試用例,并且返回相應的測試結果。
另外,我們還需要在build.gradle中增加instrumentation testing所需要的依賴:

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'
}

Where am I?

好了!我們現在有工具來跑測試了,接下來只要添加我們的測試用例了!于是問題來了,我們應該在哪里添加測試用例呢?
如果你在Android Studio中新建一個工程,會發現在src目錄下,和main平行的還有一個androidTest目錄。一般而言,我們將工程代碼放在src/main/java目錄下,將與之相關的測試代碼放在src/androidTest/java目錄下。如下所示:

src/
    androidTest/java    ----這里存放instrumentation test相關的代碼
    main/java           ----這里存放工程代碼

同時,為了讓工程更容易維護,建議將相應Class的測試代碼放到相同名稱的包下面,比如,在Package-name下面有一個Class A:

    src/main/java/package-name/A.java

那么,建議將A的測試類放到androidTest下面對應的路徑下:

    src/androidTest/java/package-name/ATest.java

可以Say Hello了!

好了!我要開始變身了!下面我們要向testing的世界say hello了!
我在package-name/module/main包下面有一個AppStartActivity,作為答疑君的啟動頁。在這個啟動頁上會顯示一段文字,我希望通過自動化測試來確認這個文字確實顯示在了屏幕上。

于是,我應該在androidTest/package-name/module/main下面創建一個AppStartActivityTest類,鍵入如下代碼:

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);
    }
}

相關代碼的說明請見注釋。

接下來,我要開始跑這個測試用例了。首先,打開Android Studio的Build variants窗口,將Test Artifact設為Android Instrumentation Tests,然后Synchronize一下工程,會看到androidTest路徑下的背景顏色變成了綠色。
此時,在AppStartActivityTest.java點擊菜單,選擇Run 'AppStartActivityTest...',就可以從控制臺看到測試已經在跑了:

從控制臺的日志來看,整個測試過程初期,會向測試設備安裝兩個APK:APP APK和test APK。整個測試結束之后,會看到測試結果:

以上測試結果說明,所有test case全部測試通過。

好了!這就是整個自動化測試的大體流程了!接下來我已經迫不及待地想要把Android強大的自動化測試提供的特性分享出來了!!

 本文由用戶 BrentonTuck 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!