Macaca Macaca 实现 IOS Monkey 测试

utopia · 发布于 2017年3月17日 · 最后由 xdf 回复于 2017年3月28日 · 1303 次阅读
本帖已被设为精华帖!

说明

苹果去掉了原有的测试框架改用XCTest之后,一直等大神放出原生的iosmonkey。但是入侵式的方式可能开发不会接受。前几天发现一个项目是通过macaca实现的,尽管效率比起原生模式的monkey差很多,总比没有好。试用了几天,基本实现monkey的功能。能够模拟长时间操作App的场景,但是无法对App进行Monkey压力测试。

从0到1非常困难,从1到2就简单很多,项目是复制来的,修复了一些bug,修改了一点逻辑。原版在https://github.com/hujiachun/iosMonkey

我改版的项目在https://github.com/baozhida/iosMonkey

现在客户端是使用同步的方式处理发送的事件,效率稍低

经实测:

iPhone 6plus 10.2.1,每分钟可以执行大约40次事件;

iPhone 7 10.2,每分钟可执行大约60次事件;

通过修改代码实现了异步http请求,发送事件的请求数量可以大幅提升,但是很多请求会阻塞,没有执行,实际效果不好,遂放弃。

更新

2017.3.17: 原版本呼起app的指令是当成事件,按照一定的频率执行,不管现在是否是在测试APP页面都会执行。现在改为守护进程的模式,只有当前页面跳出测试APP时候才会执行打开APP的指令。

0、简介

  • 1.修改了原版的构建方式,maven bulid(其实没看懂之前构建的配置)

  • 2.解决了idevicedebug 命令呼起app无效的问题

  • 3.根据app实际情况,修改了特殊点的处理(在有些页面,点击固定的位置才能返回,不是通用的右上角)

  • 4.如果不修改直接使用,直接使用target下面的jar包,如果实现自己的方法,需要重新编译

1、功能

  • 1.可以模拟android monkey执行的方式,在IOS APP页面点击 滑动操等作,支持 ios 9和ios10

  • 2.支持多台ios一起执行

  • 3.计划保存截图(未完成)

  • 4.计划自动收集crash日志(未完成)

2、准备macaca环境

安装usbmuxd

$ brew install usbmuxd

安装ios-webkit-debug-proxy

$ brew install iso-webkit-debug-proxy

安装ios-deploy

$ brew install ios-deploy

安装ideviceinstaller

$ brew install ideviceinstaller

编译libimobiledevice

libimobiledevice需要自己编译,证实直接安装的不能用

https://github.com/libimobiledevice/libimobiledevice

下载到本地

Before building, try setting:

LD_LIBRARY_PATH=/usr/local/opt/openssl/lib:"${LD_LIBRARY_PATH}"
CPATH=/usr/local/opt/openssl/include:"${CPATH}"
PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig:"${PKG_CONFIG_PATH}"
export LD_LIBRARY_PATH CPATH PKG_CONFIG_PATH
You might want to add that to your .bash_profile.

CPATH and PKG_CONFIG_PATH are for compiling. LD_LIBRARY_PATH is for runtime. See also https://gist.github.com/samrocketman/70dff6ebb18004fc37dc5e33c259a0fc

Then to compile run:

./autogen.sh
make
sudo make install

安装carthage

$ brew install carthage

安装macacajs包括,macaca-cli macaca-ios

npm install macaca-cli -g

npm install macaca-ios -g

MAC全局安装的路径分别如下:

/usr/local/lib/node_modules/macaca-cli
/usr/local/lib/node_modules/macaca-ios

检测macaca环境,无报错

$ macaca doctor

3、WebDriverAgent项目重签名

按照项目

https://github.com/baozhida/MacacaAutomation

操作项目重签名

4、帮助命令

如果需要多个iOS设备一起执行,需要指定 proxyport ,同时macaca使用不同的端口

$ java -jar iosMonkey-1.0.jar -h
-u:设备的UDID
-b:测试App的Bundle
-port:macaca服务的端口,默认3456
-proxyport:usb代理端口,默认8900

5、执行iosMonkey

开一个窗口执行

$ macaca server --verbose

在一个新窗口执行

$ java -jar [iosMonkey.jar Path] -u [设备的UDID] -b [测试App的BundleID] -port [macaca服务端口,可选] -proxyport[usb代理端口,可选]

6、修改源码重新打包方法

如果需要源码实现自定义的功能,在项目目录下执行

$ mvn assembly:assembly

最后提示如下,标示打包成功,target下生成iosMonkey-1.0.jar,可以使用最新的包

INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.350 s
[INFO] Finished at: 2017-03-06T17:01:30+08:00
[INFO] Final Memory: 20M/324M
[INFO] ------------------------------------------------------------------------
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 38 条回复
8317

@xdf
Macaca又多一个应用场景

@Lihuazhang
看了你的SwiftMonkey。感觉很强大,但是不熟悉ios相关语言😁

2457

@utopia 高产,我得试试,标题有些错误改下

110

赞,你这个好

8317
2457xdf 回复

已改。非原创。只是优化

110 Lihuazhang 将本帖设为了精华贴 3月17日 23:14
4442

赞,学习啦~

—— 来自TesterHome官方 安卓客户端

104

不错 梳理的挺清楚 上个二维码我来打赏

13930

好赞,是我一直期待的东西,干货满满

8317
104seveniruby 回复

已加二维码☺ ☺ ☺

2457

我也给你打赏,期待更多好文

8317
2457xdf 回复

太激动了,感谢

7555

@utopia 确实不错 我也打赏

7555

@utopia ideviceinstaller 这个开源地址下的东西 能给解释下吗 我看macaca好多都是这个github地址下的 比如 usbmuxd。
libimobiledevice 这东西是个连接驱动吧? 以前弄ubuntu 连接ios手机 好像弄过这东西 今天看了这个github地址才知道 。还有 能解释下 用的这些 usbmuxd ios_webkit_debug_proxy ios-deploy carthage 都主要负责在你的框架里干什么事么?

8317
7555harsayer 回复

这些都是依赖的工具

说下我明确知道的吧,都是在使用过程中遇到问题或者疑问,自己查询资料得到的

有误,更新

ideviceinstaller是单独的一个项目,不是在libimobiledevice工具套件里面的

libimobiledevice

在windows上大家可以使用iTunes来与iPhone进行通信,但是Linux上没有这类的官方软件,所以一些爱好者就破解了iTunes的通信协议,然后在Linux上实现了该协议,也就是libimobiledevice

可以到官网去看详细的介绍 http://www.libimobiledevice.org/
很多ios助手应该是依赖这个的。

简单说是可以操作ios手机的命令行工具,iTunes上实现的功能,通过命令行也可实现。

mac上安装了之后有很多命令行工具。这是一个工具套,从名称大概能知道是做什么,不明确的直接加 -h 查看帮助,很简单。

本项目用到了ideviceinstaller idevicesyslog idevicedebug(这个是打开app用的) ,后期打算结合 idevicescreenshot 和 idevicecrashreport 自动分析crash日志。

