有没有办法用多种测试方法运行Espresso测试,但只有一种设置方法?

我今天做了一个简单的测试:

@RunWith(AndroidJUnit4.class) @LargeTest public class WhenNavigatingToUsersView { @Rule public ActivityTestRule mActivityRule = new ActivityTestRule(MainActivity.class); private MainActivity mainActivity; @Before public void setActivity() { mainActivity = mActivityRule.getActivity(); onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); } @Test public void thenCorrectViewTitleShouldBeShown() { onView(withText("This is the Users Activity.")).check(matches(isDisplayed())); } @Test public void thenCorrectUserShouldBeShown() { onView(withText("Donald Duck (1331)")).check(matches(isDisplayed())); } } 

但是对于每个测试方法都会运行setActivity ,如果你有10-15个方法,那么最终会很费时(如果你有很多视图的话)。

@BeforeClass似乎不起作用,因为它必须是静态的,因此也强制ActivityTestRule是静态的。

那么有没有其他方法可以做到这一点? 而不是在同一测试方法中有多个断言?

@Before注释应仅在包含初步设置的方法之前。 初始化所需对象,获取当前会话或当前活动,您就会明白。

它正在从ActivityInstrumentationTestCase2替换旧的setUp()方法,就像@After替换tearDown() 。 这意味着它应该在课堂上的每个测试之前执行,它应该保持这种状态。

在此方法中,您应该没有ViewInteraction ,没有DataInteraction ,没有AssertionsView动作,因为这不是它的目的。

在您的情况下,只需从setActivity()删除onView()调用并将其放在实际的测试方法中,如果需要,在每个测试方法中,如下所示:

 @RunWith(AndroidJUnit4.class) @LargeTest public class WhenNavigatingToUsersView { @Rule public ActivityTestRule mActivityRule = new ActivityTestRule(MainActivity.class); private MainActivity mainActivity; @Before public void setActivity() { mainActivity = mActivityRule.getActivity(); // other required initializations / definitions } @Test public void thenCorrectViewTitleShouldBeShown() { onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); onView(withText("This is the Users Activity.")).check(matches(isDisplayed())); } @Test public void thenCorrectUserShouldBeShown() { onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); onView(withText("Donald Duck (1331)")).check(matches(isDisplayed())); } } 

您的另一个选择是分离这些测试。

单击用户的图标将在HomeActivity测试类中,而其余测试将在UserActivity测试类中。

UserActivity测试类将使用正确的Intent启动UserActivity(您可以通过将false布尔值传递给Rule构造函数并手动调用launchActivity(intent) )。

这将消除每次设置活动的必要性。 它也将摆脱对主要活动的持续依赖。 如果出现问题,您的UserActivity测试将完好无损并产生结果,而问题将由MainActivity中的测试捕获。

实际上,通过这样做,您的测试可能会变成MediumSize,因为运行时间会急剧减少。

你可以试试这个:

 **** Setting **** public void testStory() throws Exception { } public void testStory2() throws Exception { } public void testStory3() throws Exception { } 

尝试通过此命令运行测试:

 ./gradlew cC 

您是否尝试按以下方式执行此操作或根据您的需要进行微小修改:

 @Rule public ActivityTestRule mActivityRule = new ActivityTestRule(MainActivity.class); private MainActivity mainActivity = mActivityRule.getActivity(); @BeforeClass public static void setActivity() { onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); } 

这样,你’mainActivity’就不必是静态的。 此外, setActivity()方法只会被调用一次。