Skip to content

Latest commit

 

History

History
374 lines (239 loc) · 19.6 KB

File metadata and controls

374 lines (239 loc) · 19.6 KB

简介

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的用户

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

OPay Huawei WeChat Pay WeChat

  • OPay Business --- 一款金融支付App(每日活跃用户2000万)。OPay使用Kea2对POS机和移动设备进行回归测试。

  • WeChat's iExplorer --- 微信内部测试平台(带有交互式UI工具以简化脚本编写)

  • WeChat Payment's UAT --- 微信支付内部测试平台(通过从系统规格综合性质实现全自动基于性质的测试)

  • DevEco Testing --- 华为HarmonyOS官方测试平台(Kea2基于Hypium构建)

  • ByteDance's Fastbot

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

设计与展望

Kea2当前工作流程基于3个开源项目:

Kea2的若干关键特性受到**Hypothesis**(Python基于性质的测试框架)的启发。

未来,Kea2计划支持:

  • pytest,另一款流行的Python测试框架;
  • AppiumHypium(针对HarmonyOS/Open Harmony);
  • 其他任何自动化UI测试工具(不限于Fastbot)

安装

运行环境:

  • 支持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与你的设备兼容。

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

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

运行快速测试:

python3 quicktest.py

快速测试会自动下载 omninotes.apk。如果下载失败,请从Kea2仓库根目录复制 omninotes.apk 到当前工作目录,再次执行快速测试命令。

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

特性 1(运行基础版Fastbot:查找稳定性错误并获得 kea2 测试报告)

利用Fastbot的全部能力对你的App进行压力测试,查找稳定性错误(即崩溃错误); 同时,你可以获得由Kea2提供的测试报告,了解测试过程中的App行为和发现的错误。

kea2 run -p it.feio.android.omninotes.alpha --running-minutes 10

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

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

查看更多选项请使用:

kea2 run -h

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

在运行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.py

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

Kea2支持在运行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/目录中找到报告。

测试报告示例

更多测试报告详情请参见文档

📘 User Manual (用户手册)

Please see the user manual for more details on how to use Kea2.

请查看用户手册以获取更多Kea2的详细文档。

📣 News & Media

工业界对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测试中的 逻辑设定。
增加了断言能力。
增加了元素操作能力。

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

联系我们

请联系梁希贤,邮箱 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是一个开源项目,欢迎更多贡献者加入!

详情请参见开发者指南

Star历史

Star History Chart

Footnotes

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

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