360Qtest团队 Jenkins 集成 monkey

willys · 2017年04月24日 · 最后由 24KShign 回复于 2019年05月30日 · 3191 次阅读
本帖已被设为精华帖!

jenkins

jenkins 是基于 java 开发的一款持续集成工具,用于监控持续重复的工作,多用于搭建持续集成环境。相信各位测试同学对 jenkins 并不陌生。

monkey

Monkey 是 google 提供的一个命令行工具,可以运行在模拟器或者物理设备中。monkey 通过向系统发送按钮、手势、触摸屏输入等伪随机用户事件,对软件进行稳定性与压力测试。从事移动端测试的同学,想必对 monkey 工具的使用也轻车熟路。

jenkins+monkey

很多移动端测试团队都使用 jenkins 搭建了持续集成环境,用于自动代码拉取、构建和打包。然而有的测试同学,在使用 monkey 工具进行稳定性测试的时候,仍是通过手动执行命令的方式启动测试。其实我们可以将 monkey 测试集成到 jenkins 中,这样在构建新任务过程中可以在闲置的测试手机上立马进行稳定性测试。
下面,我们来看看如何将 monkey 集成到 jenkins 中。执行 monkey 测试有两种方式,一种是在模拟器中进行测试,另一种是在真机上进行测试。如果手头没有测试机,可以选择在 android 模拟器中进行 monkey 测试。

模拟器配置

  1. 安装 android 模拟器插件
    在 jenkins 的系统管理--》管理插件中,选择 android emulator plugin 进行安装。安装插件后,在已安装列表中可以查看到该插件。

  2. 构建环境配置
    安装了 android emulator plugin 之后,在构建环境中勾选 “Run an Android emulator during build” 选项。并对 android 模拟器进行配置。主要对 android 系统版本、屏幕分辨率、sd 卡容量进行配置。我们可以依据自己的测试需求,进行相应的配置。

  3. 构建配置
    构建的配置,需要进行两项配置,Install android package 和 Run android monkey tester。
    Install android package 主要目的是把构建包安装到手机。
    Run android monkey tester 主要是启动 monkey 测试,并对运行参数进行配置。运行参数包括 monkey 测试过程中模拟的事件数量、事件间隔时间等。在高级选项中测试者可以依据自身需求添加更多配置。output filename 选项对 monkey 测试结果文件名进行配置,默认情况下生成的测试结果存放在工作空间根目录下的 monkey.txt 文件中。

  4. 构建后操作
    构建后操作可以选择 Publish android monkey tester result。
    这样在构建完成之后,可以一目了然的看到 monkey 测试是否成功。该选项需要设置两个参数,分别是 filename 和 set build result。参数 Filename 顾名思义是指定 monkey 测试生成的结果文件名称。如果没有指定 filename 的值,默认情况下会到该任务的根目录下面读取 monkey.txt 文件。如果在 Run android monkey 中对 output filename 进行了修改,那么 filename 应该与 output filename 保持一致。set build result 选项是设置当 monkey 测试出现 Crash 或 ANR,应该呈现的结果状态,默认情况下为 unstable。

真机配置

很多情况下我们选择真机做 monkey 测试,结果更加可靠。下面,我们看一下如何用 jenkins 搭配真机进行 monkey 测试。在配置 jenkins 之前,我们需要确保 PC 端已经配置好了 android adb 的环境变量。

1.参数化构建
由于 monkey 测试需要进行一系列参数配置,所以我们可以在 jenkins 的 General 中配置一些构建过程中需要使用的参数。例如,monkey 运行的参数 evencount,seed 都可以在此进行输入配置,可以更加灵活的控制 monkey 测试。
同时,我们可以配置一个布尔变量,作为此次构建是否执行 monkey 测试的判断依据。这样便可以将普通构建任务和执行 monkey 测试的构建任务放在一个任务配置中,而不需要配置多个任务。如果该选项被勾选,那此次构建执行 monkey 测试,否则不执行。

