测试基础 CrashMonkey4Android

易寒 · 2015年06月04日 · 最后由 阿虾 回复于 2022年11月10日 · 4089 次阅读
本帖已被设为精华帖!

Monkey 相关指令

项目

源码已挂载到 github 上: CrashMonkey4Android
关联项目: CrashMonkey4iOS

简介

CrashMonkey4Android,是一个依靠 Cts 框架,对原生 Monkey 进行改造后的产物,拥有以下新增功能:

  1. 保存每一步的截图
  2. 保存 logcat
  3. 保存每一个 Monkey 事件的信息
  4. 分析 Crash
  5. Html 报告
  6. 开源,你想做的,你能做的,只要你行,你就可以做
  7. 支持多设备

环境要求

  1. 安装 JDK1.6 以上 (包括 1.6) 并配置环境变量
  2. 安装 SDK 并配置环境变量

如何使用

下面以 Mac 环境为例

第一步

同步CrashMonkey4Androd_bin 项目来获取可执行文件,或者直接下载 ZIP 包,解压。

第二步

解压后,项目目录结构如下:

这里写图片描述

找到 tools 目录下的 cts-tradefed 文件,双击会出现终端窗口:

这里写图片描述

(可以看出来我们支持多设备)

第三步

在终端输入命令 : run cts --plan Monkeyreturn ,@Monkey开跑了。

这里写图片描述

第四步

参看报告,在 tools 的同级目录 repository 下有 2 个目录很重要

  1. logs:保存测试过程中的截图和 log 信息
  2. results: 保存测试报告

这里写图片描述

首先去 results 下打开报告,一个文件夹代表一次测试,我们刚才有 2 台设备,所以生成了 2 个报告,进入文件下找到 index.html,打开:

这里写图片描述

有 crash 版本:

这里写图片描述
index.html为结果总结页面,上面显示了测试设备的硬件信息 (Hardware),被测应用信息 (Application),测试周期 (Span),结果 (Results)。下方有一个表格中显示了测试所花时间 (Duration),Monkey 的事件数 (20)。点击 result 一览的链接进入详细报告:
无 crash 版本:

这里写图片描述
有 crash 版本
这里写图片描述

详细页面中显示了最后 50 步的操作截图 (少于 50 的全部列出),截图上绘制了操作的类型,还可以点击图片查看该步操作的相关 logcat 信息。还包括 3 按钮 (crash log 按钮会在发生 crash 的时候显示),点击system log 可以看到系统 log:

这里写图片描述

点击uiauto trace按钮会显示所有步骤的信息:

这里写图片描述

如果有crash log 按钮,会显示 crash 的简短信息,目前只是简单的从 logcat 分析 ANR 和 Java Crash 信息,后续会详细研究一下 crash 知识:

这里写图片描述

扩展功能

我们可以通过在命令行下输入run cts --help-all 获取所有的可设置参数:

test options:
    --p                  package of test app
    --a                  main activity of test app
    --v                  monkey event count Default: 20.
    --throttle           The delay time between the events Default: 300.
    --pct-tap            percentage of tap event Default: 25.0.
    --pct-motion         percentage of motion event Default: 0.0.
    --pct-nav            percentage of navigation event Default: 15.0.
    --pct-majornav       percentage of major navigation event Default: 15.0.
    --pct-syskeys        percentage of system key event Default: 15.0.
    --pct-drag           percentage of drag evnet Default: 30.0.
    --logcat-size        The max number of logcat data in bytes to capture when --logcat-on-failure is on. Should be an amount that can comfortably fit in memory. Default: 20480.
    --plan               the test plan to run.
    --[no-]reboot        Do not reboot device after running some amount of tests. Default behavior is to reboot. Default: false.
    --[no-]skip-device-info
                         flag to control whether to collect info from device. Providing this flag will speed up test execution for short test runs but will result in required data being omitted from the test report. Default: false.
    --[no-]device-unlock unlock device Default: false.
    --app-path           local app's path
    --wifiSsdk           wifi username
    --wifiPsk            wifi password
    --[no-]skip-uninstall-app
                         no uninstall test app Default: true.
    --monkey-log-size    monkey log size Default: 10485760.
    -b, --[no-]bugreport take a bugreport after each failed test. Warning: can potentially use a lot of disk space. Default: false.
    --[no-]tracefile     get trace file ,in /data/anr/trace.txt Default: false.

  'stdout' logger options:
    --log-level          minimum log level to display. Default: INFO. Valid values: [VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT]


主要关注以下属性:

  1. p :测试 app 的包名.
  2. a :测试 app 的主 activity,如果正确设置上面两项,Monkey 会针对上面-p 指定的应用测试,一直保持在该应用界面. 注意:-a 和-p 两个参数要一起使用,否则不起作用
  3. throttle:2 个 Monkey 事件之间的间隔,默认为 300 毫秒.
  4. pct-tap:点击事件的百分比,默认为%25.
  5. pct-motion:多点滑动事件百分比,默认为%0,(暂时还没实现).
  6. pct-nav: 导航事件的百分比 (导航事件由方向输入设备的上下左右按键所触发的事件组成),默认为%15.
  7. pct-majornav:主要导航事件的百分比。(这些导航事件通常会导致 UI 界面中的动作事件,如 5-way 键盘的中间键,回退按键、菜单按键),默认为%15.
  8. pct-syskeys:系统事件百分比。(这些按键通常由系统保留使用,如 Home、Back、Start Call、End Call、音量调节),默认为%15.
  9. pct-drag:拖拽事件的百分比,默认为%30.

