android 測試基于 Junit,我們既可以在 JVM 運行單元測試,也可以在 Android 設(shè)備上運行功能測試
測試類型
當(dāng)使用 Android studio 來寫測試程序時,你的代碼必須放在兩個指定的文件夾中。
Local unit testsWARNING: No manifest file found at ./AndroidManifest.xml.
Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).
位于 module-name/src/test/java/.
這些測試時運行在本地 JVM,沒有運行 Android framework API的權(quán)限
可以參考這個
Instrumented test
Instrumented Unit test 是允許在真機或者模擬器上的,而不是運行在本地環(huán)境下的虛擬機中。如果在測試時需要使用 instrumentation information(例如 app Context),或者你需要獲取 Android 框架的組件(例如 SharedPrederences),這時候你就可以創(chuàng)建一個 instrumented unit test。使用 Instrumented unit test 可以幫助減少編寫模擬環(huán)境的代碼。當(dāng)然你也可以使用一些 mock 框架。使用 Instrumented unit test 可以很好的利用 Android framework api 和 supporting API。
位于 module-name/src/androidTest/java/.
測試運行在 Android 設(shè)備上或者 Android 模擬器上
在測試過程中,這些測試代碼會被編譯成 apk 運行在設(shè)備上。系統(tǒng)會將這個測試程序 和待測程序運行在同一個進程中,所以測試程序能調(diào)用待測程序的方法。
更多例子
- Building Instrumented Unit Tests 不使用 mock 對象滿足 Android 依賴的情況下,構(gòu)建復(fù)雜的 unit test
- Automating User Interface Tests 創(chuàng)建測試,以驗證用戶界面正確行為對單個應(yīng)用程序內(nèi)或跨多個應(yīng)用程序的交互用戶交互。
- Testing App Component Integrations 驗證用戶不直接與交互的組件行為,例如service或Content Provider

