Monkey 为何无法生成相同的事件序列?

8次阅读
没有评论

问题描述

使用 Android 的 Monkey 工具进行压力测试时发现,即使每次都设置相同种子(seed),每次运行也产生了不同的事件序列。具体表现为不同应用的启动时间在各次实验中存在差异。
对于这种现象原因,有人建议如下几点:1. 每次重新启动后是否清除了所有应用程序的状态;2. 是否仅进行部分重置而未完全重启系统或清理应用数据;3. 应用内部状态对事件序列的影响等。

解决方案

方案1: 清除启动时的应用程序状态

为了确保每次 Monkey 运行中的应用程序都处于相同的起始状态,需要定期清除每个应用的私有存储和初始化状态。可以通过使用 adb shell pm clear packageName 命令来清空一个应用的全部数据。

步骤:

  1. 编写脚本来自动清空指定的应用程序
    “`bash
    #!/bin/bash

APK_PACKAGES=”com.android.chrome com.facebook.katana com.google.android.apps.maps”

for pkg in $APK_PACKAGES; do
adb shell pm clear $pkg
done
“`

  1. 在 monkey 之后运行该脚本
    添加如下命令行,确保所有应用的状态被清除后再进行 Monkey 测试:
    “`bash
    while true; do
    # 清空已有的应用数据以便从一个干净状态开始
    ./clear_app_data.sh

    adb shell monkey -p com.android.chrome -s 1 –pct-appswitch 100 –ignore-crashes –ignore-timeouts –ignore-security-exceptions –monitor-native-crashes -v -v 1

    # 其余应用按类似方式继续
    done
    “`

方案2: 彻底重启设备

完全重置设备有助于避免残留的系统状态影响 Monkey 的运行结果。虽然只是重启进程,但某些低级数据可能仍会残留。

初始步骤:

  1. 使用 adb 命令彻底清空所有应用和系统设置
    添加如下命令到你的测试循环中:
    “`bash
    while true; do
    # 重启并清除所有应用及其私有存储空间, 确保干净的启动状态
    sleep 2; adb reboot recovery
    adb shell pm clear com.android.chrome com.facebook.katana com.google.android.apps.maps

    adb shell monkey -p com.android.chrome -s 1 –pct-appswitch 100 –ignore-crashes –ignore-timeouts –ignore-security-exceptions –monitor-native-crashes -v -v 1
    done
    “`

  2. 保持一致的设置和种子
    确保使用相同的参数(如相同的种子值)进行每次测试。

注意:

  • 确保将此脚本或方法纳入整个集成试验过程中。这有助于保证每一轮测试从一个已知状态开始,从而使得性能测量更加可靠。
  • 考虑到设备和应用程序的启动时间可能会因网络延迟、内存使用等因素而有所不同,请继续监测这些因素的影响。

通过上述方案,应该能够有效解决 Monkey 测试中产生不同事件序列的问题。如果仍有其他问题或无法解释的现象,则需要进一步检查与测试环境相关的细节参数及条件变化。

正文完