Espresso:进行多次测试与一次用户体验相比,advantages/disadvantages 有何不同?
Espresso: What are the advantages/disadvantages of having multiple tests vs. one user journey?
例如,我有一个应用程序,其中包含一个带有按钮的 MainActivity 和一个包含 RecyclerView 的 NextActivity,该 RecyclerView 在垂直列表中填充了整数。我可以编写以下单独的 Espresso 测试:
测试 1:
public class MainScreenTest {
@Rule
public IntentsTestRule<MainActivity> mainActivityRule =
new IntentsTestRule<>(MainActivity.class);
@Test
public void shouldOpenNextActivityOnClick() {
onView(withId(R.id.btn)).check(matches(withText("foo")));
onView(withId(R.id.btn))
.perform(click());
intended(hasComponent("com.example.androidplayground.NextActivity"));
}
}
测试 2:
public class NextScreenTest {
@Rule
public ActivityTestRule<NextActivity> nextActivityRule =
new ActivityTestRule<>(NextActivity.class);
@Test
public void shouldScrollToItem() throws Exception {
int position = 15;
onView(withId(R.id.rv))
.perform(RecyclerViewActions.scrollToPosition(position));
onView(withText(position)).check(matches(isDisplayed()));
}
}
或者,我可以编写一个涵盖两者的测试:
public class UserJourneyTest {
@Rule
public ActivityTestRule<MainActivity> mainActivityRule =
new ActivityTestRule<MainActivity>(MainActivity.class);
@Test
public void userJourney() {
onView(withId(R.id.btn)).check(matches(withText("foo")));
onView(withId(R.id.btn))
.perform(click());
int position = 15;
onView(withId(R.id.rv))
.perform(RecyclerViewActions.scrollToPosition(position));
onView(withText(position)).check(matches(isDisplayed()));
}
}
一种方法比另一种更好吗?通过一个用户旅程而不是多个单独的测试,我是否会显着提高性能?
我的观点是,如果您通过单击按钮从 MainActivity 导航到 NextActivity,您不会希望编写直接启动 NextActivity 的测试。当然,espresso 允许这样做,但是如果从 MainActivity 有一些数据传递给 NextActivity,如果您的测试直接启动 NextActivity,您将不会拥有它们。
我想说的是,首先要通过编写 UI 自动化测试来模拟用户的行为。所以我会选择你上面发布的第三个选项,UserJourneyTest.class
在您的情况下,这不是性能问题,而是正确测试的问题。
例如,我有一个应用程序,其中包含一个带有按钮的 MainActivity 和一个包含 RecyclerView 的 NextActivity,该 RecyclerView 在垂直列表中填充了整数。我可以编写以下单独的 Espresso 测试:
测试 1:
public class MainScreenTest {
@Rule
public IntentsTestRule<MainActivity> mainActivityRule =
new IntentsTestRule<>(MainActivity.class);
@Test
public void shouldOpenNextActivityOnClick() {
onView(withId(R.id.btn)).check(matches(withText("foo")));
onView(withId(R.id.btn))
.perform(click());
intended(hasComponent("com.example.androidplayground.NextActivity"));
}
}
测试 2:
public class NextScreenTest {
@Rule
public ActivityTestRule<NextActivity> nextActivityRule =
new ActivityTestRule<>(NextActivity.class);
@Test
public void shouldScrollToItem() throws Exception {
int position = 15;
onView(withId(R.id.rv))
.perform(RecyclerViewActions.scrollToPosition(position));
onView(withText(position)).check(matches(isDisplayed()));
}
}
或者,我可以编写一个涵盖两者的测试:
public class UserJourneyTest {
@Rule
public ActivityTestRule<MainActivity> mainActivityRule =
new ActivityTestRule<MainActivity>(MainActivity.class);
@Test
public void userJourney() {
onView(withId(R.id.btn)).check(matches(withText("foo")));
onView(withId(R.id.btn))
.perform(click());
int position = 15;
onView(withId(R.id.rv))
.perform(RecyclerViewActions.scrollToPosition(position));
onView(withText(position)).check(matches(isDisplayed()));
}
}
一种方法比另一种更好吗?通过一个用户旅程而不是多个单独的测试,我是否会显着提高性能?
我的观点是,如果您通过单击按钮从 MainActivity 导航到 NextActivity,您不会希望编写直接启动 NextActivity 的测试。当然,espresso 允许这样做,但是如果从 MainActivity 有一些数据传递给 NextActivity,如果您的测试直接启动 NextActivity,您将不会拥有它们。
我想说的是,首先要通过编写 UI 自动化测试来模拟用户的行为。所以我会选择你上面发布的第三个选项,UserJourneyTest.class
在您的情况下,这不是性能问题,而是正确测试的问题。