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

时间:2015-05-29 09:03:32

标签: android junit4 android-espresso

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

@RunWith(AndroidJUnit4.class)
@LargeTest
public class WhenNavigatingToUsersView {

    @Rule
    public ActivityTestRule<MainActivity> 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变为静态。

还有其他方法吗?而不是在同一个测试方法中有多个断言?

4 个答案:

答案 0 :(得分:3)

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

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

此方法中您应该没有tearDown(),没有ViewInteraction,没有DataInteractionAssertions操作,因为这不是它的目的。

在您的情况下,只需从View中移除onView()来电并将其放入实际测试方法中,如有必要,请将其放入每个测试方法中,如下所示:

setActivity()

答案 1 :(得分:0)

另一个选择是将这些测试分开。

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

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

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

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

答案 2 :(得分:0)

你可以试试这个:

**** Setting ****
public void testStory() throws Exception {

}

public void testStory2() throws Exception {

}

public void testStory3() throws Exception {

}

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

./gradlew cC 

答案 3 :(得分:0)

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

@Rule
public ActivityTestRule<MainActivity> 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()方法只会被调用一次。