在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上的文字同預期結果對比,如果一致則測試通過;