0. 前言
在Android開發中,測試是一個不多被說起的話題。在早期,Android並無一個很好 的測試框架,你也很難找到一個測試全面的優秀開源項目。近些年,隨着Android社區的成熟,出現了諸如Robotium,Robolectric等的 優秀測試框架。而Google也在近期推出了本身的UI測試框架Espresso。java
本文基於最簡單的Hello World項目進行測試,重點在於介紹Robolectric和Espresso的配置.。項目完整的示例代碼在這裏。android
1. 使用Espresso進行Instrumentaion Test
首先建立一個最簡單的Android項目,包含一個Hello World的TextView。打開Build Variant,選擇Android Instumentation Tests。在build.gradle中配置Espresso,增長的代碼以下:git
1github 2apache 3app 4框架 5ide 6單元測試 7測試 8 9 10 11 12 13 14 15 16 17 18 19 |
apply plugin: 'com.android.application' android { ... defaultConfig { ... testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } packagingOptions { exclude 'LICENSE.txt' } } dependencies { ... androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1' androidTestCompile 'com.android.support.test:runner:0.2' } |
以後點擊Gradle同步。
到src/androidTest刪除自動生成的ApplicationTest.java,新建MainActivityTest.java以下。這段代碼主要是測試Hello world!這段文字是否顯示到了界面上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@LargeTest public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { public MainActivityTest() { super (MainActivity.class); } @Override public void setUp() throws Exception { super .setUp(); getActivity(); } public void testHelloWorldOnView() { onView(withText( "Hello world!" )).check(matches(isDisplayed())); } } |
右擊MainActivityTest.java,選擇Run,以下圖所示。

選擇運行的設備以後能夠到在下方控制檯看到打印的測試成功信息以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Testing started at 下午7:08 ... Installing me.codethink.testdemo DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/me.codethink.testdemo" pkg: /data/local/tmp/me.codethink.testdemo Success Uploading file local path: /Users/archie/AndroidStudioProjects/TestDemo/app/build/outputs/apk/app-debug-androidTest-unaligned.apk remote path: /data/local/tmp/me.codethink.testdemo.test Installing me.codethink.testdemo.test DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/me.codethink.testdemo.test" pkg: /data/local/tmp/me.codethink.testdemo.test Success Running tests Test running startedFinish |
此時到Run -> Edit Configurations查看,能夠看到增長了MainActivityTest,以下圖所示。

至此完成了一個簡單的Espresso測試。
2. 使用Robolectric進行Test
首先複製androidTest文件夾到同一個目錄下,重命名爲test。打開Build Variant,選擇Unit Tests。

修改build.gradle,增長Robolectric依賴以下。
1 2 3 4 5 6 7 8 9 10 11 |
{ ... dependencies { ... testCompile 'junit:junit:4.12' testCompile "org.assertj:assertj-core:1.7.0" testCompile( 'org.robolectric:robolectric:3.0-rc2' ) { exclude group: 'commons-logging' , module: 'commons-logging' exclude group: 'org.apache.httpcomponents' , module: 'httpclient' } } |
刪除test目錄下的MainActivityTest.java,新建MainActivityUnitTest.java代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, emulateSdk = 21) public class MainActivityUnitTest { private MainActivity activity; @Before public void setUp() throws Exception { activity = Robolectric.setupActivity(MainActivity.class); } @Test public void testHelloWorld() throws Exception { TextView helloWorldTextView = (TextView) activity.findViewById(R.id.textview_id); assertThat(helloWorldTextView.getText().toString()).isEqualTo( "Hello World!" ); } } |
右鍵點擊test目錄下的MainActivityUnitTest.java,選擇Run。

以後能夠在控制檯看到測試成功的信息。
此時到Run -> Edit Configurations查看,能夠看到增長了MainActivityUnitTest,以下圖所示。

把assertThat(helloWorldTextView.getText().toString()).isEqualTo(「Hello world!」)中的world改成World,再次Run改測試,能夠在控制檯看到錯誤信息以及生成的錯誤報告的地址,錯報告內容以下圖所示:

3. 小結
Espresso做爲Google推出的Instrumentation UI測試框架,在API支持方面有着自然的優點,在推出後很大程度上替代了Robotium。而Robolectric因爲只在Java虛擬機中運行,速 度很快,雖然在API支持上沒法和Espresso相比,但速度有很大優點,適合單元測試,尤爲是TDD時使用。