360Qtest团队 Jenkins 集成 monkey

willys · April 24, 2017 · Last by 24KShign replied at May 30, 2019 · 7079 hits
本帖已被设为精华帖!

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 将本帖设为了精华贴 25 Apr 11:52
卖萌成性 回复

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

很不错,还有模拟器

willys #12 · April 25, 2017 作者
huj 回复

配置一下abi参数试一下。

willys #13 · April 25, 2017 作者
testly 回复

非常棒的建议,多谢。😊

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

15Floor has been deleted

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

目前正需要,感谢


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

willys #19 · April 26, 2017 作者
weiweiliu 回复

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

willys 回复

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


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

willys #22 · April 26, 2017 作者
weiweiliu 回复

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

23Floor has been deleted
willys 回复

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

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

willys #26 · April 27, 2017 作者
026 回复

好的,谢谢提醒。

最近可能会用到,学习个

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

daivd 回复

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

willys #30 · June 02, 2017 作者
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 · June 13, 2017 作者

MonkeyTest是你自己写的脚本吗?

willys 回复

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

willys #34 · June 14, 2017 作者

错误信息感觉是找不到文件?你再检查一下路劲和文件什么的看看?你说的配置,是指执行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 #36 · June 14, 2017 作者

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 #39 · June 23, 2017 作者
Pastel 回复

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

willys 回复

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

willys #41 · June 23, 2017 作者
Pastel 回复

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

willys #42 · June 23, 2017 作者
cherish 回复

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

willys 回复

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

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

willys #45 · June 27, 2017 作者

你可以写个脚本先把公共服务器上的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 · November 08, 2017 作者
Waterleon 回复

模拟器中运行的嘛?

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

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

mayYH 回复

同问,请问兄台解决了吗

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up