然而,unit test和instrumented test 只是形式來幫助區(qū)分,從Android平臺(硬件設(shè)備或仿真器上)上運行測試和在本地JVM上運行測試。
構(gòu)建完整的測試套件的時候,你應(yīng)該明白真正的測試類型如下表所述。
| 類型 | 子類型 | 描述 |
|---|---|---|
| Unit tests | Local Unit Tests | 只在 JVM上運行,當(dāng)沒有 Android framework 的相關(guān)依賴,或者 mock 了這部分依賴時,這部分測試運行的會非???/td> |
| Instrumented unit tests<span class="Apple-tab-span" style="white-space:pre"></span> | 這些測試運行在 Android 設(shè)備或者 Android 模擬器上。這些測試有獲取 Instrumentation 信息的權(quán)限,比如獲取當(dāng)前的 context。當(dāng)你 mock 的對象滿足不了 Android 的依賴時,可以使用這個測試 | |
| Integration Tests(集成測試) | 組件在一個 app 中 | 這種類型的測試驗證目標(biāo)應(yīng)用程序的行為,當(dāng)用戶執(zhí)行特定的操作,還是在進入活動特定的輸入如預(yù)期。舉個栗子,當(dāng)用戶做一些交互動作是,他可以用來驗證程序返回正確的UI響應(yīng)。 Espresso的UI測試框架允許你以編程方式模擬用戶操作和測試復(fù)雜的內(nèi)部應(yīng)用程序的用戶交互。 |
| 組件在不同的 app 中 | 這種類型的測試驗證不同的用戶應(yīng)用程序之間或用戶應(yīng)用程序和系統(tǒng)應(yīng)用之間的相互作用正確的行為。比如,當(dāng)用戶執(zhí)行 Android 的設(shè)置菜單操作時,你可能想測試你程序的行為。此類的框架有 UI Automator |
測試 API
以下都是在 Android 測試中常用的 api。
JUnit
你可以采用類似 JUnit 4 的方式來寫單元測試或者集成測試。framework提供了一種很方便的方式來幫我們設(shè)置 、去除、斷言
一個基本JUnit 4測試類是包含一個或多個測試方法的Java類。一種測試方法始于@Test注釋,其中包含的代碼驗證一個單獨的功能(即一個邏輯單元)
下面例子是使用Espresso APIs(UI 測試框架)的一個集成測試,用來測試點擊一個 UI 組件,檢查字符串得到相應(yīng)的顯示
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityInstrumentationTest {
@Rule
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class);
@Test
public void sayHello(){
onView(withText("Say hello!")).perform(click());
onView(withId(R.id.textView)).check(matches(withText("Hello, World!")));
}
}
在JUnit 4測試類,你可以通過以下注釋召喚出在特殊處理你的測試代碼段:
- @Before:主要是測試代碼的一些設(shè)置。每段@test 執(zhí)行之前都會先執(zhí)行 @Before注解 的方法。你可以有多個@Before方法,但在測試類調(diào)用這些方法不能保證的順序。
- @After:主要是一些釋放資源的操作。每段@test 執(zhí)行之后都會執(zhí)行 @After注解 的方法。你可以有多個@After方法,用來釋放內(nèi)存中的資源
- @Test: 表示這個方法是測試代碼。每個測試類可以有多個測試方法。每個方法都要標(biāo)明這個注解
- @Rule: 可以通過 Rule 靈活的添加和重復(fù)使用測試方法。在 Android 測試中,如ActivityTestRule或ServiceTestRule(這些都在 support 包中)
- @BeforeClass: 為每個測試類指定靜態(tài)方法。每個測試類之后調(diào)用這個一次。比如連接到數(shù)據(jù)庫的操作可以使用這個注解
- @AfterClass:使用此批注指定靜態(tài)方法的測試類類中的所有測試都運行之后才調(diào)用。該測試步驟是釋放在@BeforeClass塊分配的資源
- @Test(timeout=): 如果測試啟動,但給定的超時期限內(nèi)沒有完成,它會自動失敗。你必須以毫秒為單位指定超時周期
更多的注解可以查看文檔 junit 注解 和 android 注解
Android Testing Support Library
Android Testing Support Library 提供了一系列 api 來幫助我們app快速構(gòu)建測試代碼。包括 JUnit 4 和 UI 測試。
- AndroidJUnitRunner:一個JUnit 4兼容的測試運行為Android。
- Espresso:一個UI測試框架;適用于應(yīng)用程序內(nèi)的功能UI測試。
- UI Automator:適用于系統(tǒng)和安裝的應(yīng)用程序之間的交叉應(yīng)用功能UI測試的UI測試框架。
Assertion classes
由于Android測試支持庫API繼承自JUnit,您可以使用斷言方法來顯示測試的結(jié)果。斷言方法比較測試返回值和實際值,并且如果該比較測試失敗拋出AssertionException。使用斷言比記錄更方便,并提供更好的測試性能。
為了簡化測試開發(fā),你應(yīng)該使用Hamcrest庫,它可以讓你創(chuàng)建使用Hamcrest匹配器的API更加靈活的測試。
Monkey and monkeyrunner
Android SDK提供了兩種功能測試工具
Monkey
這是一個命令行工具。發(fā)出按鍵,觸摸和手勢的隨機流命令??梢允褂肁DB工具來運行它,并用它來做壓力測試,匯報遇到的錯誤的
測試系列博客目錄
- Android 測試 (一)--測試總覽 http://xuyushi.github.io/2016/11/05/Android%20%E6%B5%8B%E8%AF%95%20%EF%BC%88%E4%B8%80%EF%BC%89--%E6%B5%8B%E8%AF%95%E6%80%BB%E8%A7%88/
- Android 測試 (二)--Instrumented Unit Tests http://xuyushi.github.io/2016/11/05/Android%20%E6%B5%8B%E8%AF%95%20%EF%BC%88%E4%BA%8C%EF%BC%89--Instrumented%20Unit%20Tests/
- Android 測試 (三)--Local Unit Tests http://xuyushi.github.io/2016/11/06/Android%20%E6%B5%8B%E8%AF%95%20%EF%BC%88%E4%B8%89%EF%BC%89--Local%20Unit%20Tests/
- Android 測試 (四)-- 實戰(zhàn)分析 http://xuyushi.github.io/2016/11/13/Android%20%E6%B5%8B%E8%AF%95%20%EF%BC%88%E5%9B%9B%EF%BC%89--%20%E5%AE%9E%E6%88%98%E5%88%86%E6%9E%90/
翻譯自(有增刪 2016-11-05)
https://developer.android.com/training/testing/start/index.html