目前只实现了 5/6,但是上面的数字相加一定要为 100%。

  1. reboot : 重启机器,默认为 false,不重启。如果想要重启的话,直接在命令行附上该参数,不用在后面加 true,因为 boolen 类型的设置方式和其他不一样。
  2. device-unlock:解锁手机,默认为 false,如果收集重启的话,建议将该属性设置为 true。解锁原理就是利用 appium 自带的 apk 来解锁的。
  3. skip-device-info:是否跳过设备信息获取,默认为 false。因为我们的报告中用到了设备信息,所以建议不要将该属性设置为 true。
  4. app-path:如果应用需要从本地安装,用该属性设置 app 路径,会自动安装 app 到收集端。
  5. wifiSsdk: wifi 的用户名
  6. wifiPsk:wifi 的密码

因为该工具支持自动连接 wifi,所以你的 app 需要在 wifi 情况下工作,请设置这两个属性,它会自动检测断网并重连

  1. skip-uninstall-app:是否跳过卸载 app 的阶段,因为如果使用本地 app 安装后,有时想卸载应用,可以设置该属性为 false。默认是不卸载。
  2. monkey-log-size:如果针对某一个应用测试,该工具为该 app 单独收集 log,这里可以设置 log 可以最大到多少 B。
  3. bugreport:是否保存 bugreport 信息,默认为 false。如果研发想要 bugreport 信息,将该属性设置为 true。
  4. tracefile:是否保存 trace.txt 文件,该文件位于/data/anr/trace.txt。一般发生 crash 的时候会用到该文件分析问题。

总结

目前 CrashMonkey4Android 还处于 pre-release 阶段,需要改善的地方还有很多,请大家多多提出建议。

目前我们已经推出了 iOS 和 Android 两个平台的 Monkey,归并到一个组织58Automation中,
欢迎大家 fuck,有问题请在 github 上提。

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

就一定要故意 @ 我一下么。。。

#1 楼 @monkey 你有了 2 个小伙伴

吊吊的!等着 troubleman 帮你测试吧!

楼上的,别众目睽睽下秀恩爱。 能支持多设备,太好了。

#5 楼 @beerbox 试用一下哈,欢迎吐槽

牛 B!!! Q 你是那么的牛 B!

#7 楼 @testly 欢迎吐槽

#10 楼 @doctorq 我长得丑!

易寒 #12 · 2015年06月04日 Author

#11 楼 @testly 已修改,感谢

易寒 #14 · 2015年06月04日 Author

#13 楼 @testly 继续吐槽

@doctorq ReadMe 太少

易寒 #16 · 2015年06月04日 Author

#15 楼 @lihuazhang 嗯,后续会补上

另外有个问题,为啥不使用 maven 管理?

易寒 #18 · 2015年06月04日 Author

#17 楼 @lihuazhang 我准备用 gradle 修改一下项目。

易寒 #19 · 2015年06月04日 Author

#15 楼 @lihuazhang README.md 已补充内容

牛逼得不要不要的

#18 楼 @doctorq gradle 国内估计用的人很痛苦啊。。

易寒 #22 · 2015年06月05日 Author

#20 楼 @anikikun 真心没什么

易寒 #23 · 2015年06月05日 Author

#21 楼 @lihuazhang 晚痛不如早痛

赞,挺实用的。Github 已 follow.

win 系统用户有点忧伤。

mac 需要 adb path

大赞!

易寒 #28 · 2015年06月05日 Author

#25 楼 @shijin880921 windows 也可以用啊

易寒 #29 · 2015年06月05日 Author

#26 楼 @testly 你运行报错,Unable to locate adb?

易寒 #30 · 2015年06月05日 Author

#27 楼 @chenhengjie123 老醋装新瓶

#29 楼 @doctorq 已修复,现在还要升级 jdk 版本

易寒 #32 · 2015年06月05日 Author

#31 楼 @testly 你的是 1.6?

易寒 #34 · 2015年06月05日 Author

#33 楼 @testly 因为我用的是 1.7,哈哈,我下次用 1.6 编译下。

#34 楼 @doctorq 我滴个神啊!居然一定得 1.7 连 1.8 都不行!!!

易寒 #36 · 2015年06月05日 Author

#35 楼 @testly 这么搓么?欢迎在 githun 上提个 Issue,俺修复一下

#36 楼 @doctorq 公司这网速我下一个 1.8 下了这么久,,,,!!

易寒 #38 · 2015年06月05日 Author

#37 楼 @testly 别忘了在 github 上贴上出错信息

#38 楼 @doctorq 恩,我看看

#38 楼 @doctorq 直接放这里吧!git 网站打不开!

易寒 #41 · 2015年06月05日 Author

