Android測試(一):在Android中測試App

來源:互聯網
上載者:User

標籤:input   when   檔案中   設計   使用者   導致   本地   hat   截取   

Android測試(一):在Android中測試App

發布時間 2017年12月20日 蟲師

原文:https://developer.android.com/training/testing/index.html

測試你的App是開發過程中的重要組成部分。通過對應用程式持續的運行測試,你可以驗證程式的正確性、功能和可用在發布之前。

測試還提供了以下優點:

  • 快速反饋失敗。
  • 開發週期的早期問題檢測。
  • 安全地重構代碼,讓你最佳化代碼而不用擔心迴歸。
  • 穩定開發速度,協助你減少技術債務。

這裡的特指測試通過代碼實現的“單元”測試。所以,它可以更早、更快的幫我們發現問題,使我們的代碼重構更有信心;單元測試雖然前期編寫會比較耗時,但是它可以有效代碼的品質,不會導致項目後期代碼充滿壞味道,嚴重拖慢開發進度;所以,減少你技術債務。

資源

在Android測試庫、Android平台和開源社區都提供了協助你編寫Android應用測試的工具:

Espesso

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 的測試代碼:

@Testpublic 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

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

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 測試。

Android測試(一):在Android中測試App

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.