其他测试框架 Espresso - 跨 Activity 测试 (一般适用于 Hybrid APP)

非洲赵子龙 for 安卓Espresso菜刀队 · 2018年03月27日 · 298 次阅读

示例场景
点击一个 Native 的按钮之后,触发一个打开 Webview 的动作

示例源码

//注意,此示例的场景为在a Activity上有一个按钮,点了之后,触发打开一个新的Activity(b), 在b结束时,无需给a返回值及其他信息
public static void buyingMembers(Activity mContext) {
    Intent intent = new Intent(mContext, WebActivity.class);
    // 1-购买会员
    String url = CommonUtil.getUrlParams(Constant.URL_BUY_VIP);
    intent.putExtra(示例extra的key, url);
    mContext.startActivity(intent);
}

测试代码
注:仅检验 app 前端会去用 webview 打开正确的 url 地址

@Rule
public IntentsTestRule<MainActivity> mActivityRule = new IntentsTestRule<>(MainActivity.class);
@Test
public void MembershipCenterSuccess(){
        onView(withId(R.id.tv_main_username)).perform(click());
        onView(withId(R.id.et_username)).perform(replaceText("你的账号"));
        onView(withId(R.id.et_password)).perform(replaceText("你的密码"));
        IdlingResource idlingResource = new MainIdlingResource(mActivityRule.getActivity());
        onView(withId(R.id.bt_user_login)).perform(click());
        //异步,在登录成功或超时之前,用于阻塞测试主进程
        IdlingRegistry.getInstance().register(idlingResource);
        onView(withId(R.id.tv_main_username)).perform(click());
        IdlingRegistry.getInstance().unregister(idlingResource);

        String url = getUrlParams("示例url");
        String webActivityName = "你的新打开的webactivity名称";
        //构造(官网为stub)intent - 可以理解为activity之间通信的桥
        Matcher expectedIntent = allOf(hasExtra("extra的key",url), hasComponent(hasShortClassName(webActivityName)));
        //这里根据具体场景,如果你需要b Activity给a Activity返回值(比如b在关闭之后,a页面相应的控件文本会做更新),用来做校验
        //那么用下面的;否则, 不用写intending
        //intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(int resultCode, Intent resultData));
        onView(withId(R.id.tv_vip)).perform(click());
        //检验a Activity会发送这个构造的expectedIntent给b Activity
        //如果校验不通过,会抛出AssertionFailedError
        intended(expectedIntent);
    }

由此可见

  1. 如果你的 app 某个业务场景是两个 Activity,且,后者需要给前者返回信息用于刷新页面控件信息,则用 intending(可以再加上 intended);
  2. 如果你的 app 某个业务场景是两个 Activity,且,后者不需要给前者返回信息用于刷新页面控件信息,则用 intended;

个人推荐,可能不完美
如何校验从 Native 的 Activity 到 Webview 的 Activity,这个目前为止,我还没有找到正确的方式 (有看到的大佬请推荐下),不过我这里有一个已经实现了的可以校验的办法, 大概就是分两步:

  1. 用 Espresso 只校验相应的 intent 会被发送出去 (也就是说 url 会被 app 尽力尝试去打开);
  2. 打开后的页面显示正确性,单独采用 java 解析 html 页面上的 web 元素来完成。

参考文献
Android 自动化测试框架 Espresso(四)——intent 测试
Android 官网 Espresso 测试 Intent

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册