#40 楼 @testly 哦了。

#28 楼 @doctorq 找到 tools 目录下的 cts-tradefed 文件,双击会出现终端窗口: 可是我双击了让我选程序打开,我选啥。

#28 楼 @doctorq 这不是得 linux 下才能执行么?

易寒 #45 · 2015年06月05日 Author

#43 楼 @shijin880921 我正在生成 window 下的 bat 文件,做好通知你

感觉--p packgename 这个参数不准确,老是会跳到系统其他界面

#45 楼 @doctorq 就等 windows 了啊

易寒 #48 · 2015年06月05日 Author

#47 楼 @x746560359
#44 楼 @shijin880921 已更新 windows 下的 bat 文件,重新下载可执行文件

易寒 #49 · 2015年06月05日 Author

#46 楼 @nickbeibei 贴一下你输入的命令行信息

#49 楼 @doctorq 双击 bat 文件出现如下错误。

易寒 #52 · 2015年06月05日 Author

#51 楼 @shijin880921 我的电脑是 64 位的,你的是 32 位的,你可以把源码下载下来,自己编译。看这篇文章:如何进行二次开发

#49 楼 @doctorq run cts --p com.xxxx.xxx --plan Monkey

易寒 #54 · 2015年06月05日 Author

#53 楼 @nickbeibei 需要 activity 名,-a 指定。-a 和-p 这两个参数要一起使用

#54 楼 @doctorq 我试试,感谢

谢谢分享!!

“错误:找不到或无法加载主类 Files.”
这个是什么问题?

易寒 #58 · 2015年06月10日 Author

#57 楼 @Sernity0919 去 github 上提供详细的信息

#52 楼 @doctorq @shijin880921 这个是因为 jine.0.9.9.jar 包版本太低,不支持 win7 64 位,上官网下个 jline.1.0.jar 就行了。链接如下:http://sourceforge.net/projects/jline/files/jline/

06-11 11:59:58 I/DeviceNetWorkListener: please connect wifi : 58-guest
为什么提示我链接这个 wifi?

易寒 #61 · 2015年06月11日 Author

#60 楼 @x746560359 啊,测试用的一个自带的一个 wifi,可以修改成你自己的。在 tools/config/cts.xml 修改,如果不用 wifi,直接注释掉

直接在 CTS.XML 配置文件参数化。执行 run cts --plan Monkey。不会打开指定 APP
#61 楼 @doctorq 是注释掉的,但是控制台还是提示链接,另外:
信息: Error starting command: monkey --port 12345
com.android.ddmlib.ShellCommandUnresponsiveException
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408)
at com.android.ddmlib.Device.executeShellCommand(Device.java:435)
at com.android.chimpchat.adb.AdbChimpDevice$1.run(AdbChimpDevice.java:104)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
这是什么?指定端口 12345?

易寒 #63 · 2015年06月11日 Author

#62 楼 @x746560359 在 github 提 issue,把能给的信息都给全了,我好定位问题

易寒 #64 · 2015年06月11日 Author

#62 楼 @x746560359 Error starting command: monkey --port 12345 是 ddmlib 包的错误,不影响。

易寒 #65 · 2015年06月11日 Author

#62 楼 @x746560359 确保的-a 和-p 都配置了,且是主 activity。才能启动,你可以先在命令行试一下,以确保可以启动。

二次开发 源码下载下来,解压,导入 Eclipse 后只有一个项目。。。

易寒 #67 · 2015年06月11日 Author

#66 楼 @jacky 另外一个项目也需要下载下来啊,文档里面说的很清楚啊。

#59 楼 @woniu 替换成 jline-1.0.jar 后提示 java.lang.NoClassDefFoundError: jline/ConsoleReader
Exception in thread "main" java.lang.NoClassDefFoundError: jline/ConsoleReader
at com.android.tradefed.command.Console.getReader(Console.java:186)
at com.android.tradefed.command.Console.(Console.java:198)
at com.android.cts.tradefed.command.CtsConsole.(CtsConsole.java:52
)
at com.android.cts.tradefed.command.CtsConsole.main(CtsConsole.java:249)

Caused by: java.lang.ClassNotFoundException: jline.ConsoleReader
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)

易寒 #69 · 2015年06月11日 Author

#68 楼 @jacky 因为不是包的问题,换回 0.9.9

#69 楼 @doctorq 不能替换吗?_^

易寒 #71 · 2015年06月11日 Author

#70 楼 @jacky 不能,里面的类结构变化了。

#71 楼 @doctorq 我的电脑是 window 64 位,java version 64-Bit,但是出现下面错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\IQIYI\AppDat
a\Local\Temp\jline_0_9_9.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.load0(Unknown Source)
at java.lang.System.load(Unknown Source)
at jline.WindowsTerminal.loadLibrary(WindowsTerminal.java:215)
at jline.WindowsTerminal.initializeTerminal(WindowsTerminal.java:144)
at jline.Terminal.setupTerminal(Terminal.java:69)
at jline.Terminal.getTerminal(Terminal.java:26)
at jline.ConsoleReader.(ConsoleReader.java:151)
at jline.ConsoleReader.(ConsoleReader.java:146)
at jline.ConsoleReader.(ConsoleReader.java:135)
at com.android.tradefed.command.Console.getReader(Console.java:186)
at com.android.tradefed.command.Console.(Console.java:198)
at com.android.cts.tradefed.command.CtsConsole.(CtsConsole.java:52
)
at com.android.cts.tradefed.command.CtsConsole.main(CtsConsole.java:249)