参数化构建界面显示效果:

2.构建
采用真机进行 monkey 测试,需要通过 adb 命令来启动 monkey 测试。所以需要在构建步骤中增加 execute shell 选项。然后在选项中,添加执行 monkey 测试的脚本。脚本主要执行两项任务,首先将构建的包安装到手机端,然后启动 monkey 测试。脚本中可以使用前面配置的参数,这样方便测试者依据不同的测试需求,构建不同的测试任务。
命令行执行 monkey 测试,基本语法:
adb shell monkey [options] <event-count>

  • event-count: 为必选参数,用于指定 monkey 测试过程中模拟的用户事件数量。
    [options] 主要参数如下
  • -p packageName :该参数指定需要执行 monkey 测试的包名。如果需要测试多个包,需要添加多个-p 参数,每个参数后带一个包名。
  • -s seed :该参数指定伪随机生成器的 seed 值。
  • -v: 指定 monkey 测试结果中输出 log 信息的详细程度,总共分为三个级别。默认级别是 0:-v,测试结果中只包含启动信息,测试完成信息和最终结果信息。级别 2:-v -v,打印测试过程中执行的一些信息,如模拟的用户点击事件。级别 3:-v -v -v,打印最详细的信息。
  • --throttle milliseconds:指定 monkey 模拟事件的前后间隔时间。通过这个选项可以减缓 monkey 的执行速度。如果不指定该选项,monkey 模拟事件将会持续执行,事件间不会有停顿。
  • --ignore-crashes: 该参数指定 monkey 测试过程中是否忽略 crash。如果设置了该参数,测试过程中如果发生了 crash,monkey 测试会继续执行。否则测试过程中遇到 crash,停止测试。
  • --ignore-timeouts:该参数指定 monkey 测试过程中忽略 ANR。如果测试过程中出现了 ANR,将忽略此现象,继续执行 monkey 测试。

小结

在业务测试中,笔者已经将 monkey 测试集成到 jenkins 中,方便在构建任务的同时进行 monkey 测试。本次尝试并没有将 monkey 测试结果的展示整合到 jenkins 中。后续可以开发一个小插件,对 monkey 测试结果进行分析,然后以更直观的方式展示测试结果。

更多干货,扫码关注Qtest公众号
@描述 | center  |

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

总结的不错

顶一个

移动端接触 jenkins 的人还是比服务端测试要少一些,顶一个

有借鉴意义,顶一个!

There is more than one system image defined for platform 'android-23'.
    Pick an image to use and set it in the 'Target ABI' config field.
    Valid ABIs: no ABIs.

@willys 构建请问这是什么原因?

楼主可以考虑利用 Jenkins 的主从节点来实现触发 主从机器上的 MONKEY Agent(自己写用 shell 或者 Python),配置较简单。收集结果的话也可以用外部解析的方式。
这样的好处是 单台 pc 连接设备数有限,这样的模式更加适用多设备并发。

testly 回复

“单台 PC 连接设备有限”,我们已经解决了这个问题,连接数量不受限制了

去年去参加了 360 的测试嘉年华,很有收获。感觉还是挺努力做测试技术的,顶一下
就是提个小意见,你们的测试官网 test.360.cn 里内容要能再丰满一些就更好啦

思寒_seveniruby 将本帖设为了精华贴 04月25日 11:52
卖萌成性 回复

正在改版,以后会上更多技术传播性质的内容

很不错,还有模拟器

willys #12 · 2017年04月25日 Author
huj 回复

配置一下 abi 参数试一下。

willys #13 · 2017年04月25日 Author
testly 回复

非常棒的建议,多谢。😊

赞一个,结合了 monkey 和持续集成,不错的思路👍

15楼 已删除
匿名 #7 · 2017年04月26日

比较关注对测试结果的收集和分析,跪求后续

目前正需要,感谢


