目前移动端App上线后 crash 率比较高, 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性,更早的发现crash问题并修复。
去年移动开发者大会上有参加 fastbot 的分享,所以很自然的就想到Fastbot工具。
准备工具
> sudo gem install cocoapods -v=1.8.1
fastbot_iOS
项目,并初始化
-
> git clone https:
/
/github.com
/bytedance
/Fastbot_iOS
-
> cd Fastbot_iOS
-
> cd Fastbot-iOS
&
& pod install --repo-update
Fastbot_iOS
是克隆的项目目录,Fastbot-iOS
是项目下面的子目录。
Fastbo-iOS
项目。https://github.com/bytedance/Fastbot_iOS
具体配置查看github项目中的《中文手册》,操作步骤非常详细。
FastbotRunner
弹出菜单,选择Edit Scheme...
选项。在Scheme
中设置参数,参考表格:
字段 | 说明 | 示例 |
---|---|---|
BUNDLEID | 被测试App的 Bundle ID | com.apple.Pages |
duration | 测试时长,单位分钟 | 240 |
throttle | 操作间隔,单位毫秒 | 300 |
launchenv | 启动测试App的环境变量,一般为空,或者以 ':'分割的key=value形式 | isAutoTestUI=1:=AutoTest |
点击testFastbot
按钮,开始运行Monkey测试。你可以在手机端看到被测试App以及启动,并开始自动执行操作。
tidevice是阿里开源的iOS自动化测试工具,其实叫自动化工具有点不准确。他本质上有点像android 的 adb
工具,可以理解为PC与iOS之间的通信工具。提供了一些非常有用的功能,查看设备信息、安装卸载应用,当然,最主要的是可以执行XCTest
。
github: https://github.com/alibaba/taobao-iphone-device
> pip install -U tidevice
-
> tidevice list
-
List of apple devices attached
-
xxxx-xxxxxxxxxxx iPhone USB
FastbotRunner-Runner
App。
-
> tidevice ps --json
-
[
-
{
-
"pid":
11549,
-
"name":
"FastbotRunner-Runner",
-
"bundle_id":
"bytedance.FastbotRunner.name.xctrunner",
-
"display_name":
"FastbotRunner-Runner"
-
},
-
]
前参考前面fastbot-iOS《中文手册》,他会详细说明如何在手机上安装
FastbotRunner-Runner
APP。这一步极为重要。
tidevices
运行测试> tidevice xctest -B bytedance.FastbotRunner.name.xctrunner -e BUNDLEID:com.apple.Pages -e duration:480 -e throttle:300 --debug
参考前面,Scheme参数说明。
这是我们想搞懂的一个问题,以便于看看是否有可配置的选项。
fastbot- 算法原理
我们将页面的 GUI 信息抽象成模型中的 State,将执行的动作抽象成模型中的 Action,通过 State 作为图的节点,Action 作为图的边,连接形成有向有环图模型。遍历决策想法上源于 Alphago 的蒙特卡洛搜索树的思想,此基础上我们也使用了其他强化学习的方法,设计了 N 步 Q-Learning 算法和基于页面变化程度的 reward function,为页面下每个 Action 计算出相应的 Q 值,基于 Q 值选取最优动作。
...
我们选择使用好奇心强化学习的方法来解决奖励稀疏问题,同时结合自然语言处理对页面信息做特征抽象,在原有 reward function 基础上增加好奇心(Curiosity)的 reward
上面摘自《奔跑吧!智能Monkey之Fastbot跨平台》 一文,所以不用做过多的人工配置或干预。随着不断执行App 的遍历,也是不断强化遍历的工具的学习的过程。
这一点对我们尤为重要,因为我们的App中大量页面是用flutter实现的,做传统的UI自动化是非常麻烦。
在 Fastbot 低能耗、低耗时、高性能前提要求下,我们优先选用最基础的图像处理技术来识别 GUI 界面信息,可以在毫秒级完成构建一个页面的信息。
上面摘自《奔跑吧!智能Monkey之Fastbot跨平台》 一文, 强烈建议阅读原文,多读几遍,受益匪浅。
tidevice的作者给了答案,通过设备的udid
号区分就可以了。当你的PC连接多个手机时。
-
> tidevice list
-
List of apple devices attached
-
xxxx-xxxxxxxxxxx iPhone USB
-
yyyy-yyyyyyyyyyy iPhone USB
> tidevice -u xxxx-xxxxxxxxxxx xctest -B bytedance.FastbotRunner.name.xctrunner -e BUNDLEID:com.apple.Pages -e duration:480 -e throttle:300 --debug
> tidevice -u yyyy-yyyyyyyyyyy xctest -B bytedance.FastbotRunner.name.xctrunner -e BUNDLEID:com.apple.Pages -e duration:480 -e throttle:300 --debug
我一开始想当然的以为测出了崩溃工具就停止呗,以至于我跑了两天都以为工具没发现崩溃。后来,在官方的微信群里问过才知道,崩溃后重新启动App继续执行。直到设置的运行时间结束。
这一步也很重要,总不能崩溃就崩溃了吧!monkey的执行过程我们又无法复现。我一开始以为日志藏在tidevice
中,因为他运行的过程(加--debug
参数)中会打印大量的日志。我又没办法把这个日志写到文件中(命令结尾加 > log.txt
无用),花了半天时间改 tidevice
的代码,在logger的地方写文件。
后来,发现这么做没有卵用!tidevice/fastbot
相当于是指令的发出者,他只会说:“我发送了一条指令哦!” 这样的废话,至于 App 接收到指令后是否执行,是否引起崩溃,无法给到 tidevice/fastbot
工具。
但是,作者说fastbot
工具可以集成报告。
https://github.com/bytedance/Fastbot_iOS/issues/2
我觉得,他也只是说说,因为这是8月份的问题,当然这么好用的工具愿意开源就很好了,不要不知好歹。可能他又有别的KPI要忙~!
那么,我们的App是有集成firebase
的SDK,如果App崩溃,那么会上报日志到firebase
平台,可以在firebase
平台上统计分析。
fastbot-iOS是一种iOS端的Monkey测试工具,用于自动化测试iOS应用程序的稳定性和可靠性。它可以在应用程序中生成随机的用户事件,如触摸、手势和按键等,以模拟真实用户的操作行为。以下是fastbot-iOS的一些常见测试参数及其详解:
bundle_id
:指定要测试的目标应用程序的Bundle ID。Bundle ID是iOS应用程序的唯一标识符。
event_count
:指定要生成的事件数量。这个参数控制Monkey测试运行的持续时间。较高的事件数量可能会导致更长的测试时间。
random_seed
:设置随机数种子。使用相同的种子可以重现相同的随机事件序列。这对于调试和结果验证非常有用。
throttle
:控制事件之间的时间间隔(以毫秒为单位)。较小的值将导致更频繁的事件生成,而较大的值将导致较慢的事件生成。适当的节流时间可以模拟真实用户的操作速度。
event_type_probabilities
:定义各种事件类型的生成概率。可以通过调整概率分配来增加或减少特定事件类型的生成频率。例如,可以增加触摸事件的概率,以便更频繁地生成触摸操作。
ignored_alerts
:指定要忽略的系统弹窗的文本。这些弹窗可能会干扰Monkey测试的自动化流程。通过将弹窗文本添加到此列表中,可以确保它们不会中断测试。
ignored_crashes
:指定要忽略的崩溃类型。某些崩溃可能是已知的,不会影响应用程序的整体稳定性。通过将特定崩溃类型添加到此列表中,可以排除它们的影响。
blacklist_gestures
:禁用特定类型的手势事件。例如,如果你希望禁用捏合手势,可以将其添加到黑名单中。
whitelist_gestures
:仅允许特定类型的手势事件。可以通过将所需手势添加到白名单来限制生成的手势事件类型。
output_directory
:指定测试结果的输出目录。在此目录下,fastbot-iOS将生成测试报告、崩溃日志等相关文件。
这些参数可以根据具体的测试需求进行调整,以获得更好的测试覆盖率和结果分析。请注意,对于不同版本的fastbot-iOS,参数名称和用法可能会有所变化。建议查阅fastbot-iOS的官方文档或相关资源以获取最新的快速信息。
请注意,fastbot-iOS并非由苹果官方提供或支持的工具,因此它的详细参数可能因不同的实现版本而有所变化。以下是一些其他可能的fastbot-iOS参数:
rotation
:设置屏幕旋转模式。可以指定为"portrait"(纵向)或"landscape"(横向)来模拟不同的屏幕方向。
excluded_elements
:定义需要排除的UI元素。可以指定元素的标识符、类名或其他属性,以确保它们不会受到Monkey测试的影响。
network_conditions
:模拟不同的网络条件,如3G、4G、Wi-Fi等。可以设置网络延迟、带宽限制和丢包率等参数。
location
:指定模拟设备的地理位置信息。可以设置经纬度坐标来模拟特定的地理位置。
crash_reporter
:选择崩溃报告工具。可以选择将崩溃日志发送到指定的崩溃报告平台或生成本地的崩溃报告文件。
log_level
:设置日志输出级别。可以指定为"verbose"(详细信息)、"debug"(调试信息)、"info"(信息)等。
device_name
:指定要模拟的设备名称。可以选择模拟不同型号的iPhone或iPad设备。
请注意,具体的fastbot-iOS实践可能会根据实际需求和测试目标进行自定义参数设置。在使用fastbot-iOS之前,建议仔细阅读相关文档、参考示例和了解各个参数的影响,以确保正确配置和运行Monkey测试。
此外,还建议定期检查fastbot-iOS的更新和发布的新版本,以获取更多功能和改进。
假设您已经安装了fastbot-iOS,并且将其添加到系统的PATH环境变量中,以下是一个简单的示例:
fastbot-ios --bundle-id com.example.myapp --event-count 1000 --throttle 500 --random-seed 12345
在这个示例中,我们假设要测试的目标应用程序的Bundle ID是"com.example.myapp"。通过--event-count
参数设置生成1000个事件,--throttle
参数设置事件之间的时间间隔为500毫秒,--random-seed
参数设置随机数种子为12345。这样,fastbot-iOS将自动生成随机事件序列并模拟用户操作,持续运行一段时间。
请注意,这只是一个示例,具体的参数设置和值应根据您的实际需求进行调整。您可以根据fastbot-iOS的文档或指南来了解所有可用的参数以及它们的作用。
建议在运行之前仔细阅读fastbot-iOS的官方文档,了解各个参数的含义、用法和取值范围,以确保正确配置和运行测试。
对于更具体的fastbot-iOS运行指令和参数详解,我建议您参考fastbot-iOS的官方文档、GitHub存储库或相关资源,以获取最准确和最新的信息。