易寒 #73 · 2015年06月11日 Author

#72 楼 @jacky 我在 Window 64 位的机器上调试过,没有问题,不过我的是 thinkpad。具体问题由于没有环境无法调试,我会试着将 0.9.9 的 jar 包调用改为 jline.1.0,然后会通知你试试,你暂时可以换别的机器试试。

#73 楼 @doctorq 嗯 多谢。我的是 win8 的机器。在 win7 64 位的机器上试了下也不行。。

易寒 #75 · 2015年06月11日 Author

#74 楼 @jacky 好吧。太先进了。

#75 楼 @doctorq @jacky 恩,确实会报 NoClassDefFoundError 的错,我现在也还在调试。

把 64 位的 jdk 换成 32 位的,可以运行了,不会出现这个了: Can't load IA 32-bit .dll on a AMD 64-bit platform

@doctorq 在运行的时候,已将 monkey 的进程关闭,仍然可以再次调起 apk
这个需要如何操作来停止运行?

@doctorq index.html 里面点 systemlog 提示报错:
截图中说的 monkey Log 在 D:\Android\CrashMonkey4Androd_bin-master\android-cts\repository\logs\2015.06.12_10.23.57 文件夹中找到了

易寒 #80 · 2015年06月12日 Author

#72 楼 @jacky

把 64 位的 jdk 换成 32 位的,可以运行了,不会出现这个了: Can't load IA 32-bit .dll on a AMD 64-bit platform

81楼 已删除
易寒 #82 · 2015年06月12日 Author

#79 楼 @muchild 是最新版本的么

@doctorq 我用的是 jdk1.7.0_45

易寒 #84 · 2015年06月12日 Author

#83 楼 @muchild 我说你下载的 CrashMonkey4Androd_bin-master 是最新的么?因为一直在更新,有的 bug 可能最新版本已经修改了

@doctorq 是昨天中午下载的

易寒 #86 · 2015年06月12日 Author

#85 楼 @muchild 我调试下

易寒 #87 · 2015年06月12日 Author

#85 楼 @muchild 已更新,下载最新版的试试

@doctorq 最新版,点击 systemlog,已显示

易寒 #89 · 2015年06月12日 Author

#88 楼 @muchild ok,欢迎持续关注

能不能不进入控制台,我想和 jenkins 集成,一条命令直接跑起来,该怎么做?

易寒 #91 · 2015年06月14日 Author

#90 楼 @aizaimenghuangu 我就是放在 jenkins 下跑的,直接调用sh cts-tradefed run cts --plan Monkey

@doctorq 这个工具的事件是怎么定义的?就是,这里的事件数是怎么算的?这边的 20,实际操作中比直接命令跑 Monkey 要时间久,有什么区别吗?

#92 楼 @muchild 好问题,这个事件数的定义是这样的,这个工具中有 5 中事件,Tap/drag/nav/majornav/syskeys 五个事件,每个事件都是通过 ddmlib 向手机段发送命令,且每个事件执行前后有截图和保存日志的动作,意思每一次操作都经过 3 个阶段:截图 - 发送要执行的操作 - 保存 log。而原生 Monkey 是你发送一个总命令后,手机端接受你的启动命令后,自己生成事件,然后操作界面,整个过程只和 PC 端通信一次,没有截图和保存 log 的动作,自然会快很多。

#91 楼 @doctorq 非常感谢,可以直接运行

必须在 mac 上用吗?

易寒 #96 · 2015年06月18日 Author

#95 楼 @gaoxing200851 windows 也可以

使用这个工具,执行结束一次 monkey 后,又会自动再次的重复执行起来

易寒 #99 · 2015年06月24日 Author

#98 楼 @sas 这是它的定时任务,会不断循环

#99 楼 @doctorq 这样设计有什么目的吗,如何取消定时任务呢

易寒 #101 · 2015年06月25日 Author

#100 楼 @sas

  • 在 cts.xml 中设置 loop 参数为 false
  • 直接关闭命令行

#101 楼 @doctorq 第二种方法不是很可行,因为不能确定 monkey 什么时候执行结束
第一种方法,在 cts.xml 中查看,没有 loop 这个参数;自行添加后运行,一直 loading configuration ‘CTS’
添加如下:
name="loop"
desc="循环执行次数"
value="false" />

易寒 #103 · 2015年06月25日 Author

#102 楼 @sas 检查你的写法,我用你的配置这边试了下是没问题的

#103 楼 @doctorq已解决,谢谢!!
另外 monkey 执行时出现一个错误提示,如图

易寒 #105 · 2015年06月25日 Author

#104 楼 @sas 这个是 chimpchat.jar 包的问题,不影响使用。

#105 楼 @doctorq 了解了,谢谢!