真机为什么没跑就结束了呢

willys #21 · 2017年04月26日 Author
weiweiliu 回复

生成的结果文件里面,有 log 输出吗?

willys 回复

我指定放置结果的目录下 啥也没有 就连存放结果的文件都没有


使用模拟器 跑起来报这个错
但我安装的 sdk 里面下载了 system image 中包含报错的文件啊 为什么找不到呢 android_sdk_root 路径设置的是 sdk 的安装路径

willys #25 · 2017年04月26日 Author
weiweiliu 回复

应该是你指定的路径有问题吧,你直接存放到 jenkins 任务的根目录下面呢?

23楼 已删除
willys 回复

我的 jenkins 部署在 win 上的 你再帮忙看看我上面一个提问 用安卓模拟器遇到的问题 问题出在哪

请更新个人信息中的微信和支付宝打赏码,将用于精华帖打赏和个人打赏

willys #27 · 2017年04月27日 Author
026 回复

好的,谢谢提醒。

最近可能会用到,学习个

monkey 测试的随机性太强,无法遍历所有的 activity,最近在考虑定制化的 monkey 测试,共同进步

daivd 回复

我最近也在思考定制化做这个

willys #30 · 2017年06月02日 Author
daivd 回复

对,原生 monkey 测试确实随机性太强。加油,共同进步。

Building in workspace C:\Program Files (x86)\Jenkins\workspace\MonkeyTest
[MonkeyTest] $ sh -xe C:\WINDOWS\TEMP\jenkins1926739012408588073.sh
The system cannot find the file specified
FATAL: command execution failed
java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
Caused: java.io.IOException: Cannot run program "sh" (in directory "C:\Program Files (x86)\Jenkins\workspace\MonkeyTest"): CreateProcess error=2, 系统找不到指定的文件。
at java.lang.ProcessBuilder.start(Unknown Source)
at hudson.Proc$LocalProc.(Proc.java:245)
at hudson.Proc$LocalProc.(Proc.java:214)
at hudson.Launcher$LocalLauncher.launch(Launcher.java:858)
at hudson.Launcher$ProcStarter.start(Launcher.java:385)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:109)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:66)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:730)
at hudson.model.Build$BuildExecution.build(Build.java:206)
at hudson.model.Build$BuildExecution.doRun(Build.java:163)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:490)
at hudson.model.Run.execute(Run.java:1735)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:415)
Build step 'Execute shell' marked build as failure
Finished: FAILURE
报错,没有 MonkeyTest 这个文件?

willys #32 · 2017年06月13日 Author

MonkeyTest 是你自己写的脚本吗?

willys 回复

嗯,自己写的,安装路径下没有 workspace 这个目录,我建了个 workspace,把 MonkeyTest.txt 放在了这个目录下。不用脚本,用上面的一样的配置也是这样的报错~

willys #35 · 2017年06月14日 Author

错误信息感觉是找不到文件?你再检查一下路劲和文件什么的看看?你说的配置,是指执行 monkey 命令的参数配置吗?

willys 回复

是啊,你这个是在 windows 下么,我可以理解为
if ${Monkey}
then
adb uninstall com.xxxx
adb install
adb shell monkey -p com.xxxx -v -v -v ${eventCount} -s ${seed} --throttle ${throttle} --ignor-crashes > ./monkey.txt
else
echo "skip monkey test......."
fi
(是这个 Execute shell 有问题么,我是完全照着你这个来的,windows 下不能用 shell?)
这样不是已经有命令参数输入了么,还需要 monkey 脚本么

willys #37 · 2017年06月14日 Author

windows 下 shell 可以执行,只是写路径的时候,需要 将 “/” 换成"\"。
是否使用 monkey 脚本,看你的实际测试需求。我只是给了一个简单的示例,可以通过 adb shell monkey 的方式执行 monkey 测试。如果你需要对 monkey 测试进行更多的控制,可以写 monkey 测试脚本。那么你就只要调起脚本执行就可以了。

