Android測試(四):Local 單元測試

來源:互聯網
上載者:User

標籤:object   equal   moc   res   如何   content   validator   log   mock   

Android測試(四):Local 單元測試

發布時間 2017年12月20日 蟲師

原文:https://developer.android.com/training/testing/unit-testing/local-unit-tests.html

如果你的單元測試沒有依賴或者只有簡單的Android依賴,則應該在本地開發機器上運行測試。這種測試方法非常高效,因為它可以協助你避免每次運行測試時將目標應用程式和單元測試代碼載入到真機或模擬器上的開銷。因此,運行單元測試的執行時間大大減少了。通過這種方法,你通常使用mock架構(如Mockito)來完成任何依賴關係。

設定測試環境

在你的Android Studio項目中,必須將本地單元測試的源檔案儲存體在module-name/src/test/java/ 目錄中。在建立新項目時,該目錄已經存在。

你還需要設定項目的測試依賴,以使用JUnit 4架構提供的標準API。如果你的測試需要與Android依賴關係進行互動,請包含Mockito庫以簡化本地單元測試。要瞭解有關在本地單元測試中使用類比對象的更多資訊,請參閱類比Android依賴關係。

在你的App程式的目錄下找到build.gradle檔案中,將這些庫指定為依賴項:

dependencies {    // Required -- JUnit 4 framework    testCompile ‘junit:junit:4.12‘    // Optional -- Mockito framework    testCompile ‘org.mockito:mockito-core:1.10.19‘}
建立本地單元測試類

你的本地單元測試類應該寫成一個JUnit 4測試類別。 JUnit是Java最流行和廣泛使用的單元測試架構。這個架構的最新版本,JUnit 4,允許你用比前一版本更清晰,更靈活的方式編寫測試。與以前的基於JUnit 3的Android單元測試方法(使用JUnit 4)不同,你不需要擴充junit.framework.TestCase類。也不需要在測試方法名稱前加上“test”關鍵字,或者使用junit.framework或junit.extensions包中的任何類。

要建立基本的JUnit 4測試類別,請建立一個包含一個或多個測試方法的Java類。 測試方法從@Test注釋開始,包含代碼來練習和驗證要測試的組件中的單個功能。

以下樣本顯示了如何?本地單元測試類。 測試方法emailValidator_CorrectEmailSimple_ReturnsTrue驗證被測試的應用程式中的isValidEmail()方法是否返回正確的結果。

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("[email protected]"), is(true));    }    ...}

要測試應用程式中的組件是否會返回預期的結果,請使用junit.Assert方法執行驗證檢查(或斷言),以便將待測組件的狀態與某個預期值進行比較。 為了使測試更具可讀性,可以使用Hamcrest匹配器(如is()和equalTo()方法)將返回的結果與期望的結果進行匹配。

Mock Android依賴

預設情況下,針對Gradle的Android外掛程式將針對android.jar庫的修改版本執行本地單元測試,該庫不包含任何實際的代碼。 相反,從你的單元測試方法調用Android類拋出一個異常。 這是為了確保只測試你的代碼,而不依賴於Android平台的任何特定行為(你沒有明確地mock)。

你可以使用mock架構在代碼中刪除外部依賴項,以便以預期的方式輕鬆測試組件與依賴項的互動。 通過用mock對象代替Android依賴關係,可以將單元測試與Android系統的其餘部分分離,同時驗證這些依賴關係中正確的方法被調用。Java的Mockito類比架構(版本1.9.5及更高版本)提供了與Android單元測試的相容性。藉助Mockito可以配置類比對象以在調用時返回某個特定的值。

要使用此架構將mock對象添加到本地單元測試中,請遵循以下編程模型:

1、在你的 build.gradle 檔案中包含Mockito庫依賴項,如設定上面的測試環境中所述。

2、在單元測試類定義的開始處,添加 @RunWith(MockitoJUnitRunner.class)注釋。 這個注釋告訴Mockito測試回合器驗證你對架構的使用是否正確,並且簡化了你的類比對象的初始化。

3、要為Android依賴項建立一個類比對象,請在欄位聲明之前添加@Mock注釋。

4、為了Stub依賴的行為,可以通過使用when()return()方法來滿足條件時,可以指定一個條件和傳回值。

以下樣本顯示如何建立使用類比Context對象的單元測試。

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

要瞭解有關使用Mockito架構的更多資訊,請參閱範例程式碼中的Mockito API參考和SharedPreferencesHelperTest類。

Error: “Method … not mocked”

如果您運行測試,從Android SDK調用API,你不會使用mock,可能會收到一個錯誤,說這種方法沒有被類比。 這是因為用於運行單元測試的android.jar檔案不包含任何當前代碼(這些API僅由裝置上的Android系統映像提供)。

相反,所有方法預設都會拋出異常。 這是為了確保你的單元測試你的代碼,而不是依賴於Android平台的任何特定的行為(你沒有明確地mock,如Mockito)。

如果拋出的異常說你的測試有問題,可以更改行為,以便通過在項目的頂級build.gradle檔案中添加以下配置來返回null或零:

android {  ...  testOptions {    unitTests.returnDefaultValues = true  }}

注意:將returnDefaultValues屬性設定為true應該小心。 null / zero傳回值可以在測試中引入迴歸,這些回調很難調試,並且可能允許失敗的測試通過。只能用它作為最後的手段。

運行本地單元測試

要運行您的本地單元測試,請按照下列步驟操作:

1、通過單擊工具列中的“ Sync Project”,確保您的項目與Gradle同步。

2、以下列其中一種方式運行測試:

  • 要運行單個測試,請開啟“Project”視窗,然後按右鍵以進行測試,然後單擊“Run”。
  • 要測試類別中的所有方法,請按右鍵測試檔案中的類或方法,然後單擊“Run”。
  • 要在目錄中運行所有測試,請按右鍵該目錄並選擇“Run Tests”。

Android測試(四):Local 單元測試

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.