运行正常,有报告,只是不明白,index.html 中的 hardware 不显示设备名会是什么原因了?

#46 楼 @nickbeibei
遇到同样的问题,老是会跳出到系统界面.

@doctorq 测试会跳转到其他界面,效率有点低,重复动作太多了.期待更完善的版本的 release

@doctorq 那个帖子删掉了,没看明白你说的这个公司是指哪个公司???自荐??

易寒 #111 · 2015年06月30日 Author

#110 楼 @works 什么意思

易寒 #112 · 2015年06月30日 Author

#108 楼 @625398988 @nickbeibei不是跳转到,而是有的 monkey 事件会使我们的应用退出到后台了,我做了判断,一旦检测到不在我们所测应用的界面,就会重新启动应用。

易寒 #113 · 2015年06月30日 Author

#107 楼 @works 贴一下报告的截图

如果想测试系统的多个自带的 apk,在命令中该如何指定呢?

易寒 #115 · 2015年07月01日 Author

#114 楼 @sas 无这样的命令

#115 楼 @doctorq 那这个对于 os 的测试有些局限性,后续是否考虑可以增加?

易寒 #117 · 2015年07月01日 Author

#116 楼 @sas os 的 monkey 测试的测试关注点是单一应用还是系统本身?还是按特定应用来检测?你要一次行测多个 APK 的目的是什么?

出一个 windows 的操作文档吧,观望中!

#117 楼 @doctorq 系统本身的所有应用;比如要安排一个版本的 monkey 测试,需要把手机中所有的应用都安排下去,如果每一台机器只测试一个 apk,效率太低,所有的 apk 测试下来耗时太长。如果一个机器测试多个 apk,效率可以提高不少;另外可以把有关联性或依赖性的 apk 放到一个组进行测试

易寒 #121 · 2015年07月01日 Author

#120 楼 @sas 秒懂!等有空的时候,我试着支持一下这个功能

#119 楼 @doctorq 大恩不言谢

@doctorq 目前实际应用中,发现重复事件太多.有时候呆在一个界面很长时间没有动静.感觉效率有点低,期待更有效的版本.

@doctorq 另,我想把测试过程中打印出来的 log 映射到我自己的 textView 中去,但是没有找到在哪里打印的 log.望指点....

#112 楼 @doctorq “一旦检测到不在我们所测应用的界面,就会重新启动应用。”
-----这个重新启动应用的操作后,是重新再执行一遍 monkey 命令吗?和应用退出到后台前执行的 monkey 事件一致吗?

易寒 #126 · 2015年07月03日 Author

#125 楼 @sas 没关系,只是调用 startActivity,启动应用。monkey 还是跑他自己的

run cts --plan Monkey --p packagename --a activityname

@doctorq 哪个参数可以指定 monkey 事件的数量, 默认为 20, 觉得有点少

#129 楼 @doctorq 看到了, 眼神不给力....谢谢了.. 以为是老 monkey 日志等级了....

@doctorq
运行命令为 sh cts-tradefed run cts --plan Monkey -p com.yek.lafaso --throttle 50 -v 20000,但是会报如下错误:

sh cts-tradefed run cts --plan Monkey -p com.yek.lafaso --throttle 50 -v 20000
Android CTS 4.4_r0
Using commandline arguments as starting command: [run, cts, --plan, Monkey, -p, com.yek.lafaso, --throttle, 50, -v, 20000]
09-26 00:55:27 I/ConfigurationFactory: Loading configuration 'cts'
09-26 00:55:27 I/DeviceStateMonitor: Waiting 30000 ms for device 810EBLS2736K shell to be responsive
09-26 00:55:27 I/ManagedDeviceListener: Device connected 810EBLS2736K
09-26 00:55:27 I/DeviceManager: Detected new device 810EBLS2736K
09-26 00:55:27 I/CommandScheduler: Scheduling 'cts' on '810EBLS2736K'
09-26 00:55:27 I/DeviceManager: Allocated device 810EBLS2736K
09-26 00:55:27 I/TestInvocation: setup: true tearDown: true
09-26 00:55:27 I/TestInvocation: Starting invocation for 'cts' on build '4.4_r0' on device 810EBLS2736K
09-26 00:55:27 I/MonkeyTest: Monkey Test for device 810EBLS2736K
09-26 00:55:29 I/RemoteAndroidTest: Running am instrument -w -r  android.tests.devicesetup/android.tests.getinfo.DeviceInfoInstrument on 810EBLS2736K
cts-tf > 九月 26, 2015 12:55:43 上午 com.android.chimpchat.ChimpManager sendMonkeyEventAndGetResponse
信息: Monkey Command: wake.
九月 26, 2015 12:55:43 上午 com.android.chimpchat.ChimpManager sendMonkeyEventAndGetResponse
信息: Monkey Command: getvar display.width.
九月 26, 2015 12:55:43 上午 com.android.chimpchat.ChimpManager sendMonkeyEventAndGetResponse
信息: Monkey Command: quit.
09-26 00:55:43 W/TestInvocation: Unexpected exception when running invocation: java.lang.NumberFormatException: null
cts-tf > 九月 26, 2015 12:55:43 上午 com.android.chimpchat.ChimpManager sendMonkeyEventAndGetResponse
信息: Monkey Command: quit.
09-26 00:55:43 E/InvocationThread: null
java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:542)
    at java.lang.Integer.parseInt(Integer.java:615)
    at com.android.cts.tradefed.testtype.monkey.Monkey.init(Monkey.java:57)
    at com.android.cts.tradefed.testtype.monkey.Monkey.<init>(Monkey.java:29)
    at com.android.cts.tradefed.testtype.MonkeyTest.run(MonkeyTest.java:148)
    at com.android.tradefed.invoker.TestInvocation.runTests(TestInvocation.java:590)
    at com.android.tradefed.invoker.TestInvocation.prepareAndRun(TestInvocation.java:400)
    at com.android.tradefed.invoker.TestInvocation.performInvocation(TestInvocation.java:332)
    at com.android.tradefed.invoker.TestInvocation.invoke(TestInvocation.java:133)
    at com.android.tradefed.command.CommandScheduler$InvocationThread.run(CommandScheduler.java:362)

