Android自動化測試-從入門到入門(2)Testing APIs

根據該系列文章的第一篇:Hello Testing,你們已經對整個自動化測試運行流程有了一個基本的瞭解,接下來咱們該集中精力關注具體的腳本實現了!在具體實現以前,咱們先來了解一下Android提供的對於自動化測試的一些支持。html

AndroidJUnitRunner

根據Android官網的說法,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.segmentfault

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

相對於Junit 3JUnit 4有以下改進:ide

  • 測試類不須要再繼承junit.framework.TestCase類;測試

  • 測試方法名再也不須要以test開頭;ui

  • 可使用相似@Test, @Before, @After等註解來管理本身的測試方法;rest

  • 增長了一些Assert方法;code

  • 支持對assert方法的static導入。component

下面來看一個例子。以下的代碼段採用了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=<milliseconds>): 爲測試方法設定超時時間。

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。

EspressoUI Automator會在接下來的文章中詳細說明。

Assertion

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

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

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

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

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

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

附錄

Android自動化測試-從入門到入門(1) Hello Testing!
Android自動化測試-從入門到入門(2) Testing APIs
Android自動化測試-從入門到入門(3) Espresso入門
Android自動化測試-從入門到入門(4) uiautomatorviewer
Android自動化測試-從入門到入門(5) AdapterView的測試
Android自動化測試-從入門到入門(6) 會玩的Espresso
Android自動化測試-從入門到入門(7) UI Automator

相關文章
相關標籤/搜索