基于 XCTestWD,swiftmonkey 二次开发,实现无需插桩的 iOS monkey 自动化工具 fastmonkey

优势

无需插桩!
高效率,每秒 4-5 个 action!
轻量极简!

原理

先致敬两个开源工具;

1.swiftmonkey
       https://github.com/zalando/SwiftMonkey
       因其直接使用了 苹果的私有 api 如 XCEventGenerator.tapAtTouchLocations 故执行速度极快。同时也用类似 android monkey 的事件生成机制,自身源源不断的产生如 tap,swipe,pinchIn 等事件使其对被测 app 产生了极大的压力
       缺点:需要插桩
2.XCTestWD
       https://github.com/macacajs/XCTestWD
       类似 facebook wda 的方式,在 xcode 中执行 xcuitest 时启动一个监听 server,可通过外部发送命令来创建待测 app 对应 session 并启动 app,同时也实现了 dump tree 和依据 xpath,id 等来定位某个控件并操作这些控件
3.Fastmonkey
       (https://github.com/zhangzhao4444/Fastmonkey
       结合两者优点并改造两者,在 XCTestWD 基础上实现一个 server 路由,外部命令时可引导启动 app 并执行 monkey

       首先感谢来自熊猫 tv 的大佬@zhangzhao_lenovo的无私贡献,开源给我们社区使用,这基本算 UIAutomation 被遗弃后,第一款无须注入就能使用的 iOS monkey 测试的工具了,给 zhangzhao_lenovo 大佬点赞。其次感谢 macaca 团队的@SamuelZhaoY @xdf 大佬们(ps:肯定还有其他大佬,这里我只把 XCTestWD 的作者,和我们最熟悉的达峰大佬 @ 出来了,希望其他大佬不要在意),给我们做自动化测试的人员提供那么好用的 macaca,以及他们自己写的可以用来代替 WDA 的 XCTestWD,我代替伸手党们对你们表示感谢。

废话不多说了,今天我开始使用 Fastmonkey,最开始配置有点小问题,但是很快在 zhangzhao_lenovo 大佬以及@Only7的帮助下解决了,这里我来写个扫盲贴(安装贴?)

第一步:打开终端,git clone 下来(其他方式皆可)

$ git clone https://github.com/zhangzhao4444/Fastmonkey.git

第二步:因为我是直接 git 下来的,Fastmonkey 在我的/Users/xxxxx/Fastmonkey路径下,接下来我们更新依赖包.

先定位到 XCTestWD-master 下

$ cd /Users/xxxxx/Fastmonkey/XCTestWD-master

cartfile 安装第三方库

$ carthage update

第三步:第三方库下载好,开始配置 XCTestWD.xcodeproj。我们用 Xcode 打开 XCTestWD.xcodeproj,然后来配置 XCTestWD 里面的一些内容

首先是 XCTestWD->General->Signing->Team,把账号设置好,具体可以见 XCTestWD 的配置,保证不报错。

当然 XCTestWDUITests->General->Signing->Team 也一样

然后在 XCTestWD->Build Setting->Header Search Paths 和 XCTestWD->Build Setting->Objective-C Bridging Header 中,把里面的 XCTestWD/XCTestWD-Bridging-Header.h 删掉。
理由见下面。

第四步:环境配置好了,就是运行了,我这里就直接用真机来运行的。

首先,打开一个终端窗口,执行:

$ iproxy 8001 8001

接着,再打开一个终端窗口。执行:

$ cd /Users/xiatian/Fastmonkey/XCTestWD-master/XCTestWD 
$ xcodebuild -project XCTestWD.xcodeproj \
           -scheme XCTestWDUITests \
           -destination 'platform=iOS,name=(your device name)' \
           XCTESTWD_PORT=8001 \
           clean test

出现上面的页面,说明 XCTestWD 运行成功了

最后,打开第三个终端窗口,执行:

$curl -X POST -H "Content-Type:application/json" \
              -d "{\"desiredCapabilities\":{\"deviceName\":\"xxxx\",\"platformName\":\"iOS\", \"bundleId\":\"com.PandaTV.Live-iPhone\",\"autoAcceptAlerts\":\"false\"}}" \
              http://127.0.0.1:8001/wd/hub/monkey

你就可以看见你手机成功打开 PandaTV,然后 monkey 似的在那乱点了~~~~

问题:

、error: bridging header '/Users/xxxxx/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWD/XCTestWD-Bridging-Header.h' does not exist

原因:

xcode buildsetting 有问题。 xctestwd 中没有用到 oc,swift 混编,header search path,objecktive-c bridging header 配置可去掉再试试。xctestwduitest 中用了混编才需要 xctestwduitest-bridging-header.h

解决方案:

XCTestWD->Build Setting->Header Search Paths 和 XCTestWD->Build Setting->Objective-C Bridging Header中,把里面的 XCTestWD/XCTestWD-Bridging-Header.h 删掉

、Swifter 无法找到

原因:未安装第三方库

解决方案:

先定位到 XCTestWD-master 下

$ cd /Users/xxxxx/Fastmonkey/XCTestWD-master

cartfile 安装第三方库

$ carthage update

、如果 Mac 插入多台 iPhone 设备

iproxy 8001 8001 后需要加 serialid 指定哪台 iPhone 设备做端口映射。 然后 curl 中执行对应 iPhone 设备

、xcodebuild 方式跑起来的截图和 crash 日志在哪里找呢?

xcode 里中断运行时 有个 log 路径的日志输出 xxx/XCTestWD-xxx/Logs/Test/Attentment

、crash log 也是会生成在 Attachments 文件夹里面吗? 该 crash log 是否可以追踪到 app 代码问题?

crash 也在 Attachments 里

就是系统生成的崩溃堆栈文件,研发有对应的符号文件是可以定位的

当然,最后再次感谢 zhangzhao_lenovo 大佬,该贴只为扫盲,解决一些小白的安装流程及问题,做了伸手党,也要帮大佬解决一点小问题嘛。

大佬原贴在此:https://testerhome.com/topics/9524

有难度的问题可以去该帖近距离触摸 zhangzhao_lenovo 大佬,没难度的就在这个帖子下面大家一起讨论吧。

照例,在最后 @ 几个大神防止帖子沉下去。。。。

@seveniruby @xdf @zhangzhao_lenovo@Lihuazhang@pliue(ps:继续抱大腿活动)

2017-10-19 更新

最近升级 Xcode9 和 iOS11 后,fastmonekey 也受到一定影响,存在一些新的问题,大家可以看下这篇文章:https://testerhome.com/topics/10390,希望能帮助你们解决问题。

感谢@Test_Sir的贡献。


↙↙↙阅读原文可查看相关链接,并与作者交流