Robotium 基于 Robotium 的自动遍历方案之录制模式

Heyniu · 2017年02月06日 · 最后由 CloudHuan 回复于 2017年02月08日 · 4178 次阅读

前言

录制模式:功能测试阶段操作应用,自动记录启动 Activity 所需参数,供其他模式使用。

录制模式:360°无死角录制每个 Activity,一劳永逸。(之后无需重复录制)

现有模式

  • 快速模式:只启动 Activity,快速检测崩溃问题(如兼容性、混淆、代码问题导致的崩溃),一般几分钟可完成。
  • 迭代模式:启动 Activity 并点击每个 View。
  • 爬虫模式:通过迭代主页并记录新开 Activity,迭代完毕后读取新开 Activity,循环往复。
  • 录制模式:需人工操作应用,记录每个新开的 Activity,供快速模式、迭代模式使用。

流程图

参数节选

Tag
Activity: com.abc.MyGroupActivity
String Type int 1
String projectId int 0
String title String 
String commentId int 0

Tag
Activity: com.abc.search.ui.SearchAdActivity
String type int 7
String typeName String 发现群

Tag
Activity: com.abc.group.ui.CreateGroupActivity
String CreateGroupGrade int 1
String GroupMemberLimit int 100

参数怎么用

  • 参数经过处理后变成 json 格式文件

  • 快速模式或迭代模式读取 json 文件

  • 代码节选

/**
   * Reads the json file, generates the parameters required for the iteration, and ignores part of the activity.
   * @throws Exception
   */
  private void handleParams() throws Exception {
      String json = FileUtils.readJson();
      Log.i(LOG_TAG, "json: " + json);
      ArrayList<Params> arrayList = filterActivities(JsonParser.fromJson(json), activityUtils.getAllActivities(context));
      Log.d(LOG_TAG, "Params size: " + arrayList.size());
      for (Params params : arrayList) {
          boolean isIgnore = false;
          Log.d(LOG_TAG, "Activity: " + params.name);
          if(config.mode == Config.Mode.REPTILE && params.name.contains(config.homeActivity))continue;
          for (String name: config.ignoreActivities) {
              if (params.name.contains(name)) {
                  isIgnore = true;
                  break;
              }
          }
          Log.d(LOG_TAG, "Ignore: " + isIgnore);
          if (!isIgnore) {
              Map<String, Object> hashMap = new HashMap<String, Object>();
              for (Param param : params.params) {
                  Log.d(LOG_TAG, param.key + " " + param.value);
                  hashMap.put(param.key.split("\\|")[1], IntentParser.parseType(param.value));
              }
              iteration(params.name, hashMap.isEmpty() ? null : hashMap,
                      config.mode != Config.Mode.FAST && params.iteration, params.web);
          }
      }
  }

怎么启动 Activity

一触即达的凶残方式

举例:

  • 在已经登录的情况下想退出当前账号重新登录
  • 一般的可能方式:在主页点击个人中心,滑动到列表底部,点击退出登录按钮,跳转到登录页面
  • 一触即达:拿到启动登录页面所需参数,直接从主页就能启动

通过读取 json 文件获取相应参数直接启动 Activity

json 文件节选

[
  {
    "iteration": true,
    "name": "com.abc.search.ui.SearchAdActivity",
    "params": [
      {
        "key": "String|typeName",
        "value": "String|发现群"
      },
      {
        "key": "String|type",
        "value": "int|7"
      }
    ]
  },
  {
    "iteration": true,
    "name": "com.abc.UserInfoActivityV2",
    "params": [
      {
        "key": "String|UserId",
        "value": "int|3511"
      },
      {
        "key": "String|UserType",
        "value": "int|1"
      },
      {
        "key": "String|DongCircle",
        "value": "boolean|true"
      },
      {
        "key": "String|FromGroup",
        "value": "boolean|false"
      },
      {
        "key": "String|ReceiverUserUId",
        "value": "int|0"
      },
      {
        "key": "String|ReceiverGroupUserType",
        "value": "int|0"
      }
    ]
  }
]

