一,背景
需要在ios上进行monkey测试,通过对比发现以后几个monkey的工具后,采用sjk_swiftmonkey
1.swiftmonkey
https://github.com/zalando/SwiftMonkey
直接使用了 苹果的私有 api 如 XCEventGenerator.tapAtTouchLocations 执行速度极快。
同时也用类似 android monkey 的事件生成机制,自身源源不断的产生如 tap,swipe,pinchIn 等事件使其对被测 app 产生了极大的压力
缺点:需要插桩
2.XCTestWD
https://github.com/macacajs/XCTestWD
在 xcode 中执行 xcuitest 时启动一个监听 server,可通过外部发送命令来创建待测 app 对应 session 并启动 app,
依据 xpath,id 等来定位某个控件并操作这些控件
3.Fastmonkey
https://github.com/zhangzhao4444/Fastmonkey
结合两者优点并改造两者,在 XCTestWD 基础上实现一个 server 路由,外部命令时可引导启动 app 并执行 monkey
缺点:支持xcode8.x,xcode9.x ,xcode10.x,需要更改相应的文件及配置,环境搭建较为复杂
4.sjk_swiftmonkey
https://github.com/lcyfly/sjk_swiftmonkey
二次开发 swiftmonkey,把不支持 10.1 以上的 XCEventGenerator 换成 xctest 的 API,只需修改bundleIdentifier,即可运行,较为方便快捷
二,搭建sjk_swiftmonkey
clone 源码,整体项目结构如图
Monkey: 是程序入口,主要是monkey构造,monkey运行等
MonkeyXCTest: 看注释的话本来是要扩展monkey使用公共的XCTest API来生成事件的,但是没写。。。
MonkeyXCTestPrivate:这块才是利用私有API生成各种事件的代码
MonkeyUIAutomation: 这块是利用UIautomation框架来执行各种事件的,但是只支持模拟器
Random: 这块是生成各种随机数的函数
1. 在Signing&Capabilities中修改自己的开发者账号,Bundle Identifier随便改个唯一的字符串
2.jk-monkeyuiTests 里面
let application = XCUIApplication.init(bundleIdentifier: "com.XXX.xxx")
3.点击选择自己的设备,然后Product-->Test就可以运行了
三,Event
在使用monkey的时候,需要添加随机事件。下面介绍几种随机事件,及其在monkey中的占比(权重)
TapAction:点击
LongPressAction:长按
DragAction:拖拽
PinchCloseAction:缩小手势
PinchOpenAction:放大手势
RotateAction:旋转手势
publicfuncaddDefaultXCTestPrivateActions() {
addXCTestTapAction(weight: 25)
addXCTestLongPressAction(weight: 1)
addXCTestDragAction(weight: 0)
addXCTestPinchCloseAction(weight: 0)
addXCTestPinchOpenAction(weight: 0)
addXCTestRotateAction(weight: 0)
addXCTestOrientationAction(weight: 1)
}
插入业务逻辑代码
1. 每次执行event前判断是否增加业务功能代码,直接执行功能代码
2. 插入定时循环事件来执行功能代码,swiftmonkey有两种执行事件的方式,