Android自動化測試-從入門到入門(2)Testing APIs
來自: https://segmentfault.com/a/1190000004342951
根據該系列文章的第一篇:Hello Testing,大家已經對整個自動化測試運行流程有了一個基本的了解,接下來我們該集中精力關注具體的腳本實現了!在具體實現之前,我們先來了解一下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=<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。
Espresso
和UI Automator
會在接下來的文章中詳細說明。
Assertion
在做測試的過程中,我們應該如何檢查實際的結果符合我們的預期呢?
這里就要用到了Assertion Classes
。Assertion 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的測試