Android測試|入門概念

抄寫博客

AndroidJUnitRunner

根據Android官網的說法

The AndroidJUnitRunner class is a JUnit test runner that lets you run JUnit 3 or JUnit 4-style test classes on Android devices, including those using the Espresso and UI Automator testing frameworks. The test runner handles loading your test package and the app under test to a device, running your tests, and reporting test results. This class replaces the InstrumentationTestRunner class, which only supports JUnit 3 tests.

AndroidJUnitRunner是一個可以用來運行 JUnit 3 和 JUnit 4 樣式的測試類的Test Runner,並且同時支持Espresso和UI Automator。這是對於之前的InstrumentationTestRunner的一個升級,如果你去查看Gradle文檔中對於Testing配置的說明,會發現推薦的Test Runner爲InstrumentationTestRunner。InstrumentationTestRunner只支持JUnit 3樣式的測試用例,而我們在寫Android測試用例時應該儘可能使用JUnit 4樣式來實現

相對於Junit 3, JUnit 4有如下改進:
- 測試類不需要再繼承junit.framework.TestCase類;
- 測試方法名不再需要以test開頭;
- 可以使用類似@Test, @Before, @After等註解來管理自己的測試方法;
- 增加了一些Assert方法;
- 支持對assert方法的static導入。

下面來看一個例子。如下的代碼段採用了JUnit 4風格進行編寫,並且調用了Espresso的API來進行了一些測試:

@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: 標識在運行測試方法之前運行的代碼。可以支持同一個Class中有多個@Before,但是這些方法的執行順序是隨機的。該註解替代了JUnit 3中的setUp()方法。
  • @After: 標識在運行測試方法結束之後運行的代碼。可以在其中做一些釋放資源的操作。該註解替代了JUnit 3中的tearDown()方法
  • @Test: 標識一個測試方法。一個測試類中可以有多個測試方法,每個測試方法需要用一個@Test註解來標識。
  • @Rule: 簡單來說,是爲各個測試方法提供一些支持。具體來說,比如我需要測試一個Activity,那麼我可以在@Rule註解下面採用一個ActivityTestRule,該類提供了對相應Activity的功能測試的支持。該類可以在@Before和@Test標識的方法執行之前確保將Activity運行起來,並且在所有@Test和@After方法執行結束之後將Activity殺死。在整個測試期間,每個測試方法都可以直接對相應Activity進行修改和訪問。
  • @BeforeClass: 爲測試類標識一個static方法,在測試之前只執行一次。
  • @AfterClass: 爲測試類標識一個static方法,在所有測試方法結束之後只執行一次。
  • @Test(timeout=): 爲測試方法設定超時時間。

Instrumentation

根據官方的說法:

Android instrumentation is a set of control methods or hooks in the Android system. These hooks control an Android component independently of its normal lifecycle. They also control how Android loads applications.

Android Instrumentation提供了一些方法,可以用來獨立地控制某個組件的生命週期。

一般來說,Android中組件的生命週期是由系統來控制的。比如,我們啓動了一個Activity,那麼Activity的生命週期方法會自動爲我們調用,Android APIs並沒有提供入口讓我們直接去調用這些生命週期方法,但是使用Instrumentation就可以做到。

Instrumentation可以將要測試的APP以及其對應的test Package加載到同一個進程中。由於我們所要測試的組件和其測試用例都運行在同一進程,因此我們就可以在我們的測試用例中直接調用組件的方法,對組件做一系列訪問和修改。

Android Testing Support Library APIs

Android爲自動化測試提供瞭如下的API供我們使用:

  • AndroidJUnitRunner: 以上已經提到;
  • Espresso: 提供了UI測試的API;
  • UI Automator: 提供了跨APP UI測試的API。

Assertion

在做測試的過程中,我們應該如何檢查實際的結果符合我們的預期呢?

這裏就要用到了Assertion Classes。Assertion Classes提供了一系列assert方法用來比對我們檢測的數據和期望的數據是否一致,如果檢測失敗,則會拋出一個AssertionException異常。

比方說在上一篇文章中貼出來的AppStartActivityTest代碼中,有這麼一行:

assertNotNull("AppStartActivity Content is Null", content);

這一行代碼就是檢查content的內容不爲空。其中第一個參數指定了一個提示文案,第二個參數指定了需要測試的字符串。

爲了簡化我們的測試代碼,在之後的測試中,我們還會使用到一個叫做Hamcrest的類庫,用來簡化我們的Assertion過程。這些都將會在接下來的文章中一一介紹。

尾巴

感謝原文博主,學習了,記錄下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章