Kea2

PyPI PyPI Downloads Python Ask DeepWiki

该微信群已满员。请联系Xixian Liang,邮箱 xixian@stu.ecnu.edu.cn,并附上你的微信号或二维码以便邀请入群。

Github仓库链接

https://github.com/ecnusse/Kea2

点击此处:查看中文文档

简介

kea_logo
Kea2的Logo:一只擅长发现“bugs”的大型鹦鹉

</br>

Kea2是一个易用的移动应用模糊测试工具。其核心创新点是能够将自动化UI测试与脚本(通常由人工编写)融合,从而赋予自动化UI测试以人类智能,有效发现崩溃错误非崩溃功能(逻辑)错误

Kea2目前基于Fastbot一款工业级自动化UI测试工具)及uiautomator2一款易用且稳定的Android自动化库)进行构建。Kea2目前支持Android应用。

创新点及重要特性

对于特性 2 和 3,Kea2允许你专注于需要测试的App功能,而无需担心如何到达这些功能,只需让Fastbot帮你完成这些工作。这样你的脚本通常会编写得简短、稳健且容易维护,对应的App功能也能够得到更充分的压力测试!

Kea2三大特性的能力对比

  特性 1 特性 2 特性 3
发现崩溃错误 :+1: :+1: :+1:
发现深层状态中的崩溃错误   :+1: :+1:
发现非崩溃功能(逻辑)错误     :+1:

Kea2的用户

Kea2(及其理念)已被以下项目使用/集成:

如果你也在使用Kea2,欢迎联系我们并反馈你的意见和问题。

设计与展望

Kea2当前工作流程:

未来,Kea2计划支持:

安装

运行环境:

通过 pip 安装Kea2:

python3 -m pip install kea2-python

通过运行以下命令查看Kea2的选项:

kea2 -h

如果之前已安装Kea2,升级到最新版本:

python3 -m pip install -U kea2-python

如果你使用清华、USTC等镜像站点,可能会升级失败,因为这些站点可能尚未同步最新版本。此时可以尝试手动指定最新版本安装,或者直接使用官方源安装:pip install kea2-python -i https://pypi.org/simple

升级到指定版本(例如0.3.6):

python3 -m pip install -U kea2-python==0.3.6

快速测试

Kea2连接并运行于Android设备。建议先做快速测试以确保Kea2与你的设备兼容。

  1. 连接一台真实Android设备或Android模拟器(只需一台),并运行 adb devices 确保设备已被识别。

  2. 运行 quicktest.py ,测试示例应用 omninotes(在Kea2仓库中以 omninotes.apk 发布)。quicktest.py脚本会自动安装并短时间测试此示例应用。

在你偏好的工作目录初始化Kea2:

kea2 init

如是首次运行Kea2,此步骤是必需的。

运行快速测试:

python3 quicktest.py

若能看到应用 omninotes 成功运行并被测试,说明Kea2正常工作!
否则请协助提交错误报告,并附上错误信息。谢谢!

特性 1(运行基础版Fastbot:查找稳定性错误)

利用Fastbot的全部能力对你的App进行压力测试,查找稳定性错误(即崩溃错误);

kea2 run -s "emulator-5554" -p it.feio.android.omninotes.alpha --agent native --running-minutes 10 --throttle 200

如需了解各选项含义,请参见我们的手册

使用方式与原始Fastbot的shell命令相似。

查看更多选项请使用:

kea2 run -h

特性 2(运行增强版Fastbot:自定义测试场景\事件序列\黑白控件)

在运行Fastbot等自动化UI测试工具测试你的App时,你可能会发现某些特定UI页面或功能难以到达或被覆盖,原因是Fastbot对你的App缺乏了解。令人欣慰的是,脚本测试擅长解决此类问题。特性 2 中,Kea2支持编写小脚本来指导Fastbot探索我们期望的任意页面,也能使用类似的小脚本在测试过程中屏蔽特定控件。

在Kea2中,一个脚本包含两部分:

简单示例

假设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()

你可以在脚本文件quicktest.py中找到完整示例,使用命令 kea2 run 在Fastbot上执行此脚本:

# 启动Kea2并加载单个脚本 quicktest.py。
kea2 run -s "emulator-5554" -p it.feio.android.omninotes.alpha --agent u2 --running-minutes 10 --throttle 200 --driver-name d unittest discover -p quicktest.py

特性 3(运行增强版Fastbot:加入自动断言)

Kea2支持在运行Fastbot时自动断言,用以发现逻辑错误(即非崩溃错误)。为此,你可以在脚本中添加断言。断言失败时,即发现了可能的功能性错误。

特性 3 的脚本包含三部分:

示例

在一个社交应用中,消息发送是常见功能。在消息发送页面,当输入框不为空(即有输入内容)时,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/目录下)。

如果自动生成失败,也可以手动使用命令 kea2 report -p '测试数据所在文件夹路径' 来生成测试报告。

测试报告支持单次测试运行和多次测试会话的合并分析,方便跟踪测试进度和定位问题。

更多文档

你可以查阅用户手册,包含:

部分Kea/Kea2相关博客(中文):

工业界对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跑路。 hea2做了什么: 替换了FB的条件触发功能。 替换了FB的黑名单,黑控件功能。 替换了FB剪枝功能。 增加了多元化的元素空间操作能力。 增加了fuzz测试中的 逻辑设定。 增加了断言能力。 增加了元素操作能力。

Kea2使用的开源项目

Kea2相关论文

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

维护者/贡献者

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)、华为、小米等多方支持,致敬!

Star历史

Star History Chart

  1. 不少UI自动化测试工具提供了“自定义事件序列”能力(如FastbotAppCrawler),但在实际使用中存在不少问题,如自定义能力有限、使用不灵活等。此前不少Fastbot用户抱怨过其“自定义事件序列”在使用中的问题,如#209, #225, #286等。 

  2. 在UI自动化测试过程中支持自动断言是一个很重要的能力,但几乎没有测试工具提供这样的能力。我们注意到AppCrawler的开发者曾经希望提供一种断言机制,得到了用户的热切响应,不少用户从21年就开始催更,但始终未能实现。