布景介绍
主动测验生成 ATG
主动测验生成 ATG(Automated Testing Generation)技能,也叫 AIG(Automated Input Generation)技能。传统的主动化方法,比如录制与回放(Record & Replay),依靠于测验人员编写测验脚本。同时,跟随着测验需求的改动,测验人员需求消耗必定的时间保护和调整相应的测验脚本。与录制回放的方法相比,将测验活动依靠的通用服务进行抽象,依靠主动的方法生成测验活动需求的操作,能较大程度削减测验脚本的编写与保护工作量。
现在,典型的 ATG 技能有:
- 程序剖析;(Code-Based Testing);
- 根据模型的测验生成(Model-Based-Testing);
- 组合测验(Combinatorial Testing);
- 根据搜索的测验生成(Search-Based-Testing), Facebook 的 Sapienz;
- 自适应随机测验(Adaptive Random Testing)。
市道测验东西
表 1 列举了现在市道上几款常见的 iOS UI 主动化结构。
整体上可分三类,
1)App 源码插桩:经过插桩 SDK 获取宿主页面控件树和进程内注入可履行操作,插桩方法履行速度快,但也有弊端,拙劣的 SDK 或许对宿主 App 有不良影响,比如稳定性变差了,此外进程内注入方法是无法操作一个系统级弹窗的。
2)WDA 私有接口:这种方法的好处是无需插桩,也是现在主流的 iOS UI 主动化计划,可是往往运用了私有接口就必定带来兼容问题,其次私有接口获取控件树的功用有时也令人堪忧。
3)图画识别结合 WDA 私有接口:根据此主动化才干彻底取决于图画的才干,别的 2 中具有的优缺点它也同样具有。
表 2 是现在市道上几款相对较好的 iOS 端稳定性 Monkey 测验东西。
总结来说根本都是根据 XCTest 和 WDA 来完成的,可是普遍问题是更新保护不及时,甚至是已经停止保护很久。其东西研制面对的首要问题是对 iOS 新版兼容开发本钱巨大。
特别是涉及 WDA(WebDriverAgent,供给了某些跨进程 App 调度和获取控件树的才干)私有接口的兼容,往往面对等待 Facebook 处理 WDA 的兼容后才干着手展开。
但现实也很不幸,Facebook 现在已经抛弃了对 WDA 的后续兼容,转向 IDB 研制(iOS Development Bridge,类似于安卓中的 adb 东西,但在真机上存在稳定性问题尚无法彻底替代 WDA),WDA 现在则由 Appium 以社区方法接手持续迭代。
Fastbot 计划简述
Fastbot的整体分为两部分:
- 服务端:担任测验模型搭建,动作决议计划,指令下发。
- 客户端:担任GUI信息上报,处理服务端下发的动作。
客户端与服务端会分别创立一个Agent,经过Socket通道进行通信。
测验流程:
- 服务端Agent将客户端Agent上传的GUI信息进行封装,生成State节点。
- 服务端Agent再经过当时State信息,按照分配好的算法,与任务模型交互,作出Action决议计划。
- 服务端Agent将Action决议计划发回客户端Agent,客户端履行Action。
在步骤2中,服务端会判别是否发生了溃散,覆盖率信息,当时节点的途径记载等多种信息,用于完成数据剖析,途径回放和测验生成。
溃散查看
当Fastbot在测验进程中发生了溃散时,需求从测验设备的Crash logs中去获取溃散信息。
Fastbot环境装备
装置Xcode,Cocoapods
sudo gem install cocoapods -v=1.8.1
初始化项目
拉取仓库和依靠
git clone https://github.com/bytedance/Fastbot_iOS.git
cd Fastbot_iOS && cd Fastbot-iOS && pod install --repo-update
设置证书
- 勾选Automatically manage signing,敞开主动签名
- 修正bundle Id为仅有id,途径
Target -> BuildSettings ->Product Bundle Identifier
。 - 在Xcode中登陆开发者账号
测验设备装备
-
衔接手机到mac,信赖测验手机。
-
履行单元测验中的
FatbotRunner -> testPingNetwork
,完成测验用例Pass,期间会装置一个App(如FastbotRunner-Runner)
或许需求处理的问题:
- 需求信赖App的证书
- 等待获取网络权限,手动打开App,等待几秒时间,切回到桌面,此时弹出是否敞开网络权限的弹窗,挑选敞开。该操作重复,直到testPingNetwork用例Pass。
By tapping FastbotRunner on the device, the screen of the device would go black for about one minute. During the black screen interval, users should press the home button on the device to go back to the main screen. Wait patiently until the network setting dialog window pops up. Users should allow the pop up request in order to continue.
经过点击设备上的FastbotRunner,设备的屏幕会变黑约一分钟。在黑屏间隔时间内,用户应按下设备上的home键返回主屏幕。请耐心等待弹出网络设置对话框。为了持续,用户应该答应弹出恳求。
开端测验
- 将被测验的App装置至测验手机上。
- 输入设备密码,启用UI主动化测验(每次测验只会呈现一次)。
- 在运转Scheme中添加测验参数(Test-Debug阶段)。
字段 | 说明 | 示例 |
---|---|---|
BUNDLEID | 被测验App的 Bundle ID | com.xxx.xxx |
duration | 测验时长,单位分钟 | 240 |
launchenv | 用于传递测验App的环境变量,一般为空,或许以 ‘:’切割的key=value方法 | isAutoTestUI=1:channel=AutoTest |
throttle | 操作间隔,单位毫秒 | 300 |
- 履行
FastbotRunner -> testFastbot
,被测验App将被引发。如果没有引发,在等待时手动引发被测验的App。
Shell发动
# (如果发动Scheme设置中的发动参数被更改则需还原),可根据实际情况运用build-for-testing test-without-building,id为设备的udid
BUNDLEID=com.xxx.xxx duration=240 throttle=300 xcodebuild test -workspace Fastbot-iOS.xcworkspace -scheme FastbotRunner -configuration Release -destination 'platform=iOS,id=00008101-000318213123451E' -only-testing:FastbotRunner/FastbotRunner/testFastbot
Stub 形式
将fastbot_stub
注入到被测验的App中。该库能够捕获App在测验进程中的GUI结构信息。能够运用更多自定义的功用(如hook callback、cut View),还有防止某些View被点击,自定义ViewControllers等。
-
将fastbot_stub 经过pod 方法集成进被测验的App
-
撤销代码注释:
[fastbot_native addUIInterruptionMonitor: ...];
in FastbotRunner.m -
修正FatbotRunner的Scheme中参数
key sample launchenv stubPort=9797 dataport 9797 -
先发动被测验App,让GCDWebServer发动。
-
再运用Shell敞开FastbotRunner
东西
libimobiledevice
实用东西 | 描述 |
---|---|
idevice_id |
列出给定设备的附加设备或打印设备称号 |
idevicebackup |
为设备创立或康复备份(旧版) |
idevicebackup2 |
为运转 iOS 4 或更高版本的设备创立或康复备份 |
idevicebtlogger |
从设备捕获蓝牙HCI流量(需求日志装备文件) |
idevicecrashreport |
从设备检索溃散报告 |
idevicedate |
显现当时日期或在设备上设置 |
idevicedebug |
与设备的调试服务器服务交互 |
idevicedebugserverproxy |
从设备代理调试服务器衔接进行长途调试 |
idevicediagnostics |
与设备的确诊接口交互 |
ideviceenterrecovery |
让设备进入康复形式 |
ideviceimagemounter |
在设备上挂载磁盘映像 |
ideviceinfo |
显现有关已衔接设备的信息 |
idevicename |
显现或设置设备称号 |
idevicenotificationproxy |
在设备上发布或观察通知 |
idevicepair |
办理主机与设备和usbmuxd的配对 |
ideviceprovision |
办理设备上的预置描述文件 |
idevicescreenshot |
从衔接的设备获取屏幕截图 |
idevicesetlocation |
模拟设备上的方位 |
idevicesyslog |
衔接设备的中继系统 |
参阅链接
Fastbot Github仓库
Fastbot:行进中的智能 Monkey
奔跑吧!智能Monkey之Fastbot跨渠道
使用功用监控全链路版