Android 是否有一种方法可以使用多种测试方法运行浓缩咖啡测试,但只能使用一种设置方法?

Android 是否有一种方法可以使用多种测试方法运行浓缩咖啡测试,但只能使用一种设置方法?,android,junit4,android-espresso,Android,Junit4,Android Espresso,我今天有一个简单的测试: @RunWith(AndroidJUnit4.class) @LargeTest public class WhenNavigatingToUsersView { @Rule public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class); private MainActivity main

我今天有一个简单的测试:

@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()));
    }
}
@RunWith(AndroidJUnit4.class)
@最大的
公共类WhenNavigatingToUsersView{
@统治
公共活动测试规则mActivityRule=
新的ActivityTestRule(MainActivity.class);
私人活动;
@以前
公共活动(){
mainActivity=mActivityRule.getActivity();
onView(allOf(withId(R.id.icon)),hasSibling(withText(R.string.users)))。执行(click());
}
@试验
public void然后更正视图标题应显示(){
onView(withText(“这是用户活动”))。检查(匹配项(isDisplayed());
}
@试验
public void ThenCorrectoreUsershouldbeshown(){
onView(带有文本(“唐老鸭(1331)”)。检查(匹配项(isDisplayed()));
}
}
但是对于每个测试方法,都会运行
setActivity
,如果您有10-15个方法,那么最终将非常耗时(如果您也有很多视图)

@BeforeClass
似乎不起作用,因为它必须是静态的,从而迫使
ActivityTestRule
也是静态的


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

@Before
注释只应位于包含初步设置的方法之前。初始化所需的对象,获取当前会话或当前活动,您就知道了

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

此方法中不应该有
ViewInteraction
、不应该有
DataInteraction
、不应该有
Assertions
View
操作,因为这不是它的目的

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

@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();
        // 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()));
    }
}
@RunWith(AndroidJUnit4.class)
@最大的
公共类WhenNavigatingToUsersView{
@统治
公共活动测试规则mActivityRule=
新的ActivityTestRule(MainActivity.class);
私人活动;
@以前
公共活动(){
mainActivity=mActivityRule.getActivity();
//其他所需的初始化/定义
}
@试验
public void然后更正视图标题应显示(){
onView(allOf(withId(R.id.icon)),hasSibling(withText(R.string.users)))。执行(click());
onView(withText(“这是用户活动”))。检查(匹配项(isDisplayed());
}
@试验
public void ThenCorrectoreUsershouldbeshown(){
onView(allOf(withId(R.id.icon)),hasSibling(withText(R.string.users)))。执行(click());
onView(带有文本(“唐老鸭(1331)”)。检查(匹配项(isDisplayed()));
}
}

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

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

UserActivity测试类将以正确的意图启动UserActivity(您可以通过将假布尔值传递到规则构造函数并手动调用
launchActivity(Intent)
来实现)

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

实际上,通过这样做,您的测试可能会变成中等大小,因为运行时将大幅减少。

您可以尝试以下方法:

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

}

public void testStory2() throws Exception {

}

public void testStory3() throws Exception {

}
尝试通过以下命令运行测试:

./gradlew cC 

您是否尝试按照以下方式进行操作,或根据您的需要对其进行微小的更改:

@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());
}
@规则
public ActivityTestRule mActivityRule=新的ActivityTestRule(MainActivity.class);
private MainActivity MainActivity=mActivityRule.getActivity();
@课前
公共静态void setActivity(){
onView(allOf(withId(R.id.icon)),hasSibling(withText(R.string.users)))。执行(click());
}

这样,您的“mainActivity”就不必是静态的。另外,
setActivity()
方法将只被调用一次。

您有点不明白我的意思。。。有没有一种方法不必为每个测试方法定义视图交互?对我来说,一个好的单元测试是,一个测试方法应该每个测试只有一个断言,并且可以在另一个方法中进行设置。考虑到这个视图将充满我想要验证的字段,如果它们存在,与每个测试的视图交互非常昂贵。当我只想“打开”该视图一次并执行多个测试时,为什么我不应该在setActivity中使用视图交互和其他内容?更好的名称应该是setupContext或其他名称,并将所有先决条件添加到测试中。这就是junit中@Before关键字的意图……我可能会这样做。但是UsersActivity不是一个活动,而是一个片段。到目前为止,我只有一项活动;主要活动。所有导航都指向不同的片段。