Android测试(四):Instrumented 单元测试
原文:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
Instrumented?單元測(cè)試是在真機(jī)和模擬器上運(yùn)行的測(cè)試,它可以利用Android框架API和支持的API(如Android測(cè)試支持庫(kù))。如果你的測(cè)試需要訪問(wèn)工具信息(例如目標(biāo)應(yīng)用程序的Context),或者需要真正實(shí)現(xiàn)Android框架組件(如Parcelable或SharedPreferences對(duì)象),則應(yīng)該創(chuàng)建Instrumented?單元測(cè)試。
使用Instrumented單元測(cè)試還有助于減少編寫和維護(hù)mock代碼所需的工作量。 如果你愿意,仍然可以自由地使用一個(gè)mock框架模擬任何依賴關(guān)系。
### 設(shè)置測(cè)試環(huán)境
在你的Android Studio項(xiàng)目中,你必須將mock測(cè)試的源文件存儲(chǔ)在module-name/src/androidTest/java/ 中。 創(chuàng)建新項(xiàng)目時(shí)該目錄已經(jīng)存在,并包含示例代碼。
在開(kāi)始之前,你應(yīng)該下載Android測(cè)試支持庫(kù)安裝程序,該安裝程序提供的API可讓你快速構(gòu)建和運(yùn)行應(yīng)用程序的檢測(cè)代碼。測(cè)試支持庫(kù)包括用于功能性UI測(cè)試(Espresso和UI Automator)的JUnit 4測(cè)試運(yùn)行器(AndroidJUnitRunner)和API。
還需要為項(xiàng)目配置Android測(cè)試依賴項(xiàng),以使用測(cè)試運(yùn)行程序和測(cè)試支持庫(kù)提供的規(guī)則API。 為了簡(jiǎn)化測(cè)試開(kāi)發(fā),還應(yīng)該包含Hamcrest庫(kù),它可以讓你使用Hamcrest匹配器API創(chuàng)建更靈活的斷言。
在你的App的頂級(jí)build.gradle文件中將這些庫(kù)指定為依賴項(xiàng):
dependencies {
? ? androidTestCompile 'com.android.support:support-annotations:24.0.0'
? ? androidTestCompile 'com.android.support.test:runner:0.5'
? ? androidTestCompile 'com.android.support.test:rules:0.5'
? ? // Optional -- Hamcrest library
? ? androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
? ? // Optional -- UI testing with Espresso
? ? androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
? ? // Optional -- UI testing with UI Automator
? ? androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}
警告: 如果構(gòu)建配置包含support-annotations庫(kù)的編譯依賴項(xiàng)和espresso-core庫(kù)的androidTestCompile依賴項(xiàng),則由于依賴沖突,構(gòu)建可能會(huì)失敗。 請(qǐng)按照下面步驟更新對(duì)espresso-core的依賴關(guān)系:
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
? ? exclude group: 'com.android.support', module: 'support-annotations'
})
要使用JUnit 4測(cè)試類,請(qǐng)確保將AndroidJUnitRunner指定為項(xiàng)目中的默認(rèn)測(cè)試工具運(yùn)行器,方法是在應(yīng)用程序的模塊級(jí)build.gradle文件中包含以下設(shè)置:
android {
? ? defaultConfig {
? ? ? ? testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
? ? }
}
### 創(chuàng)建一個(gè)Instrumented的單元測(cè)試類
你的Instrumented單元測(cè)試類應(yīng)該寫成JUnit 4測(cè)試類。要了解有關(guān)創(chuàng)建JUnit 4測(cè)試類和使用JUnit 4斷言和注釋的更多信息,請(qǐng)參閱創(chuàng)建本地單元測(cè)試類。
要?jiǎng)?chuàng)建一個(gè)Instrumented的JUnit 4測(cè)試類,在測(cè)試類定義的開(kāi)頭添加@RunWith(AndroidJUnit4.class)注釋。 還需要將Android測(cè)試支持庫(kù)中提供的AndroidJUnitRunner類指定為默認(rèn)測(cè)試運(yùn)行器。測(cè)試入門中對(duì)此步驟進(jìn)行了更詳細(xì)的介紹。
以下示例顯示如何編寫一個(gè)Instrumented單元測(cè)試,以確保LogHistory類正確實(shí)現(xiàn)了Parcelable接口:
import android.os.Parcel;
import android.support.test.runner.AndroidJUnit4;
import android.util.Pair;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.List;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class LogHistoryAndroidUnitTest {
? ? public static final String TEST_STRING = "This is a string";
? ? public static final long TEST_LONG = 12345678L;
? ? private LogHistory mLogHistory;
? ? @Before
? ? public void createLogHistory() {
? ? ? ? mLogHistory = new LogHistory();
? ? }
? ? @Test
? ? public void logHistory_ParcelableWriteRead() {
? ? ? ? // Set up the Parcelable object to send and receive.
? ? ? ? mLogHistory.addEntry(TEST_STRING, TEST_LONG);
? ? ? ? // Write the data.
? ? ? ? Parcel parcel = Parcel.obtain();
? ? ? ? mLogHistory.writeToParcel(parcel, mLogHistory.describeContents());
? ? ? ? // After you're done with writing, you need to reset the parcel for reading.
? ? ? ? parcel.setDataPosition(0);
? ? ? ? // Read the data.
? ? ? ? LogHistory createdFromParcel = LogHistory.CREATOR.createFromParcel(parcel);
? ? ? ? List<Pair<String, Long>> createdFromParcelData = createdFromParcel.getData();
? ? ? ? // Verify that the received data is correct.
? ? ? ? assertThat(createdFromParcelData.size(), is(1));
? ? ? ? assertThat(createdFromParcelData.get(0).first, is(TEST_STRING));
? ? ? ? assertThat(createdFromParcelData.get(0).second, is(TEST_LONG));
? ? }
}
### 創(chuàng)建一個(gè)測(cè)試套件
要組織測(cè)試單元測(cè)試的執(zhí)行,可以將一組測(cè)試集合在一個(gè)測(cè)試套件類中,并將這些測(cè)試一起運(yùn)行。測(cè)試套件可以嵌套; 測(cè)試套件可以將其他測(cè)試套件分組,并將所有組件測(cè)試類一起運(yùn)行。
測(cè)試套件包含在測(cè)試包中,類似于主應(yīng)用程序包。按照慣例,測(cè)試套件包名通常以.suite后綴結(jié)尾(例如,com.example.android.testing.mysample.suite)。
以下示例顯示了如何實(shí)現(xiàn)名為UnitTestSuite的測(cè)試套件,該測(cè)試套件將CalculatorInstrumentationTest和CalculatorAddParameterizedTest測(cè)試類分組并運(yùn)行在一起。
import com.example.android.testing.mysample.CalculatorAddParameterizedTest;
import com.example.android.testing.mysample.CalculatorInstrumentationTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
// Runs all unit tests.
@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorInstrumentationTest.class,
? ? ? ? CalculatorAddParameterizedTest.class})
public class UnitTestSuite {}
運(yùn)行Instrumented單元測(cè)試
要運(yùn)行Instrumented測(cè)試,請(qǐng)遵循以下步驟:
1、通過(guò)單擊工具欄中的“Sync Project”,確保您的項(xiàng)目與Gradle同步。。
2、以下列其中一種方式運(yùn)行測(cè)試:
要運(yùn)行單個(gè)測(cè)試請(qǐng)打開(kāi)Project窗口,然后單擊“Run”。
要測(cè)試類中的所有方法,請(qǐng)右鍵單擊測(cè)試文件中的類或方法,然后單擊“Run”。
要在目錄中運(yùn)行所有測(cè)試,請(qǐng)右鍵單擊該目錄并選擇“Run Tests”。
Gradle的Android插件編譯位于默認(rèn)目錄(src/androidTest/java/)中的測(cè)試代碼,構(gòu)建測(cè)試APK和生產(chǎn)APK,在連接的真機(jī)或模擬器上安裝兩個(gè)APK,并運(yùn)行測(cè)試。Android Studio然后在“Run”窗口中顯示測(cè)試執(zhí)行結(jié)果。
注意:在運(yùn)行或調(diào)試測(cè)試工具時(shí),Android Studio不會(huì)為即時(shí)運(yùn)行注入所需的額外方法,并關(guān)閉該特性。
### 使用Firebase測(cè)試實(shí)驗(yàn)室運(yùn)行測(cè)試
略....
(請(qǐng)查看原文)
### 額外的示例代碼
要下載到示例應(yīng)用程序,請(qǐng)參閱Android ActivityInstrumentation Sample。
總結(jié)
以上是生活随笔為你收集整理的Android测试(四):Instrumented 单元测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 3D画廊
- 下一篇: 理解 Keystone 核心概念