如果你的單元測(cè)試沒(méi)有依賴或者只有Android上的簡(jiǎn)單依賴,你應(yīng)該在本地開(kāi)發(fā)機(jī)器上運(yùn)行測(cè)試瞬捕。 這種測(cè)試方法是高效的鞍历,因?yàn)樗梢詭椭苊饷看芜\(yùn)行測(cè)試時(shí)將目標(biāo)應(yīng)用程序和單元測(cè)試代碼加載到物理設(shè)備或模擬器上的開(kāi)銷(xiāo)。 因此肪虎,運(yùn)行單元測(cè)試的執(zhí)行時(shí)間大大減少劣砍。 使用這種方法,通常使用模擬框架(如Mockito)來(lái)實(shí)現(xiàn)任何依賴關(guān)系扇救。
配置測(cè)試環(huán)境
在您的Android Studio項(xiàng)目中刑枝,必須將用于本地單元測(cè)試的源文件存儲(chǔ)在module-name / src / test / java /。 創(chuàng)建新項(xiàng)目時(shí)迅腔,此目錄已存在装畅。
您還需要為項(xiàng)目配置測(cè)試依賴關(guān)系,以使用JUnit 4框架提供的標(biāo)準(zhǔn)API沧烈。 如果您的測(cè)試需要與Android依賴關(guān)系交互掠兄,請(qǐng)包括Mockito庫(kù)以簡(jiǎn)化本地單元測(cè)試。 要了解有關(guān)在本地單元測(cè)試中使用模擬對(duì)象的更多信息锌雀,請(qǐng)參閱下面的Mocking Android dependencies蚂夕。
在應(yīng)用程序的頂級(jí)build.gradle文件中,您需要將這些庫(kù)指定為依賴關(guān)系:
dependencies {
// Required -- JUnit 4 framework
testCompile 'junit:junit:4.12'
// Optional -- Mockito framework
testCompile 'org.mockito:mockito-core:1.10.19'
}
創(chuàng)建一個(gè)本地單元測(cè)試類
你的本地單元測(cè)試類應(yīng)該寫(xiě)成一個(gè)JUnit 4測(cè)試類腋逆。 JUnit是Java最受歡迎和廣泛使用的單元測(cè)試框架双抽。 這個(gè)框架的最新版本,JUnit 4闲礼,允許你以比它的前任版本更清潔和更靈活的方式編寫(xiě)測(cè)試。 與以前的基于JUnit 3的Android單元測(cè)試的方法不同,使用JUnit 4柬泽,您不需要擴(kuò)展junit.framework.TestCase類慎菲。 您也不需要在測(cè)試方法名稱前加上'test'關(guān)鍵字,或者使用junit.framework或junit.extensions包中的任何類锨并。
要?jiǎng)?chuàng)建基本的JUnit 4測(cè)試類露该,請(qǐng)創(chuàng)建一個(gè)包含一個(gè)或多個(gè)測(cè)試方法的Java類。 測(cè)試方法以@Test注釋開(kāi)始第煮,包含練習(xí)和驗(yàn)證要測(cè)試的組件中的單個(gè)功能的代碼解幼。
以下示例顯示如何實(shí)現(xiàn)本地單元測(cè)試類。 測(cè)試方法emailValidator_CorrectEmailSimple_ReturnsTrue驗(yàn)證被測(cè)應(yīng)用程序中的isValidEmail()方法是否返回正確的結(jié)果包警。
以下示例顯示如何實(shí)現(xiàn)本地單元測(cè)試類撵摆。 測(cè)試方法emailValidator_CorrectEmailSimple_ReturnsTrue驗(yàn)證被測(cè)應(yīng)用程序中的isValidEmail()方法是否返回正確的結(jié)果。
import org.junit.Test;
import java.util.regex.Pattern;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class EmailValidatorTest {
@Test
public void emailValidator_CorrectEmailSimple_ReturnsTrue() {
assertThat(EmailValidator.isValidEmail("name@email.com"), is(true));
}
...
}
要測(cè)試應(yīng)用程序中的組件是否返回預(yù)期結(jié)果害晦,請(qǐng)使用junit.Assert方法執(zhí)行驗(yàn)證檢查(或斷言)特铝,以便將受測(cè)試組件的狀態(tài)與某些預(yù)期值進(jìn)行比較。 為了使測(cè)試更可讀壹瘟,可以使用Hamcrest matchers(例如is()和equalTo()方法)將返回的結(jié)果與預(yù)期結(jié)果進(jìn)行匹配鲫剿。
Mock Android dependencies
默認(rèn)情況下,Gradle的Android插件針對(duì)android.jar庫(kù)的修改版本執(zhí)行本地單元測(cè)試稻轨,該版本不包含任何實(shí)際代碼灵莲。 相反,從單元測(cè)試中調(diào)用Android類的方法會(huì)拋出異常殴俱。 這是為了確保你只測(cè)試你的代碼政冻,不依賴于Android平臺(tái)的任何特定的行為(當(dāng)沒(méi)有明確模擬時(shí))。
您可以使用模擬框架在代碼中存根外部依賴關(guān)系粱挡,以便輕松測(cè)試您的組件是否按照預(yù)期的方式與依賴關(guān)系交互赠幕。 通過(guò)用模擬對(duì)象替換Android依賴項(xiàng),您可以將單元測(cè)試與Android系統(tǒng)的其余部分隔離询筏,同時(shí)驗(yàn)證這些依賴關(guān)系中的正確方法是否被調(diào)用榕堰。 Java的Mockito mocking框架(1.9.5及更高版本)提供了與Android單元測(cè)試的兼容性。 使用Mockito嫌套,您可以配置模擬對(duì)象以在調(diào)用時(shí)返回一些特定值逆屡。
要使用此框架將mock對(duì)象添加到本地單元測(cè)試,請(qǐng)遵循以下編程模型:
1> 在build.gradle文件中包含Mockito庫(kù)依賴關(guān)系踱讨,如配置測(cè)試環(huán)境中所述魏蔗。
2> 在單元測(cè)試類定義的開(kāi)始,添加@RunWith(MockitoJUnitRunner.class)注釋痹筛。 這個(gè)注釋告訴Mockito測(cè)試運(yùn)行器驗(yàn)證你的框架的使用是正確的莺治,并簡(jiǎn)化了你的模擬對(duì)象的初始化廓鞠。
3> 要為Android依賴項(xiàng)創(chuàng)建模擬對(duì)象,請(qǐng)?jiān)谧侄温暶髦疤砑覢Mock注釋谣旁。
4> 要存根依賴關(guān)系的行為床佳,可以使用when()和thenReturn()方法指定條件并返回值。
以下示例顯示如何創(chuàng)建使用mock Context對(duì)象的單元測(cè)試榄审。
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import android.content.SharedPreferences;
@RunWith(MockitoJUnitRunner.class)
public class UnitTestSample {
private static final String FAKE_STRING = "HELLO WORLD";
@Mock
Context mMockContext;
@Test
public void readStringFromContext_LocalizedString() {
// Given a mocked Context injected into the object under test...
when(mMockContext.getString(R.string.hello_word))
.thenReturn(FAKE_STRING);
ClassUnderTest myObjectUnderTest = new ClassUnderTest(mMockContext);
// ...when the string is returned from the object under test...
String result = myObjectUnderTest.getHelloWorldString();
// ...then the result should be the expected one.
assertThat(result, is(FAKE_STRING));
}
}
要了解有關(guān)使用Mockito框架的更多信息砌们,請(qǐng)參閱Mockito API reference和示例代碼中的SharedPreferencesHelperTest類。
如果Android.jar中的Android API拋出的異常對(duì)于測(cè)試有問(wèn)題搁进,您可以更改行為浪感,以使方法通過(guò)在項(xiàng)目的頂級(jí)build.gradle文件中添加以下配置來(lái)返回null或零:
android {
...
testOptions {
unitTests.returnDefaultValues = true
}
}
警告:將returnDefaultValues屬性設(shè)置為true應(yīng)該小心。 null/零返回值可以在測(cè)試中引入回歸饼问,這難以調(diào)試影兽,并且可能允許失敗的測(cè)試通過(guò)。 只能使用它作為最后的手段匆瓜。
運(yùn)行本地單元測(cè)試
要運(yùn)行本地單元測(cè)試赢笨,請(qǐng)按照下列步驟操作:
1> 通過(guò)單擊工具欄中的Sync Project,確保您的項(xiàng)目與Gradle同步驮吱。
2> 使用以下方法之一運(yùn)行測(cè)試:
a> 要運(yùn)行單個(gè)測(cè)試茧妒,請(qǐng)打開(kāi)“ Project”窗口,然后右鍵單擊測(cè)試左冬,然后單擊Run桐筏。
b> 要測(cè)試類中的所有方法,請(qǐng)右鍵單擊測(cè)試文件中的類或方法拇砰,然后單擊Run梅忌。
c> 要在目錄中運(yùn)行所有測(cè)試,請(qǐng)右鍵單擊目錄并選擇Run tests除破。
Gradle的Android插件編譯位于默認(rèn)目錄(src / test / java /)中的本地單元測(cè)試代碼牧氮,構(gòu)建一個(gè)測(cè)試app,并使用默認(rèn)的測(cè)試運(yùn)行器類在本地執(zhí)行它瑰枫。 然后踱葛,Android Studio將在“ Run”窗口中顯示結(jié)果。