Espresso UIテスト入門

5397 ワード

定義#テイギ#


Android JunitRunnerで実行されるinstrumentation-based APIベースのUIテストフレームワーク.

特長

  • One of the key parts of Espresso is its ability to synchronize all test actions. Espresso waits until the UI is idle before it moves to the next operation.

  • From https://codelabs.developers.google.com/codelabs/android-testing/index.html?index=..%2F..%2Findex#9
  • Espresso detects when the main thread is idle, so it is able to run your test commands at the appropriate time, improving the reliability of your tests. This capability also relieves you from having to add any timing workarounds, such as Thread.sleep() in your test code.

  • From https://www.google.com/search?q=%E7%BF%BB%E8%AF%91&oq=%E7%BF%BB%E8%AF%91&aqs=chrome..69i57j69i61l3j0l2.1255j0j7&sourceid=chrome&ie=UTF-8
  • は一度に1つのアプリケーションしかテストできません.

  • 要約


    OnView() => Click()==>Check(): 1.onView、Ondataでviewを見つけました.2.ViewAction.click()などは、UIインタラクションのセットを実行します.3.UIインタラクションの実行が完了するのを待ち、ViewAssertionsを使用して所望の状態または動作を断言する.次のコードクリップのように:
    onView(withId(R.id.my_view))            // withId(R.id.my_view) is a ViewMatcher
            .perform(click())               // click() is a ViewAction
            .check(matches(isDisplayed())); // matches(isDisplayed()) is a ViewAssertion
    

    ビューを見つけた


    Calling methods in the ViewMatchers class. For example, to find a view by looking for a text string it displays, you can call a method like this:
    onView(withText("Sign-in"));
    

    Similarly you can call withId() and providing the resource ID (R.id) of the view, as shown in the following example:
    onView(withId(R.id.button_signin));
    

    Android resource IDs are not guaranteed to be unique. If your test attempts to match to a resource ID used by more than one view, Espresso throws an AmbiguousViewMatcherException.
    From https://developer.android.com/training/testing/ui-testing/espresso-testing.html#build
    より正確にviewを見つけます.
    onView(allOf(withId(R.id.button_signin), withText("Sign-in")));
    

    From https://developer.android.com/training/testing/ui-testing/espresso-testing.html#build
    に注意
    AdapterViewタイプのview GroupのいずれかのサブViewであれば、(ListView、GridView)onData()を使用する必要があります.

    インタラクティブな操作の実行


    UIインタラクションを実行するためのAPIは、次のように、ViewActionsにカプセル化されています.
    •   ViewActions.click(): Clicks on the view.
    •   ViewActions.typeText(): Clicks on a view and enters a specified string.
    •   ViewActions.scrollTo(): Scrolls to the view. The target view must be subclassed from ScrollView and the value of its android:visibilityproperty must be VISIBLE. For views that extend AdapterView (for example, ListView), the onData() method takes care of scrolling for you.
    •   ViewActions.pressKey(): Performs a key press using a specified keycode.
    •   ViewActions.clearText(): Clears the text in the target view.
    

    From https://developer.android.com/training/testing/ui-testing/espresso-testing.html#build

    検証結果


    ViewInteraction、DataInteractionは、UIの状態が所望に合致するかどうかを検証するためにcheck()を提供します.Check()はパラメータを受け入れます.
     // Check that the text was changed.
       onView(withId(R.id.textToBeChanged))
               .check(matches(withText(STRING_TO_BE_TYPED)));
    

    From https://developer.android.com/training/testing/ui-testing/espresso-testing.html#build

    Idling resources


    Espressoの重要な利点は、UIがアイドル状態になるのを自動的に待つことで、次の操作を開始することです.たとえば、Espressoは、AsyncTaskバックグラウンド操作の実行が完了するのを自動的に待ってから、次の操作を開始します.自分でwait()やsleep()を実行する必要はありません.
    ただし、スレッドを自分で管理して後者の他のバックグラウンドサービスをスケジューリングする場合、同期できない場合もあります.ただし、EspressoはIdling resourcesを提供して同期を処理します.
    From https://codelabs.developers.google.com/codelabs/android-testing/index.html?index=..%2F..%2Findex#9Espressoに組み込まれた実装クラスCountingIdlingResourceをTestに使用するには、@Before関数にregisterIdlingResourceを登録する必要があります.increment()decrement()を呼び出してアクセスできるカウンタが含まれています.
    // The network request might be handled in a different thread so make sure Espresso knows
        // that the app is busy until the response is handled.
        EspressoIdlingResource.increment(); // App is busy until further notice
    mNotesRepository.getNotes(new NotesRepository.LoadNotesCallback() {
            @Override
            public void onNotesLoaded(List notes) {
                EspressoIdlingResource.decrement(); // Set app as idle.
                mNotesView.setProgressIndicator(false);
                if (notes.isEmpty()) {
                    mNotesView.showNotesEmptyPlaceholder();
                } else {
                    mNotesView.showNotes(notes);
                }
            }
        });
    

    時間のかかる操作を実行すると、呼び出すことができます.
    EspressoIdlingResource.increment()//UI 
    

    時間がかかる操作が完了すると、コールバック関数が呼び出されます.
    EspressoIdlingResource.decrement(); //  Espresso UI ,
    

    このとき、次の操作を続行できます.

    関連リンク

  • https://github.com/googlesamples/android-testing
  • https://stackoverflow.com/questions/31076228/android-testing-uiautomator-vs-espresso/34261832#34261832
  • https://codelabs.developers.google.com/codelabs/android-testing/index.html?index=..%2F..%2Findex#0
  • https://objectpartners.com/2013/09/18/the-benefits-of-using-assertthat-over-other-assert-methods-in-unit-tests/