09-26 00:55:43 I/InvocationThread: Updating command 'cts --plan Monkey -p com.yek.lafaso --throttle 50 -v 20000 -s 810EBLS2736K' with elapsed time 15786 ms
cts-tf > 

易寒 #132 · 2015年09月26日 Author

#131 楼 @app_testing 获取手机的屏幕高和宽失败了,以后我看看能不能换一种方式获取。这个问题有几个人报给我了

Andriod 版的在使用中,App 停止或者闪退,但是从来没有没有看到这 HTML 报告,不知道为什么,应该是什么 Bug

支持白名单和黑名单吗?

易寒 #135 · 2015年10月29日 Author

#134 楼 @xxliud 不支持

易寒 #136 · 2015年10月29日 Author

#133 楼 @jeffleung 可以描述一下具体情况么,在什么时候停止,或者闪退?

@doctorq 我把源码中的 MonkeyReporter.java 下的 mDir 字段改成固定的字符串,将原来的时间命名文件夹换成固定的,再导出两个 jar 包替换原来的 jar 包,运行后为何没起作用呢?

易寒 #138 · 2015年11月22日 Author

#137 楼 @miaocunsheng 在哪里更改的,构造方法里面会重新赋值,如果你想改,在下面代码中mDir = TimeUtil.getResultTimestamp();地方改,两个 jar 包是啥意思,只需要替换 cts-tradefed.jar 就可以。

public MonkeyReporter(File xmlFile, File saveFile, File logDir) {
        this.mXmlFile = xmlFile;

        if (!saveFile.exists()) {
            throw new NullPointerException(String.format(
                    "report path :%s not exists", saveFile.getAbsolutePath()));
        }
        mDir = TimeUtil.getResultTimestamp();
        mLogDir = logDir;
        mSaveFile = new File(saveFile, mDir);
        mSaveFile.mkdir();
        if (mXmlFile == null || !mXmlFile.exists())
            return;
        // 初始化
        init();
    }

#138 楼 @doctorq
我是想和 Jenkins 集成,想将生成的结果放在一个固定的文件夹下,构建后邮件发送这个文件夹下的报告。
于是将 mDir = TimeUtil.getResultTimestamp 改为 mDir="testdir";

保存导出 Jar 包进行替换,运行后,发现目录还是时间命名

易寒 #140 · 2015年11月22日 Author

#139 楼 @miaocunsheng 截下图,看下报告生成的位置,我专门设置了report-path参数来将报告移动到某个webservice下的路径,因为我们也是放在 jenkins 下去做的,最后放到公共站点下,你可以试试这个参数

#140 楼 @doctorq
好的, 我详细找下代码里的字段。thanks for your attention,haha
目前我的报告依然生成在\android-cts\repository\results\2015.11.22_13.53.27 这个目录下。
另外我还想请教下:
如果我只将 index.Html 文件附到邮件下,那对应的其他跳转页面以及资源(图片、result.html) 路径是否也需要做调整呢?还是说只要整个结果文件夹放在适当位置就好?

@doctorq Hi, 想請問一下, 參數 --wifiSsdk 是否為 wifi ssid 而非屬性表內的 wifi user name?
查看了一下原代碼, 好像只有 ssid & password

Thanks,
Charles

易寒 #143 · 2015年11月27日 Author

#142 楼 @charlesh21 我解释成 wifi user name 是怕大家不理解 ssid 代表的意思,其实 wifissdk 就是 ssid。

#143 楼 @doctorq 了解, 因為一開始我設定了連接 wifi 的帳號與密碼, 但無法重新連接, 同時也好奇 如果多個 wifi ap 會連哪一個, 查原代碼後才試成功, 感謝回覆

@doctorq 你好,代码中【 mWSRPATH】这个参数的实际值 是在哪里配置的呢?
private void generateMonkeyReslutTxt(MonkeyReporter reporter) {
if (mWSRPATH == null || mMonkeyResultPath == null) {
return;
}
File monkeyResult = new File(mMonkeyResultPath);
String url = mWSRPATH + File.separator + reporter.getmDir()
+ File.separator + "index.html";
try {
if (! monkeyResult.exists()) {
monkeyResult.createNewFile();
}
FileUtil.writeToFile(mDeviceSerial + "," + url + "\n", monkeyResult);
.....
}
}

