如何使用Espresso测试特定活动?

时间:2016-07-25 13:59:57

标签: android android-testing android-espresso

我刚刚开始在Android上进行测试,这看起来非常基本,但经过大量谷歌搜索,我仍无法在任何地方找到答案。

在我的Android应用中,显示的第一个活动是登录屏幕,然后是主屏幕,其中包含导航到其他活动的选项。为了测试我想要的活动,我现在必须首先完成这两项活动。

如何设置Espresso测试(使用ActvityTestRule / JUnit4),以便它立即启动我想要测试的活动?

修改

更具体地说,我的问题是,在Espresso测试的所有教程中,所有测试都从应用程序的主要活动开始,使用看起来像这样的ActivityTestRule

@Rule
public final ActivityTestRule<MainActivity> mRule = new ActivityTestRule<MainActivity>(MainActivity.class);

我希望测试从指定的活动开始,目前我通过不断重复测试代码导航到这个

onView(withId(R.id.go_to_other_activity_button)).perform(click())

1 个答案:

答案 0 :(得分:12)

如果您想运行特定活动,那么: 您需要ActivityTestRule或IntentTestRule。

合同是非常自我解释的,只需设置您想要作为第一个参数开始的所需活动。

ActivityTestRule<>(ActivityYouWantToStart.class, initialTouchMode, launchActivity) //rule for activity start


IntentTestRule<>(ActivityYouWantToStart.class, initialTouchMode, launchActivity) //used for testing intents and activities

重要的是要注意这里是 launchActivity 布尔值。 如果将此值设置为true,则每个测试都将自动启动该活动。

其他用法是,如果某些活动期望在运行它们之前发送一些意图,数据或类似信息,您可以将此参数设置为 false 并在运行测试/活动之前准备您的应用

例如,如果您需要保存在共享首选项中的已登录用户来运行活动B并且该活动的逻辑说明:

if(!userIsLoggedIn()){

    jumpToMainActivity();

}

然后你可以在运行那个测试之前保存一些模拟用户,或者例如用模拟对象填充数据库,然后在为Activity B准备环境之后,然后调用。

mActivityRule.launchActivity(null);

请注意,launchActivity接受一个参数,这实际上是Activity B接收的Intent,如果它以这种方式需要一些额外的数据,则可以在开始测试之前准备Intent。

运行自定义活动的完整示例:

/**
* Testing of the snackbar activity.
**/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class SnackbarActivityTest{
    //espresso rule which tells which activity to start
    @Rule
    public final ActivityTestRule<SnackbarActivity> mActivityRule = 
        new ActivityTestRule<>(SnackbarActivity.class, true, false);


    @Override
    public void tearDown() throws Exception {
        super.tearDown();
        //just an example how tear down should cleanup after itself
        mDatabase.clear();
        mSharedPrefs.clear();
    }

    @Override
    public void setUp() throws Exception {
        super.setUp();
        //setting up your application, for example if you need to have a user in shared
        //preferences to stay logged in you can do that for all tests in your setup
        User mUser = new User();
        mUser.setToken("randomToken");
    }

    /**
    *Test methods should always start with "testXYZ" and it is a good idea to 
    *name them after the intent what you want to test
    **/
    @Test
    public void testSnackbarIsShown() {
        //start our activity
        mActivityRule.launchActivity(null);
        //check is our text entry displayed and enter some text to it
        String textToType="new snackbar text";
        onView(withId(R.id.textEntry)).check(matches(isDisplayed()));
        onView(withId(R.id.textEntry)).perform(typeText(textToType));
        //click the button to show the snackbar
        onView(withId(R.id.shownSnackbarBtn)).perform(click());
        //assert that a view with snackbar_id with text which we typed and is displayed
        onView(allOf(withId(android.support.design.R.id.snackbar_text), 
        withText(textToType))) .check(matches(isDisplayed()));
    }
}