录制模式代码

这个部分涉及的模块比较多(不好提取)就不分享了,完整的自动遍历近期会上传 Github。

最后

好像没什么要说的,如有错误请轻拍。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 25 条回复 时间 点赞

👍 👍 👍 👍 👍 👍 太强了

app 内的 Activity 如何去遍历得到的?

#2 楼 @testly solo.getCurrentActivity()就能拿到当前的 activity 实例了,然后调用下面方法就能拿到这个 activity 的传参

/**
     * Parse the activity parameters.
     * @param activity activity
     * @return HashMap
     */
    private static Map<String, Object> parseIntent(Activity activity){
        Map<String, Object> hashMap = new HashMap<String, Object>();
        if (activity == null)return hashMap;
        android.content.Intent intent = activity.getIntent();
        if (intent != null) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Set<String> stringSet = bundle.keySet();
                for(String s: stringSet){
                    hashMap.put(s, bundle.get(s));
                }
            }
        }
        return hashMap;
    }

#2 楼 @testly solo.getCurrentActivity()就能拿到当前的 activity 实例了,然后调用下面方法就能拿到这个 activity 的传参

/**
     * Parse the activity parameters.
     * @param activity activity
     * @return HashMap
     */
    private static Map<String, Object> parseIntent(Activity activity){
        Map<String, Object> hashMap = new HashMap<String, Object>();
        if (activity == null)return hashMap;
        android.content.Intent intent = activity.getIntent();
        if (intent != null) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Set<String> stringSet = bundle.keySet();
                for(String s: stringSet){
                    hashMap.put(s, bundle.get(s));
                }
            }
        }
        return hashMap;
    }

能否上传到 github 分享下啊 感谢😀

😂 点了一下回复怎么回复了 2 条?@seveniruby

😂 点了一下回复怎么回复了 2 条?@seveniruby

#5 楼 @testerwan 代码涉及模块太多不好提取,Github 近期会上传,哪里不明白的可以问我😀

#5 楼 @testerwan 代码涉及模块太多不好提取,Github 近期会上传,哪里不明白的可以问我😀

#9 楼 @heyniu 我也测试下 极端情况下会回复成两条. @Lihuazhang

Heyniu #11 · 2017年02月07日 Author

#10 楼 @seveniruby 点一下 2 条,我的鼠标或许有问题?


Heyniu #12 · 2017年02月07日 Author

#10 楼 @seveniruby 点一下 2 条,我的鼠标或许有问题?


Heyniu #13 · 2017年02月07日 Author

应该是 bug 了,粘贴图片都会出现 3 条,还好不用换鼠标。

Heyniu #14 · 2017年02月07日 Author

应该是 bug 了,粘贴图片都会出现 3 条,还好不用换鼠标。

#14 楼 @heyniu 你退出重新登录下试试, 你是什么环境

期待后续分享

Heyniu #17 · 2017年02月07日 Author

#15 楼 @seveniruby chrome 56.0.2924.87 (64-bit) win7

Heyniu #18 · 2017年02月07日 Author

#16 楼 @lose 好的

#3 楼 @heyniu 这是获取当前的 Activity,app 内部有多少 Activity 如何得到

/**
     * Get target package activities.
     * @param context context
     * @return activities
     */
    public ActivityInfo[] getAllActivities(Context context){
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo info = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
            return info.activities;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

这样就能拿到 app 内部有多少 activity

好酷!我也在使用 Robotium,每次都通过命令行获取 Activity,看了楼主的,简直大开眼界!

@heyniu 楼主可否加个微信?

#23 楼 @huig1149 企鹅 335827476

正好最近想要弄 robotium 的自动遍历工具 😺 这篇文章值得参考下 thx

Heyniu 基于 Robotium 的自动遍历方案——开源 中提及了此贴 02月13日 11:40
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册