web-dev-qa-db-ja.com

エスプレッソで複数のアクティビティをテストする

Android espressoフレームワークを使用して、いくつかのアクティビティにわたってテストを作成することは可能ですか?

39
fernandohur

はい、可能です。サンプルの1つで、ここでデモを行いました https://github.com/googlesamples/Android-testing/blob/master/ui/espresso/BasicSample/app/src/androidTest/Java/com/example/ Android/testing/espresso/BasicSample/ChangeTextBehaviorTest.Java

@Test
public void changeText_newActivity() {
    // Type text and then press the button.
    onView(withId(R.id.editTextUserInput)).perform(typeText(STRING_TO_BE_TYPED),
            closeSoftKeyboard());
    onView(withId(R.id.activityChangeTextBtn)).perform(click());

    // This view is in a different Activity, no need to tell Espresso.
    onView(withId(R.id.show_text_view)).check(matches(withText(STRING_TO_BE_TYPED)));
}

インラインコメントを読んでください。

Espressoは、新しいアクティビティがロードされるのを暗黙的に処理します。

38
Jigish Chawda

複数のアクティビティにまたがるエスプレッソ(またはインスツルメンテーションベースの)テストを書くことは絶対に可能です。 1つのアクティビティから開始する必要がありますが、アプリケーションのUIを介して他のアクティビティに移動できます。唯一の注意点-セキュリティ制限のため、テストフローはアプリケーションのプロセス内にとどまらなければなりません。

11
ValeraZakharov

私はこれを次のようにテストしました:

onView(withId(R.id.hello_visitor)).perform(click());
pressBack();
onView(withId(R.id.hello_visitor)).check(matches(isDisplayed())); //fails here

クリック操作により、明らかに新しいアクティビティが開始されます。

8
stef

HomeActivitySearchResultsActivityの2つのアクティビティがあるとします。テストでは、HomeActivityでいくつかのアクションを実行し、SearchResultsActivityで結果を確認します。次に、テストは次のように記述されます。

public class SearchTest extends ActivityInstrumentationTestCase2<HomeActivity> {

    public SearchTest() {
        super(HomeActivity.class);
    }

    protected void setUp() throws Exception {
        super.setUp();
        getActivity(); // launch HomeActivity
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testSearch() {
        onView(withId(R.id.edit_text_search_input)).perform(typeText("Hello World"));
        onView(withId(R.id.button_search)).perform(click());
        // at this point, another activity SearchResultsActivity is started
        onView(withId(R.id.text_view_search_result)).check(matches(withText(containsString("Hello World"))));
    }

}

そのため、気にする必要があるのは、ActivityInstrumentationTestCase2 <FirstActivity>からテストクラスを拡張し、コンストラクターでsuper(FirstActivity。class)を呼び出すことだけです。

上記の例はかなり簡単です。

高度な例(startActivityForResultが発生した場合):

2つのアクティビティAとBがまだあり、アプリケーションフローが上記と異なる場合、テストを書くのは本当に混乱する場合があります。

  1. ユーザーはアクティビティAで何もしませんが、アクティビティAはstartActivityForResultを呼び出してアクティビティBを起動します。
  2. 次に、ユーザーはいくつかの入力を行い、アクティビティBをクリックします(この部分は実際のテストです)。
  3. 最後にアクティビティBが終了し、setResultを呼び出してアクティビティAを再開します(ここで結果を確認する必要があります)。

テスト部分全体がアクティビティBで発生する場合でも、アクティビティAで1つの小さなピースを検証する必要がある場合がありますが、テストはActivityInstrumentationTestCase2 <ActivityWhoCallsStartActivityForResult>アクティビティBではなく拡張する必要がありますそれ以外の場合、テストパーツが完了すると、アクティビティAは再開されず、結果を検証する機会がありません。

7
Jing Li