易寒 #146 · 2015年11月29日 Author

#145 楼 @miaocunsheng 这是为了在 jenkins 集成的时候把报告保存到公共站点的目录下,可以外部访问用的。外部传参设置

#146 楼 @doctorq 你好,我这边也想实现这个效果,我在本地搭建了一个内网站点,但是在代码上没看明白如何确定到我的站点目录

易寒 #148 · 2015年11月29日 Author

#147 楼 @miaocunsheng 下载源码了么?可以源码中下图的代码,就明白了

149楼 已删除
150楼 已删除

@doctorq
我想问下,Jenkins 在执行 bat 脚本时,设备已识别,但是无法执行,是怎么回事?
12-13 17:35:39 W/DeviceManager: Fastboot is not available.
Android CTS 4.4_r0
Non-interactive mode: Running initial command then exiting.
Using commandline arguments as starting command: [run, cts, --plan, Monkey]
12-13 17:35:39 I/ConfigurationFactory: Loading configuration 'cts'
12-13 17:35:39 I/DeviceStateMonitor: Waiting 30000 ms for device YT910D90AU shell to be responsive
12-13 17:35:39 I/ManagedDeviceListener: Device connected YT910D90AU
12-13 17:35:39 I/DeviceManager: Detected new device YT910D90AU
12-13 17:35:40 I/CommandScheduler: Scheduling 'cts' on 'AndroidDevice'
12-13 17:35:41 I/CommandScheduler: Waiting for invocation threads to complete
12-13 17:35:41 I/LogRegistry: Saved log to C:\Windows\TEMP\tradefed_global_log_6242512099387051107.txt
12-13 17:35:41 I/CommandScheduler: All done
请按任意键继续. . .
12-13 17:35:41 W/DeviceManager: Fastboot is not available.
Android CTS 4.4_r0
Non-interactive mode: Running initial command then exiting.
Using commandline arguments as starting command: [run, cts, --plan, Monkey]
12-13 17:35:41 I/ConfigurationFactory: Loading configuration 'cts'
12-13 17:35:41 I/DeviceStateMonitor: Waiting 30000 ms for device YT910D90AU shell to be responsive
12-13 17:35:42 I/DeviceManager: Detected new device YT910D90AU
12-13 17:35:42 I/ManagedDeviceListener: Device connected YT910D90AU
12-13 17:35:42 I/CommandScheduler: Scheduling 'cts' on 'AndroidDevice'
12-13 17:35:43 I/CommandScheduler: Waiting for invocation threads to complete
12-13 17:35:43 I/LogRegistry: Saved log to C:\Windows\TEMP\tradefed_global_log_4300395381232860371.txt
12-13 17:35:43 I/CommandScheduler: All done
请按任意键继续. . .
[workspace] $ cmd /c call C:\Windows\TEMP\hudson2657637810539007819.bat

神器,感谢分享~

@doctorq 请教下,下面这种报错是什么情况呢?
十二月 29, 2015 2:30:26 下午 com.android.chimpchat.adb.AdbChimpDevice$2 step
信息: Monkey Command: tap 481 951.
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.BufferedWriter.flush(Unknown Source)
at com.android.chimpchat.ChimpManager.sendMonkeyEventAndGetResponse(ChimpManager.java:187)
at com.android.chimpchat.ChimpManager.sendMonkeyEvent(ChimpManager.java:235)
at com.android.chimpchat.ChimpManager.tap(ChimpManager.java:330)
at com.android.cts.tradefed.testtype.monkey.MonkeyTapEvent.fireEvent(MonkeyTapEvent.java:34)
at com.android.cts.tradefed.testtype.monkey.Monkey.nextRandomEvent(Monkey.java:41)
at com.android.cts.tradefed.testtype.MonkeyTest.run(MonkeyTest.java:152)
at com.android.tradefed.invoker.TestInvocation.runTests(TestInvocation.java:590)
at com.android.tradefed.invoker.TestInvocation.prepareAndRun(TestInvocation.java:400)
at com.android.tradefed.invoker.TestInvocation.performInvocation(TestInvocation.java:332)
at com.android.tradefed.invoker.TestInvocation.invoke(TestInvocation.java:133)
at com.android.tradefed.command.CommandScheduler$InvocationThread.run(CommandScheduler.java:362)

这里使用 Monkey 自动生成测试步骤, 可以自定义测试脚本吗?

易寒 #155 · 2016年01月19日 Author

#154 楼 @justin001 Monkey 没有测试脚本一说,测试步骤只是为了定位问题的时候找到一段时间的操作

测试流程全部都是坐标, 我想改成通过坐标去去解析 pageSources 的 xml 文件进一步确定元素这样在流程看上去更清晰写。

还有, 我下载了相关的源码,有没有对项目的说明,二次开发,前提需要看懂你的思路。有没有相关的说明文档。

易寒 #158 · 2016年01月19日 Author