如果跟自动打版结合的话,有几个问题想请教一下
1、怎么唤醒屏幕
2、adb install 有些手机会弹安装确认,不操作手机无法完成安装
3、我们的 app,启动的时候会有一些权限提示框,不容易点击授权,不授权无法进入 app
目前有这几点疑问,先谢谢啦

Pastel 回复

第一个问题自己有解决方法了
screenState=adb shell dumpsys power | grep -Eoi "Display\s*Power:\s*state=(\S*)" | awk -F = '{print $2}'
if [ "$screenState"x = "OFF"x ]
then
adb shell input keyevent 26
adb shell input swipe 500 500 100 100
fi
可以修改的更健壮一些,可以得到屏幕分辨率来控制滑动区域,目前没有做
第三个问题可以不下载 app,通过覆盖安装的方式进行,这样就不弹权限授权了
但是第二个问题目前还是没搞懂怎么处理,有知道的没

willys #42 · 2017年06月23日 Author
Pastel 回复

第二个问题,如果是小米手机的话,可以进行设置,就不会有安全弹框确认了。在 “安全”-->"授权管理”-->右上角 “设置”-->取消 “usb 安装管理”。

willys 回复

用的 MIUI8.2 稳定版中没有这个无法取消 “USB 安装管理”

willys #41 · 2017年06月23日 Author
Pastel 回复

唤醒屏幕,可以试一下 appium 的 unlock_apk。git 地址:https://github.com/appium/unlock_apk

willys #40 · 2017年06月23日 Author
cherish 回复

谢谢提醒,目前手头上没有 miui8.2 的手机,所以没搞清楚这个状况。请问有其他好的方式解决 “安装弹窗” 确认问题吗?

willys 回复

嗯,这个好用,安装之后用 adb shell am start -n io.appium.unlock/.Unlock 启动就可以,谢谢
还有就是弹安装界面那种问题,如果能用 appium 或者 uiautomator 写脚本兼容一下就好了,还是不熟悉啊

cmd 上可以执行 adb 安装命令,但是放在 jenkins 上,构建失败显示文件不存在?apk 包是放在公共服务器上的,把包放在本地执行没问题~~有遇到过这种情况么?

willys #45 · 2017年06月27日 Author

你可以写个脚本先把公共服务器上的 apk 下载到本地某个目录下。然后在 adb install。

willys 回复

已解决,copy 也不行,应该是 jenkins 没有操作权限导致的吧,在 jenkins 服务里,添加本机的账号密码 OK 了,thks

@willys 请教一下,为何我每次构建完 结果总是 Unstable 呢? 没有 Crash 和 ANR,还有不明白为何有个 exit 0 的输出。这个输出直接减少了 monkey 的运行时间。

E:\sss\workspace\monkey>adb shell am start -n com.huofeng.housingfund/.activity.GjjMainFragmentActivity
Starting: Intent { cmp=com.huofeng.housingfund/.activity.GjjMainFragmentActivity }

E:\sss\workspace\monkey>adb shell monkey -p com.huofeng.housingfund 1000 1>./monkey.txt

E:\sss\workspace\monkey>exit 0
[android] Detected failures in monkey output; setting build result to UNSTABLE
Build step 'Publish Android monkey tester result' changed build result to UNSTABLE
Finished: UNSTABLE

请教一下,按照上述操作为什么出现这种错误,请大神帮忙解答一下,谢谢!

willys #49 · 2017年11月08日 Author
Waterleon 回复

模拟器中运行的嘛?

膨化先生 Jenkins_Monkey 菜鸟搭建 中提及了此贴 03月08日 11:27

请问楼主,Jenkins 是在实体机上连接真机的吗?如果 Jenkins 是部署在一个云端机器上该怎么办呢?

mayYH 回复

同问,请问兄台解决了吗

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