Kea2是一个易用的移动应用模糊测试工具。其核心创新点是能够融合自动化UI测试与脚本(通常由人工编写),从而赋能自动化UI测试以人类智能,有效发现崩溃错误及非崩溃功能(逻辑)错误。
Kea2目前基于Fastbot 3.0(原始FastBot 2.0的修改和增强版本,字节跳动工业级自动化UI测试工具)及uiautomator2(一款易用且稳定的Android自动化库)构建。
Kea2目前支持Android应用。
Kea2_demo.mp4
-
特性 1(查找稳定性问题):集成了Fastbot的全部能力,用于压力测试和查找稳定性问题(即崩溃错误);
-
特性 2(自定义测试场景\事件序列\黑白名单\黑白控件1):运行Fastbot时可自定义测试场景(例如测试特定的App功能、执行特定的事件序列、进入指定UI页面、达到特定App状态、将指定Activity/UI控件/UI区域加入黑名单),并且在python脚本语言和uiautomator2驱动的支持下,这些自定义功能具有高度可用性和灵活性;
-
特性 3(支持断言机制2):在运行Fastbot时支持自动断言,来源于Kea的基于性质的测试理念,用于发现逻辑错误(即非崩溃功能性错误)。
对于特性 2 和 3,Kea2允许你专注于需要测试的App功能,而无需担心如何到达这些功能,只需让Fastbot帮你完成这些工作。这样你的脚本通常会编写得简短、稳健且容易维护,对应的App功能也能够得到更充分的压力测试!
Kea2三大特性的能力对比
| 特性 1 | 特性 2 | 特性 3 | |
|---|---|---|---|
| 发现崩溃错误 | 👍 | 👍 | 👍 |
| 发现深层状态中的崩溃错误 | 👍 | 👍 | |
| 发现非崩溃功能(逻辑)错误 | 👍 |
Kea2(及其理念)已被以下用户/项目使用或集成:
-
OPay Business --- 一款金融支付App(每日活跃用户2000万)。OPay使用Kea2对POS机和移动设备进行回归测试。
-
WeChat's iExplorer --- 微信内部测试平台(带有交互式UI工具以简化脚本编写)
-
WeChat Payment's UAT --- 微信支付内部测试平台(通过从系统规格综合性质实现全自动基于性质的测试)
-
DevEco Testing --- 华为HarmonyOS官方测试平台(Kea2基于Hypium构建)
如果你也在使用Kea2,欢迎联系我们并反馈你的意见和问题。
Kea2当前工作流程基于3个开源项目:
- unittest 作为测试框架管理脚本;
- uiautomator2 作为UI测试驱动;
- Fastbot 作为后端自动化UI测试工具。
Kea2的若干关键特性受到**Hypothesis**(Python基于性质的测试框架)的启发。
未来,Kea2计划支持:
运行环境:
- 支持Windows、MacOS和Linux
- python 3.8+,Android 5.0~16.0(已安装Android SDK)
- 关闭本机代理对
localhost的影响(部分 VPN/代理会影响 u2)。可将localhost加入直连白名单,或临时关闭 VPN。(特性 2 与 3 必需)
通过 pip 安装Kea2:
python3 -m pip install kea2-python通过运行以下命令查看Kea2的选项:
kea2 -h如果之前已安装Kea2,升级到最新版本:
python3 -m pip install -U kea2-python如果你使用清华、USTC等镜像站点,可能会升级失败,因为这些站点可能尚未同步最新版本。此时,你可以尝试手动指定最新版本安装,或直接使用官方PyPI源:
pip install kea2-python -i https://pypi.org/simple。
升级到指定版本(例如1.0.0):
python3 -m pip install -U kea2-python==1.0.0在你偏好的工作目录初始化Kea2:
kea2 init如果是首次运行Kea2,此步骤必需。升级后也建议重新执行此步骤,以确保新配置生效。
Kea2连接并运行于Android设备。建议先做快速测试以确保Kea2与你的设备兼容。
-
连接一台真实Android设备或Android模拟器,并运行
adb devices确认设备已被识别。 -
运行
quicktest.py测试示例应用omninotes(在Kea2仓库中以omninotes.apk发布)。quicktest.py脚本会自动安装并短时间测试此示例应用。
运行快速测试:
python3 quicktest.py快速测试会自动下载
omninotes.apk。如果下载失败,请从Kea2仓库根目录复制omninotes.apk到当前工作目录,再次执行快速测试命令。
若能看到应用 omninotes 成功运行并被测试,说明Kea2正常工作!
否则请协助提交错误报告,并附上错误信息。谢谢!
利用Fastbot的全部能力对你的App进行压力测试,查找稳定性错误(即崩溃错误); 同时,你可以获得由Kea2提供的测试报告,了解测试过程中的App行为和发现的错误。
kea2 run -p it.feio.android.omninotes.alpha --running-minutes 10如需了解各选项含义,请参见我们的用户手册。
使用方式与原始Fastbot的shell命令相似。
查看更多选项请使用:
kea2 run -h在运行Fastbot等自动化UI测试工具测试你的App时,你可能会发现某些特定UI页面或功能难以到达或被覆盖,原因是Fastbot对你的App缺乏了解。令人欣慰的是,脚本测试擅长解决此类问题。特性 2 中,Kea2支持编写小脚本来指导Fastbot探索我们期望的任意页面,也能使用类似的小脚本在测试过程中屏蔽特定控件。
在Kea2中,一个脚本包含两部分:
- 前置条件(precondition): 指定何时执行脚本。
- 交互场景: 脚本中各个测试方法指定的交互逻辑,用以到达预期位置。
假设Privacy是一个在自动化UI测试中难以到达的页面,而Kea2可以轻松指导Fastbot进入此页面。
@prob(0.5)
# precondition: 当处于页面 `Home`
@precondition(lambda self:
self.d(text="Home").exists
)
def test_goToPrivacy(self):
"""
通过打开`Drawer`,点击`Settings`选项,再点击`Privacy`来引导Fastbot进入`Privacy`页面。
"""
self.d(description="Drawer").click()
self.d(text="Settings").click()
self.d(text="Privacy").click()- 通过装饰器
@precondition指定前置条件——当处于Home页面。
此处Home页面是Privacy页面的入口,且Fastbot能轻松到达Home页面。脚本将在处于Home页面时被激活,这是借助于唯一控件Home是否存在来检测的。 - 在脚本的测试方法
test_goToPrivacy中,指定交互逻辑(打开Drawer,点击Settings,点击Privacy)来引导Fastbot进入Privacy页面。 - 使用装饰器
@prob指定概率(本例中为50%),当处于Home页面时有50%的概率进行引导,从而允许Fastbot仍有机会探索其它页面。
你可以在脚本文件quicktest.py中找到完整示例,使用命令 kea2 run 在Fastbot上执行此脚本:
# 启动Kea2并加载单个脚本 quicktest.py。
kea2 run -p it.feio.android.omninotes.alpha --running-minutes 10 propertytest discover -p quicktest.pyKea2支持在运行Fastbot时自动断言,用以发现逻辑错误(即非崩溃错误)。为此,你可以在脚本中添加断言。断言失败时,即发现了可能的功能性错误。
特性 3 的脚本包含三部分:
- 前置条件(precondition): 何时执行脚本。
- 交互场景: 脚本测试方法中的交互逻辑。
- 断言(Assertion): 预期的App行为。
在一个社交应用中,消息发送是常见功能。在消息发送页面,当输入框不为空(即有输入内容)时,send按钮应始终出现。
针对上述一直应保持的性质,可编写以下脚本验证功能正确性:当消息发送页有input_box控件时,输入任意非空字符串后,断言send_button控件应始终存在。
@precondition(
lambda self: self.d(description="input_box").exists
)
def test_input_box(self):
# 生成一个随机非空字符串(这也是基于性质的测试,通过输入随机文本!)
from hypothesis.strategies import text, ascii_letters
random_str = text(alphabet=ascii_letters).example()
# 将该非空字符串输入到输入框
self.d(description="input_box").set_text(random_str)
# 检查发送按钮是否存在
assert self.d(description="send_button").exists
# 我们甚至可以做更多断言,例如,
# 输入字符串应成功显示在消息发送页面上
assert self.d(text=random_str).exists这里使用了hypothesis生成随机文本。
你可以用类似特性 2 的命令行运行此示例。
Kea2会在每次测试结束后自动生成HTML格式的测试报告。你可以在当前工作目录下的output/目录中找到报告。
- 单次测试报告 - 由Opay提供。
- 合并测试报告(多次运行) - 多次运行的汇总。
更多测试报告详情请参见文档。
Please see the user manual for more details on how to use Kea2.
请查看用户手册以获取更多Kea2的详细文档。
- 功能性质驱动的测试技术:下一代GUI自动化测试技术 - 视频回放与 PPT @ MTSC 2025
- 2025 Let’s GoSSIP 软件安全暑期学校:Kea2(预告 #1)
工业界对Kea2的理解和评价(点击箭头查看详情):
Kea2的性质是什么含义?Kea2意义和价值是什么?
kea2 其实是一个工具,它是python+u2+fastbot的集合体。 它本身更像是一台装好了发动机和轮子的汽车底盘。
性质是苏老师他们团队提出的一个概念, 转换到测试领域的实际工作中,性质对应的是最小单位的功能(原子级功能),性质的依赖条件很少或没有,它可以自身运行。一个典型的性质就是登录,它仅仅具有输入用户名,输入密码,提交。再举个例子,给视频点个赞,也就是简单的两三步。就是一个性质。
性质与kea2结合的意义是在于解决过去使用appium过重的问题。用appium去测试一个性质通常要写很多行的代码,引导界面到达性质的位置。但使用kea2,就只需要编写性质,如何到其所在的位置是交给fastbot和它的学习算法来搞定的。
kea2另个重大的价值是,它解决了上述思想所需要的技术支撑,比appium更轻量的UI编写方式,fastbot编写性质的能力不足,以及无法编写逻辑和断言。整体上是保留了fastbot以往的优秀品质,完善了其不足和短板。
简而言之,需要做传统的编排型的功能测试,仍然使用appium,使用kea2也行,但你感觉不到它的价值。本身有需要做混沌测试,模糊测试,兼容性测试。那么强烈,强烈推荐kea2。kea2更偏探索性测试而非编排型。
kea2组成是什么?kea2的核心作用?kea2做了什么?
kea2 组成:
fastbot -- fuzz测试引擎,负责跑路。
u2 -- 负责进行业务空间的操作。与使用selenium,appium,没什么区别。
python -- u2的操作,逻辑的编写,定制化的实现。
kea2的核心作用:
提供了条件触发器。 在FB跑路的时候,会不停遍历条件触发器,一旦触发,挂起FB,开始执行触发器指定的 ui test 及 assert。执行完毕,继续切回FB跑路。
kea2做了什么:
替换了FB的条件触发功能。
替换了FB的黑名单,黑控件功能。
替换了FB剪枝功能。
增加了多元化的元素空间操作能力。
增加了fuzz测试中的 逻辑设定。
增加了断言能力。
增加了元素操作能力。
General and Practical Property-based Testing for Android Apps. ASE 2024. pdf
An Empirical Study of Functional Bugs in Android Apps. ISSTA 2023. pdf
Fastbot2: Reusable Automated Model-based GUI Testing for Android Enhanced by Reinforcement Learning. ASE 2022. pdf
Guided, Stochastic Model-Based GUI Testing of Android Apps. ESEC/FSE 2017. pdf
请联系梁希贤,邮箱 xixian@stu.ecnu.edu.cn,并附上你的微信号或二维码,以便邀请加入微信群。
当然,我们也在GitHub上随时欢迎你的问题和反馈。
Kea2由ecnusse团队积极开发与维护:
Zhendong Su, Yiheng Xiong, Xiangchen Shen, Mengqian Xu, Haiying Sun, Jingling Sun, Jue Wang, Geguang Pu也积极参与并对项目贡献良多!
Kea2还获得多位工业界专家的宝贵建议和经验分享,感谢字节跳动(Zhao Zhang、Fastbot团队的Yuhui Su)、OPay(Tiesong Liu)、微信(Haochuan Lu,Yuetang Deng)、华为、小米等多方支持,致敬!
Kea2是一个开源项目,欢迎更多贡献者加入!
详情请参见开发者指南。
Footnotes
-
不少UI自动化测试工具提供了“自定义事件序列”能力(如Fastbot 和AppCrawler),但在实际使用中存在不少问题,如自定义能力有限、使用不灵活等。此前不少Fastbot用户抱怨过其“自定义事件序列”在使用中的问题,如#209, #225, #286等。 ↩
-
在UI自动化测试过程中支持自动断言是一个很重要的能力,但几乎没有测试工具提供这样的能力。我们注意到AppCrawler的开发者曾经希望提供一种断言机制,得到了用户的热切响应,不少用户从21年就开始催更,但始终未能实现。 ↩