#157 楼 @justin001 github 就有help

#158 楼 @doctorq 嗯,是的, 你只介绍了 如果我去运行它 使用它, 我想问的是有没有整个项目构架的介绍。或者是实现的主线思路。

易寒 #160 · 2016年01月19日 Author

#159 楼 @justin001 自己看源码,想看实现思路,看 cts 框架。cts 框架不知道,在社区搜 cts。如果还像端到你手上,给你个连接:cts

#160 楼 @doctorq 哈哈, 刚开始接触 谅解,谅解。 好的。 方便留个 email 吗? 有问题直接 email 你。

#run cts --p xxxxxx --v 10000 --throttle 1000 --plan Monkey 成功执行了,但是一会儿就触发了 Home 键事件,跑出 app 界面,没有能自动切回来 貌似没有判断?


打开后这样,请指教

#162 楼 @devilsroar 同遇到该问题,跑出 app 界面后,没有切回来。 @doctorq 这种情况怎么解决呀 ?

#34 楼 @doctorq 我的就是 1.7 的但是还是不能用

@doctorq 请问获取手机高宽失败的问题有解决吗?
Monkey Command: getvar display.width.
com.android.chimpchat.ChimpManager sendMonkeyEventAndGetResponse
Monkey Command: quit.
W/TestInvocation: Unexpected exception when running invocation: java.lang.NumberFormatException: null

#29 楼 @doctorq Mac 有报这个错误,求解

@doctorq 为什么跑一会 就停了 信息: Monkey Command: quit.
07-25 14:35:29 I/MonkeyActivityListener: MonkeyActivityListener stop.....

luyuan [该话题已被删除] 中提及了此贴 08月03日 10:28

#45 楼 @doctorq 我的是 win10 64bit,报错。
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Windows\Temp\jline_0_9_9.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

@DoctorQ 🙏 能在 ReadMe 里写些命令示例吗,如:--p --a 的使用方法
总报 ConfigurationException: Could not find class

@DoctorQ 请问可以指定某台设备跑吗?目前的情况是连接电脑的几台设备都在跑

易寒 #173 · 2016年11月10日 Author

#172 楼 @raythan 可以,设备管理用的是 CTS,你可以查查 CTS 中如何指定设备

@DoctorQ 发现--serial 无效,但--exclude-serial 有效😂

@DoctorQ 另外截图可以只保存最后 10 张么?

易寒 #176 · 2016年11月14日 Author

#175 楼 @raythan 图片只展示最后 50 张,但是基本所有的截图都保存的

@DoctorQ 最后只拷贝 50 张到 PC 么?

@DoctorQ 如果-v 参数很大比较难跑,本身就跑得比原来的 monkey 慢很多

易寒 #179 · 2016年11月14日 Author

#178 楼 @raythan 比原生 monkey 多了截取图片,保存 log 的动作,所以会慢很多,所有的图片都在 pc 上,只是最后 50 张会被绘制轨迹并展现在报告上

180楼 已删除

#131 楼 @app_testing 获取手机的屏幕高和宽失败了,以后我看看能不能换一种方式获取。这个问题有几个人报给我了
@DoctorQ 这个问题还会出现

@DoctorQ
易寒,这个工具设计想法不错,今天试用了一下你的 CrashMonkey,其中,遇到问题,

看此错误的原因,是由于检测到不在当前测试 app 下的 activity 下,尝试重启 app 的时候,monkey comand quit,导致生成报告出错!

@DoctorQ https://github.com/baozhida/CrashMonkey4Android_bin 原版基础上改造了一下,支持 java 64 位,并且把不用的系统 key 事件去掉了,只保留了 back

执行完一次,生报告之后,等待下次执行的时间比较久,还没仔细看怎么控制的

Baozhida 回复

默认的 50 次生成报告,怎么修改。想要执行一次,生成一个报告

易寒 #186 · 2017年04月05日 Author
Baozhida 回复

😍

博士,打算加入性能监控的功能吗?

易寒 #188 · 2017年07月10日 Author

不打算

Doctor,总结最后一句是把 fork 拼错了吧😂

易寒 #190 · 2017年07月10日 Author
雪怪 回复

故意的

你好啊,我在运行的时候出现了说无法定位

thankdanny:~ thanksdanny$ /Users/thanksdanny/Documents/test\ tools/CrashMonkey4Androd_bin/android-cts/tools/cts-tradefed ; exit;
usage: dirname path
Unable to locate /../../android-cts/tools/chimpchat-22.2.0.jar
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

是我存放的路径有问题么

易寒 #192 · 2017年07月31日 Author
thanksdanny 回复

命令是啥?/Users/thanksdanny/Documents/test\ tools/CrashMonkey4Androd_bin/android-cts/tools/cts-tradefed

我是根据步骤来,同步 CrashMonkey4Androd_bin 项目来获取可执行文件,或者直接下载 ZIP 包,解压。然后双击 cts-tradefed 文件就出那些命令了

易寒 回复

看到报错说无法定位到那个 jar 包,但我看了下路径好像也是没错的…

请问大佬,为什么我运行 run cts --plan Monkey 后,手机没反应

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