1. 程式人生 > >在Android Studio中進行UI測試

在Android Studio中進行UI測試

一、build.gradle 中配置
在defaultConfig中新增
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”

在dependencies中新增
androidTestCompile ‘com.android.support.test:runner:0.5’
androidTestCompile ‘com.android.support.test:rules:0.5’
androidTestCompile (‘com.android.support.test.espresso:espresso-core:2.2.2’)

不需要單獨引入junit的依賴,因為androidTestCompile ‘com.android.support.test:runner:0.5’包含了junit.
如果同時在引入junit包,編譯時,可能出現multidevix XXX 的問題,就是包衝突了。

二、為app新增簡單的互動
在使用Espresso進行UI測試前,讓我們為app新增一些Views和簡單的互動。我們使用一個使用者可以輸入名字的EditText,歡迎使用者的Button和用於輸出的TextView。開啟res/layout/activity_main.xml,貼上如下程式碼:
activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView android:id="@+id/textView" android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:hint="Enter your name here" android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/textView"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Say hello!" android:layout_below="@+id/editText" android:onClick="sayHello"/> </RelativeLayout>

還需要在MainActivity.java中新增onClick handler:
MainActivity.java

public void sayHello(View v){
    TextView textView = (TextView) findViewById(R.id.textView);
    EditText editText = (EditText) findViewById(R.id.editText);
    textView.setText("Hello, " + editText.getText().toString() + "!");
}

現在可以執行app並確認一切工作正常。在點選Run按鈕之前,確認你的Run Configuration沒有設定為執行測試。如需更改,點選下拉選項,選擇app。

三、建立並執行Espresso測試
在工程的整體檢視上,找到以(androidTest)字尾結尾的包名並建立一個新的Java類。可以將它命名為MainActivityInstrumentationTest,將如下程式碼貼上過去。

** MainActivityInstrumentationTest.java

package com.example.testing.testingexample;

import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.action.ViewActions;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityInstrumentationTest {

    private static final String STRING_TO_BE_TYPED = "Peter";

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
        MainActivity.class);

    @Test
    public void sayHello(){
        onView(withId(R.id.editText)).perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard()); //line 1

        onView(withText("Say hello!")).perform(click()); //line 2

        String expectedText = "Hello, " + STRING_TO_BE_TYPED + "!";
        onView(withId(R.id.textView)).check(matches(withText(expectedText))); //line 3
    }

}

測試類通過AndroidJUnitRunner執行,並執行sayHello()方法。下面將逐行解釋都做了什麼:

1.首先,找到ID為editText的view,輸入Peter,然後關閉鍵盤;
2.接下來,點選Say hello!的View,我們沒有在佈局的XML中為這個Button設定id,因此,通過搜尋它上面的文字來找到它;
3.最後,將TextView上的文字同預期結果對比,如果一致則測試通過;