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

Heyniu · February 06, 2017 · Last by CloudHuan replied at February 08, 2017 · 2464 hits

前言

录制模式:功能测试阶段操作应用,自动记录启动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 · February 07, 2017 作者

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


Heyniu #12 · February 07, 2017 作者

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


Heyniu #13 · February 07, 2017 作者

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

Heyniu #14 · February 07, 2017 作者

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

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

期待后续分享

Heyniu #17 · February 07, 2017 作者

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

Heyniu #18 · February 07, 2017 作者

#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 楼主可否加个微信?

Heyniu #24 · February 08, 2017 作者

#23楼 @huig1149 企鹅335827476

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

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