Android espressoフレームワークを使用して、いくつかのアクティビティにわたってテストを作成することは可能ですか?
はい、可能です。サンプルの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は、新しいアクティビティがロードされるのを暗黙的に処理します。
複数のアクティビティにまたがるエスプレッソ(またはインスツルメンテーションベースの)テストを書くことは絶対に可能です。 1つのアクティビティから開始する必要がありますが、アプリケーションのUIを介して他のアクティビティに移動できます。唯一の注意点-セキュリティ制限のため、テストフローはアプリケーションのプロセス内にとどまらなければなりません。
私はこれを次のようにテストしました:
onView(withId(R.id.hello_visitor)).perform(click());
pressBack();
onView(withId(R.id.hello_visitor)).check(matches(isDisplayed())); //fails here
クリック操作により、明らかに新しいアクティビティが開始されます。
HomeActivityとSearchResultsActivityの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がまだあり、アプリケーションフローが上記と異なる場合、テストを書くのは本当に混乱する場合があります。
テスト部分全体がアクティビティBで発生する場合でも、アクティビティAで1つの小さなピースを検証する必要がある場合がありますが、テストはActivityInstrumentationTestCase2 <ActivityWhoCallsStartActivityForResult>アクティビティBではなく拡張する必要がありますそれ以外の場合、テストパーツが完了すると、アクティビティAは再開されず、結果を検証する機会がありません。