摘要:是一款第三方的開源的單元測試框架。當然,您也可以通過集成測試框架來擴展測試能力,例如可以集成在本地單元測試中測試調(diào)用,以及集成或在儀器測試中演練用戶交互。
原文:https://developer.android.com...
測試你的App是開發(fā)過程中的重要組成部分。通過對應(yīng)用程序持續(xù)的運行測試,你可以驗證程序的正確性、功能和可用在發(fā)布之前。
測試還提供了以下優(yōu)點:
快速反饋失敗。
開發(fā)周期的早期問題檢測。
安全地重構(gòu)代碼,讓你優(yōu)化代碼而不用擔(dān)心回歸。
穩(wěn)定開發(fā)速度,幫助你減少技術(shù)債務(wù)。
這里的特指測試通過代碼實現(xiàn)的“單元”測試。所以,它可以更早、更快的幫我們發(fā)現(xiàn)問題,使我們的代碼重構(gòu)更有信心;單元測試雖然前期編寫會比較耗時,但是它可以有效的代碼的質(zhì)量,不會導(dǎo)致項目后期代碼充滿壞味道,嚴重拖慢開發(fā)進度;所以,減少你技術(shù)債務(wù)。
資源在Android測試庫、Android平臺和開源社區(qū)都提供了幫助你編寫Android應(yīng)用測試的工具:
Espresso是android應(yīng)用開發(fā)自帶測試庫。他是一款白盒風(fēng)格的UI測試工具。UI測試就都是黑盒的么?為什么會是白盒風(fēng)格。
說白盒是因為,通過Espresso編寫測試調(diào)用Android控件的方式和 Android開發(fā)中是一樣的。
來看一段Android開發(fā)中,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 調(diào)用布局文件中輸入框中的內(nèi)容,并轉(zhuǎn)交到另外一個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的做法是通過實現(xiàn)一套JVM能運行的Android代碼,然后在單元測試運行的時候去截取android相關(guān)的代碼調(diào)用,然后轉(zhuǎn)到他們的他們實現(xiàn)的代碼去執(zhí)行這個調(diào)用的過程。
你不明白原理也沒關(guān)系,反正知道Robolectric的運行不需要你真正的打開App去執(zhí)行測試,就像運行一段普通的Java代碼一樣。所以速度上當然就很快了。
AndroidJUnitRunner本質(zhì)上不算是個測試工具,它只是Google基于Junit針對Anroid封裝的一個測試用例運行器而已。至于它用來運行Espesso還是Uiautomator的用例都是可以的。那Robolectric呢?沒看到上面的例子中Robolectric有自己的運行器叫RobolectricTestRunner
@RunWith(AndroidJUnit4.class) public class MainActiveTest{ …… }
如果看到測試類是用 AndroidJUnit4 注釋的,說明用的就是AndroidJUnitRunner運行器的。
最后,更好的編寫測試用例的平臺,當然是Google家的親兒子了。器大活好不粘人!(現(xiàn)在才發(fā)現(xiàn)不是去幼兒園的車,晚了,把車門給我捍死,一個都不準下車。)
Android Studio 以簡化測試為設(shè)計宗旨。 您只需完成幾次點擊,便可建立一個在本地 JVM 上運行的 JUnit 測試,或建立一個在設(shè)備上運行的儀器測試。
當然,您也可以通過集成測試框架來擴展測試能力,例如可以集成?Mockito?在本地單元測試中測試 Android API 調(diào)用,以及集成?Espresso?或?UI Automator?在儀器測試中演練用戶交互。
您可以利用?Espresso 測試記錄器自動生成 Espresso 測試。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/8789.html
React Native Vs. Xamarin Vs. Ionic Vs. Flutter:Which Is Best For Cross-Platform Mobile App Development? While developing Native Mobile Apps, Android apps are written in Java, and iOS ones in Swift and...
閱讀 3319·2021-11-23 09:51
閱讀 2436·2021-11-09 09:46
閱讀 1476·2019-08-30 15:54
閱讀 3121·2019-08-30 14:22
閱讀 2909·2019-08-29 12:40
閱讀 1629·2019-08-26 10:33
閱讀 1774·2019-08-23 17:09
閱讀 1553·2019-08-23 16:11