原文:https://developer.android.com...html
測試你的App是開發過程當中的重要組成部分。經過對應用程序持續的運行測試,你能夠驗證程序的正確性、功能和可用在發佈以前。java
測試還提供瞭如下優勢:android
這裏的特指測試經過代碼實現的「單元」測試。因此,它能夠更早、更快的幫咱們發現問題,使咱們的代碼重構更有信心;單元測試雖然前期編寫會比較耗時,可是它能夠有效的代碼的質量,不會致使項目後期代碼充滿壞味道,嚴重拖慢開發進度;因此,減小你技術債務。安全
在Android測試庫、Android平臺和開源社區都提供了幫助你編寫Android應用測試的工具:框架
Espresso是android應用開發自帶測試庫。他是一款白盒風格的UI測試工具。UI測試就都是黑盒的麼?爲何會是白盒風格。工具
說白盒是由於,經過Espresso編寫測試調用Android控件的方式和 Android開發中是同樣的。
來看一段Android開發中,Activity中編寫的代碼。佈局
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button Intent intent = new Intent(this, DisplayMessageActivity.class); EditText editText = (EditText) findViewById(R.id.edit_message); String message = editText.getText().toString(); intent.putExtra(EXTRA_MESSAGE, message); startActivity(intent); }
經過 R.id.edit_message
調用佈局文件中輸入框中的內容,並轉交到另一個Activity處理。單元測試
再來看一段 Espesso 的測試代碼:測試
@Test public void InputEditCase() throws InterruptedException{ onView(withId(R.id.edit_message)).perform(typeText(STRING_TO_BE_TYPED)); onView(withId(R.id.send_button)).perform(click()); onView(withId(R.id.display_message)).check(matches(isDisplayed())); onView(withId(R.id.display_message)).check(matches(withText("hello," +STRING_TO_BE_TYPED))); }
一樣使用的是 R.id.edit_message
的定位方式來查找控件,是否是白盒?咱們一般的黑盒UI自動化測試是經過UI屬性查看工具(如:UIAutomatorViewer)肯定元素的屬性來進行定位的。Espesso不須要,你看代碼就行了,準確點是看Android的佈局文件的控件定義。優化
可是,Espesso的運行是基於 SDK 的,因此,要想運行一條用例必須在Android模擬器(或真機)上安裝App,啓動App,而後基於UI的操做來運行測試用例。
Robolectric是一款第三方的開源的Android單元測試框架。運行在JVM上,因此它運行速度上會比 Espesso快上不少。
@RunWith(RobolectricTestRunner.class) public class MyActivityTest { @Test public void clickingButton_shouldChangeResultsViewText() throws Exception { MyActivity activity = Robolectric.setupActivity(MyActivity.class); Button button = (Button) activity.findViewById(R.id.button); TextView results = (TextView) activity.findViewById(R.id.results); button.performClick(); assertThat(results.getText().toString()).isEqualTo("Robolectric Rocks!"); } }
來一段官方Demo,robolectric的作法是經過實現一套JVM能運行的Android代碼,而後在單元測試運行的時候去截取android相關的代碼調用,而後轉到他們的他們實現的代碼去執行這個調用的過程。
你不明白原理也不要緊,反正知道Robolectric的運行不須要你真正的打開App去執行測試,就像運行一段普通的Java代碼同樣。因此速度上固然就很快了。
AndroidJUnitRunner本質上不算是個測試工具,它只是Google基於Junit針對Anroid封裝的一個測試用例運行器而已。至於它用來運行Espesso仍是Uiautomator的用例都是能夠的。那Robolectric呢?沒看到上面的例子中Robolectric有本身的運行器叫RobolectricTestRunner
@RunWith(AndroidJUnit4.class) public class MainActiveTest{ …… }
若是看到測試類是用 AndroidJUnit4
註釋的,說明用的就是AndroidJUnitRunner運行器的。
最後,更好的編寫測試用例的平臺,固然是Google家的親兒子了。器大活好不粘人!(如今才發現不是去幼兒園的車,晚了,把車門給我捍死,一個都不許下車。)
Android Studio 以簡化測試爲設計宗旨。 您只需完成幾回點擊,即可創建一個在本地 JVM 上運行的 JUnit 測試,或創建一個在設備上運行的儀器測試。
固然,您也能夠經過集成測試框架來擴展測試能力,例如能夠集成 Mockito 在本地單元測試中測試 Android API 調用,以及集成 Espresso 或 UI Automator 在儀器測試中演練用戶交互。您能夠利用 Espresso 測試記錄器自動生成 Espresso 測試。