开源测试工具 fastmonkey 自我扫盲贴

yxys01 · 发布于 2017年08月24日 · 最后由 iris945 回复于 2017年09月20日 · 2094 次阅读
本帖已被设为精华帖!

基于 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:继续抱大腿活动)

共收到 20 条回复
104 seveniruby 将本帖设为了精华贴 08月25日 06:42
4481

学习学习

8e8f92

Mark ! 感谢分享!

5楼 已删除
9bfbe7

请问下执行iproxy 8001 8001报错iproxy 找不到是什么原因,还有第二个和三个终端的deviceName就是苹果手机的udid吗

8136

Code signing is required for product type 'UI Testing Bundle' in SDK 'iOS 10.3' 提示我这个 我应该怎么处理

25f875
9bfbe7hejianhao0612 回复

你是不是没有安装libimobiledevice啊?

25f875
9bfbe7hejianhao0612 回复

deviceName是你的设备名称啊

xcode->device->你的设备->name
一般是 XXX的 iPhone

25f875
8136304764691 回复

xcode版本不够吧,升级xcode吧

10152

执行到最后一步,提示找不到我的设备,但是错误日志里打出的列表中又有我的设备。。。
执行命令是:xcodebuild -project XCTestWD.xcodeproj -scheme XCTestWDUITests -destination 'platform=iOS,name=(“张圣洁”的 iPhone)' XCTESTWD_PORT=8001 clean test
错误日志:
xcodebuild: error: Unable to find a destination matching the provided destination specifier:
{ platform:iOS, name:(“张圣洁”的 iPhone) }

The requested device could not be found because no available devices matched the request.

Available destinations for the "XCTestWDUITests" scheme:
{ platform:iOS, id:48ade89d767be26fa2d6a53eec51085e02e43ec6, name:“张圣洁”的 iPhone }
{ platform:iOS, id:537a954539a82db33ed879a4d500c70a8458de9c, name:yan的 iPhone }
{ platform:iOS Simulator, id:B896FC57-4760-4930-AB11-2D5C4E223769, OS:10.3.1, name:iPad (5th generation) }
{ platform:iOS Simulator, id:1662F473-A67B-4E6A-8971-651B16394D72, OS:10.3.1, name:iPad Air }
{ platform:iOS Simulator, id:6D42E5E7-0F33-4A20-9837-E0BADBBA8342, OS:10.3.1, name:iPad Air 2 }
{ platform:iOS Simulator, id:950FB86A-CDEC-40F0-8FF2-AC2800F884DF, OS:10.3.1, name:iPad Pro (9.7 inch) }
{ platform:iOS Simulator, id:0512C785-4C39-4F35-93DA-B383CC8510DE, OS:10.3.1, name:iPad Pro (10.5-inch) }
{ platform:iOS Simulator, id:CAFEDC20-E79F-4061-9E24-B55E37A353B1, OS:10.3.1, name:iPad Pro (12.9 inch) }
{ platform:iOS Simulator, id:745B0C59-04DF-43D8-B431-086F74CAD7A5, OS:10.3.1, name:iPad Pro (12.9-inch) (2nd generation) }
{ platform:iOS Simulator, id:C79D11A9-DFE7-43A9-9871-3C030360AD57, OS:10.3.1, name:iPhone 5 }
{ platform:iOS Simulator, id:85F607AE-C9C5-4230-A5F6-01361253BBBF, OS:10.3.1, name:iPhone 5s }
{ platform:iOS Simulator, id:6D792B46-0296-4332-B643-FAC2BCB485B4, OS:10.3.1, name:iPhone 6 }
{ platform:iOS Simulator, id:8F207306-E311-43A5-8826-76C526E1E54E, OS:10.3.1, name:iPhone 6 Plus }
{ platform:iOS Simulator, id:FAE72621-4D4D-40DB-B6A8-CB422F8ABBFD, OS:10.3.1, name:iPhone 6s }
{ platform:iOS Simulator, id:34B7D02E-DBFC-4BCB-94D9-013E9B34BE91, OS:10.3.1, name:iPhone 6s Plus }
{ platform:iOS Simulator, id:F5C83B6B-148B-4C5A-B6E6-E620DE0ACA60, OS:10.3.1, name:iPhone 7 }
{ platform:iOS Simulator, id:2E95E3EF-D2FB-4921-A613-27021378E2DA, OS:10.3.1, name:iPhone 7 Plus }
{ platform:iOS Simulator, id:46143C6D-A772-450C-A8E9-CA0B429650F6, OS:10.3.1, name:iPhone SE }