-rwxr-xr-x    1 root  admin      9804  3  8 12:51 idevice_id
-rwxr-xr-x    1 root  admin     43316  3  8 12:51 idevicebackup
-rwxr-xr-x    1 root  admin     57448  3  8 12:51 idevicebackup2
-rwxr-xr-x    1 root  admin     27952  3  8 12:51 idevicecrashreport
-rwxr-xr-x    1 root  admin     14552  3  8 12:51 idevicedate
-rwxr-xr-x    1 root  admin     16292  3  8 12:51 idevicedebug
-rwxr-xr-x    1 root  admin     23196  3  8 12:51 idevicedebugserverproxy
-rwxr-xr-x    1 root  admin     14976  3  8 12:51 idevicediagnostics
-rwxr-xr-x    1 root  admin      9376  3  8 12:51 ideviceenterrecovery
-rwxr-xr-x    1 root  admin     28404  3  8 12:51 ideviceimagemounter
-rwxr-xr-x    1 root  admin     22244  3  8 12:51 ideviceinfo
lrwxr-xr-x    1 MAC   admin        55  7 21  2016 ideviceinstaller -> ../Cellar/ideviceinstaller/1.1.0_2/bin/ideviceinstaller
-rwxr-xr-x    1 root  admin      9828  3  8 12:51 idevicename
-rwxr-xr-x    1 root  admin     14772  3  8 12:51 idevicenotificationproxy
-rwxr-xr-x    1 root  admin     31988  3  8 12:51 idevicepair
-rwxr-xr-x    1 root  admin     27604  3  8 12:51 ideviceprovision
-rwxr-xr-x    1 root  admin     14464  3  8 12:51 idevicescreenshot
-rwxr-xr-x    1 root  admin     14880  3  8 12:51 idevicesyslog```

包括上面的ideviceinstaller,这个是命令行安装卸载 app用的 ideviceinstaller 是单独安装的,原文中已经说明

devicescreenshots截屏的,idevicesyslog查看系统日志的,idevicecrashreport是获取crash日志的。还有备份,恢复手机系统的等等。

具体的使用方式查看帮助

MACdeMacBook-Pro:iosMonkey-master MAC$ ideviceinstaller -h
Usage: ideviceinstaller OPTIONS
Manage apps on iOS devices.
  -u, --udid UDID   Target specific device by its 40-digit device UDID.
  -l, --list-apps   List apps, possible options:
       -o list_user - list user apps only (this is the default)
       -o list_system   - list system apps only
       -o list_all  - list all types of apps
       -o xml       - print full output as xml plist
  -i, --install ARCHIVE Install app from package file specified by ARCHIVE.
                        ARCHIVE can also be a .ipcc file for carrier bundles.
  -U, --uninstall APPID Uninstall app specified by APPID.
  -g, --upgrade ARCHIVE Upgrade app from package file specified by ARCHIVE.
  -L, --list-archives   List archived applications, possible options:
       -o xml       - print full output as xml plist
  -a, --archive APPID   Archive app specified by APPID, possible options:
       -o uninstall - uninstall the package after making an archive
       -o app_only  - archive application data only
       -o docs_only - archive documents (user data) only
       -o copy=PATH - copy the app archive to directory PATH when done
       -o remove    - only valid when copy=PATH is used: remove after copy
  -r, --restore APPID   Restore archived app specified by APPID
  -R, --remove-archive APPID  Remove app archive specified by APPID
  -o, --options     Pass additional options to the specified command.
  -h, --help        prints usage information
  -d, --debug       enable communication debugging

usbmuxd

是USB和ios手机通信的工具,USB通信代替WIFI
webdriveragent项目中有明确说明
https://github.com/facebook/WebDriverAgent/wiki/Common-Issues
截图:

iproxy详细介绍:

http://iphonedevwiki.net/index.php/SSH_Over_USB

macaca使用iproxy的帖子:

Macaca iOS 驱动调整为 USB 通信 https://testerhome.com/topics/6314

3253

你好,我照着配了一下,运行时候macaca server处报:BundleId com.apple.test.WebDriverAgentRunner-Runner does not exist.导致monkey无法进行
但是在重签名的时候我并没有将Bundleld改成com.apple.test.WebDriverAgentRunner-Runner
想请教一下这边是我漏改了哪出造成的问题?

8317

没有成功安装wda吧,这个id不需要改
这个属于如何配置wda,很多帖子说的很详细

96
3253micky_jw 回复

我也是这个问题。。。但是WDA单独是可以test到真机的,求解

8136

http://www.akblog.cn/2017/02/11/macOS-Sierra%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85libimobiledevice/ 安装make时 报各种环境的错误 这里有详细的介绍怎么解决

96

给力!真的能用,赞

15498

ideviceinstaller iOS10 不需要了把?

8317
15498mamian 回复

都需要的,你知道代替的方案么

15498
8317utopia 回复

我刚刚测试的时候,没有编译这个,成功调起了

8317
15498mamian 回复

安装wda不用这个,是直接xcodebuild安装的,安装卸载测试APP用这个,这个是macaca依赖的,也可以提前安装好,不用macaca指令安装

3253
8317utopia 回复

问题已经解决,感谢。

16087

正在寻找ios monkey的方案

96

自定义功能是在工程的java类里面修改代码,然后目录下mvn assembly:assembly
显示build failure

Failed to execute goal on project iosMonkey: Could not resolve dependencies for project iosMonkey:iosMonkey:jar:1.0: Failure to find macaca.webdriver.client:macacaclient:jar:2.0.4 in https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced -> [Help 1]

咋回事?求解

96


报这个错,何解?

8317
32rolex_sky001 回复

是横线,不是下划线,名称已经更正,谢谢提出

8317
32pieceone 回复

看看仓库里有没有macacaclient的jar包

96
8317utopia 回复

果然,哈哈。感谢

96
8317utopia 回复

没有,下载不到2.0.4版的macaca-client

8317
32pieceone 回复

http://jcenter.bintray.com 可以手动下载

96
8317utopia 回复

下载了,也写入到pom里面了,但工程里的pom还是报错,影响打包不?

96

请教,这一段是怎么设置的?

8317
32pieceone 回复

过会应该就好了,清下缓存

8317
32rolex_sky001 回复

设置环境变量

96
8317utopia 回复

重新写了个dependency就好了~
期待更多的monkey event,锁屏/HOME等😁

2457

@utopia HOME可以用keys实现

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