monkey 的架构大致分为,OptionProcessor,MonkeyEvent,ExceptionCollector,EventGenerator,Executor。
基本流程是这样的,
- 根据(测试人员)传入的测试参数设定执行参数,生成相关的测试 Event,发送 Event
- 通过 ExceptionCollector 进行异常监听,当有异常(ANR,Crash)发生时,会记录标志位
- 每个 Event 后,检查异常标志位,并根据测试参数来决定是否报告此次异常,并终止测试
据此,可以做出如下改进。
增加 CPU 数据收集
monkey 的流程中是没有全过程 cpu 数据采集的,但作为性能测试工具,cpu 的过程信息非常有必要保存下来
采集的办法有两种,简单一点的,通过持续输出并保存 top 命令信息即可。另外一种,通过读取运行 package 对应的 pid/stat,对数据加以处理后存入文件。
增加内存数据收集
内存数据采集,通过 dumpsys meminfo packageName 收集。
增加事件重试
当 monkey 在执行 TOUCH 事件时,应该是 DOWN 和 UP 成对出现并且都发送成功。而 monkey 调用的事件模拟接口 InputManager.injectEvent 可能会返回 false,尤其当 DOWN 事件 true 而 UP 事件 false 时会造成屏幕控件处于 long click 的状态。
为了避免这种错误发生,在上述成对的事件中,我们对 DOWN 的返回值进行判断,如果是 false,则应该重试发送,直到为 true 再进行下一组事件发送
增加 ANR 和 CRASH 去重
我们知道 monkey 长时间测试时,可能会产生很多 ANR 和 CRASH,这里面会有大量重复的问题,如果不加以检索统统提报,会造成严重的重复,而人工查重工作量又十分大。
对于发生的 ANR 和 CRASH,采用合适的数据结构存储关键信息,当有新的问题发生时,重复值则不再记录。最后将唯一的 ANR 和 CRASH 信息输出。