Ineligible destinations for the "XCTestWDUITests" scheme:
{ platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Generic iOS Device }
{ platform:iOS Simulator, id:dvtdevice-DVTiOSDeviceSimulatorPlaceholder-iphonesimulator:placeholder, name:Generic iOS Simulator Device }

4113bc

运行xcodebuild -project XCTestWD.xcodeproj 这句报错:
2017-08-30 19:02:35.530 xcodebuild[41499:4750078] Error Domain=IDETestOperationsObserverErrorDomain Code=4 "Test operation was canceled. If you believe this error represents a bug, please attach the log file at /Users/mac/Library/Developer/Xcode/DerivedData/XCTestWD-cseytoewhlzxivgopaonbuqulosj/Logs/Test/BBE6C2E9-EFFC-4AC7-BF69-A360B492C709/Session-XCTestWDUITests-2017-08-30_190230-J7U8QS.log" UserInfo={NSLocalizedDescription=Test operation was canceled. If you believe this error represents a bug, please attach the log file at /Users/mac/Library/Developer/Xcode/DerivedData/XCTestWD-cseytoewhlzxivgopaonbuqulosj/Logs/Test/BBE6C2E9-EFFC-4AC7-BF69-A360B492C709/Session-XCTestWDUITests-2017-08-30_190230-J7U8QS.log}

Testing failed:
Use of undeclared type 'XCTestWDMonkey'
Use of unresolved identifier 'XCTestWDMonkey'
** TEST FAILED **

The following build commands failed:
CompileSwift normal armv7 /Users/mac/Documents/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift
CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compiler
(2 failures)

25f875
10152holyzhang 回复

你curl中设备名不要打引号啊,就像下面这个:

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

其次你先不要插两台设备,如果要并发的话,请参考原贴的回复 https://testerhome.com/topics/9524

{ platform:iOS, id:48ade89d767be26fa2d6a53eec51085e02e43ec6, name:“张圣洁”的 iPhone }
{ platform:iOS, id:537a954539a82db33ed879a4d500c70a8458de9c, name:yan的 iPhone }
16楼 已删除
17楼 已删除
10152
25f875yxys01 回复

我用xocode安装的xctestwd,然后curl的时候 链接的时候有问题
服务端:
Requesting connecion to device handle == 8 (serial: 48ade89d767be26fa2d6a53eec51085e02e43ec6), port 8001
Error connecting to device!
链接端:
curl: (52) Empty reply from server

25f875
10152holyzhang 回复

首先是xcode不是xocode,你这代码注意点,别因为打错导致错误。
其次,你先按我写的指导教程一步一步的走嘛,先跑通,你再去用xcode run嘛。。。
最后,你这个是链接失败的错误,看看是不是端口没打开或者xctestwd没装好?
个人建议,你先按我的指导贴一步一步走一遍,看看是不是还有问题,再来提好吗?

156e5d
25f875yxys01 回复

求教,按照你的步骤执行,在执行到xcodebuild -project XCTestWD.xcodeproj -scheme XCTestWDUITests -destination 'platform=iOS,name=slideplus' XCTESTWD_PORT=8001 clean test 出现下图错误,帮忙看下如何处理,万分感谢🙏

25f875
156e5dslideplustest 回复

你这个是代码层面的错误,建议去问@zhangzhao_lenovo;其次,我在https://testerhome.com/topics/9524#reply232xcode版本问题,你要不先降到8.3.3试试?看到你好像是

156e5d
25f875yxys01 回复

嗯,谢谢楼主回复,我正在下载8.3的,9的有点不靠谱~

25f875
156e5dslideplustest 回复

希望你能成功运行。其实我也下了9来用过,确实兼容方面存在一定的问题,如果是研发还好,测试使用的框架有些地方不是那么友好。

1ef498

请问楼上前辈下的Xcode8.3.3成功了吗?我也是执行到那一步报错了;错误原因如下图我看了一下Xcode版本是8.3.3,请教一下大神有什么办法能解决吗?

2182

"xcode里中断运行时 有个log路径的日志输出 xxx/XCTestWD-xxx/Logs/Test/Attentment "
求问这个具体路径是?

A99604
2182bingle 回复

我找了很久才找到= =!
当前用户目录下的/Library/Developer/Xcode/DerivedData/XCTestWD-xxx/Logs/Test/Attachments

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