前文 微信小程序自动化测试——录制回放 提到录制回放 支持输入,文本查找,断言等自动化测试基础操作,无需编写代码,用例生成效率高,但是部分操作不支持,对复杂业务场景有局限性。如果用户希望适用复杂的业务场景,自主制定测试场景,可以尝试 自定义测试(Minium)方案。
小程序测试框架 Minium 是微信测试团队为小程序开发或测试同学提供的一套测试接口,它实现了miniprogram-automator 中小程序自动化所有能力,如可以直接触发小程序页面元素,设置页面数据,向 AppService 注入代码片段,Mock/Hook wx 对象的接口等。此外,他还支持并封装了所有的原生操作都进行了封装,屏蔽了 iOS/Android 底层差异,实现了一套脚本在三端同时运行。
用户写好的 Minium 脚本,可以再本地执行,也可以直接上传到微信小程序云测服务执行,无需准备和维护真机环境。下面本文介绍自定义测试的流程
一、 编写用例
编写小程序自动化测试脚本,常见操作包括:
- 基本操作:如页面跳转,元素定位及相关操作
- 处理小程序 API
- 处理小程序的原生控件,如处理授权弹窗
- 支持数据驱动测试
基本操作
对小程序页面元素定位,元素操作,或页面跳转等。简单的 UI 测试,例如以下用例
class FirstTest(minium.MiniTest):
def test_network(self):
# 页面跳转
self.app.navigate_to("/packageAPI/pages/get-network-type/get-network-type")
# 元素定位
ele = self.page.get_element("button", inner_text="获取手机网络状态")
# 元素点击
ele.click()
# 打印元素文本
self.logger.info(self.page.get_element("/page/view/view[2]/view/view[1]/text").inner_text)
处理小程序 API
Minium 框架提供处理小程序开放 API 方法,根据需求选择相应方法,例如
- mock_wx_method() — mock 掉小程序 API 的调用
- hook_wx_method() — hook 小程序 API 的调用
- call_wx_method() — 调用小程序的 API
- ...
更多接口方法参考 Minium 接口
调用小程序 API 获取回调信息用例,例如
class FirstTest(minium.MiniTest):
def test_call_wx_method(self):
"""
调用小程序API,获取回调对象
:return:
"""
sys_info = self.app.call_wx_method("getSystemInfo").get("result", {}).get("result")
self.assertIsInstance(sys_info, dict, "is dict")
self.assertTrue(True if sys_info else False, "not empty")
处理小程序原生控件
Minium 提供了针对小程序内涉及原生控件 (授权弹窗、弹窗、地图、分享小程序等) 的操作封装
注意:部分封装的接口暂不支持 IDE 平台调用。若跑测平台是 IDE,则需要在 config.json 中配置 mock_native_modal 配置项,后通过 mock 的方式实现
处理模态弹窗用例示例如下
class FirstTest(minium.MiniTest):
def test_native(self):
self.mini.clear_auth()
self.app.redirect_to("/pages/testnative/testnative")
called = threading.Semaphore(0)
callback_args = None
def callback(args):
nonlocal callback_args
called.release()
callback_args = args
# hook showModal方法,获取回调后执行callback
self.app.hook_wx_method("showModal", callback=callback)
self.page.get_element("#testModal").tap()
time.sleep(2)
# 点击弹窗 确定
self.native.handle_modal("确定")
is_called = called.acquire(timeout=10)
# 释放hook showModal方法
self.app.release_hook_wx_method("showModal")
self.assertTrue(is_called, "callback called")
self.assertDictContainsSubset( {"errMsg": "showModal:ok", "cancel": False, "confirm": True}, callback_args[0])
跑测平台 IDE,config.json
配置 mock_native_modal
示例如下
"mock_native_modal": {
"showModal": {
"title": "test modal",
"content": "modal content"
},
}
数据驱动
自动化测试往往需多组数据测试,若采用录制回放测试,则需录制多个用例,不够灵活,所以若需测试同一个用例不同组测试数据,可使用数据驱动(DDT)模式,实现测试数据与测试脚本的分离,通过 DDT 将测试数据加载到脚本中。
数据驱动(DDT)有以下优点:
- 灵活配置
- 测试数据与功能代码分开
- 易维护
下面是我们集成数据驱动测试 (基于 ddt 封装) 的例子
@minium.ddt_class
class BaseTest(minium.MiniTest):
@minium.ddt_case([], ["1", "2"])
def test_evaluate_sync(self, args):
"""
向 app Service 层注入代码 同步返回结果
:param args:
:return:
"""
# 参数 args: [] args: ["1", "2"]
result = self.app.evaluate(
"function(...args){return `test evaluate: ${args}`}", args, sync=True
)
self.assertEqual(
result.get("result", {}).get("result"), "test evaluate: {}".format(",".join(args))
)
此外,还能给具体的 test data 命名,自定义命名会体现在测试方法名中。数据驱动详情可参考 测试流程控制 & 数据驱动测试
二、 执行用例
开发者编写完 Python 用例脚本后,可本地调试,也可在云测上测试。
本地执行
开发者将编写好的用例进行本地调试,minitest 命令加载用例,初始化环境,开启自动化能力,进行环境检查,后执行用例。需 IDE 依赖,支持 USB 真机调试。
在初始化环境过程中遇到常见问题如下:
- 开发者工具没有自动打开,先排查开发者工具自动化能力,进行环境检查
- 配置了真机环境但无法拉起真机上的小程序,排查是否使用了真机调试 2.0,如果是,切换回真机调试 1.0
- 报错 traceback 中有出现 _miniClassSetUp 的调用,确认下开发者工具上选用的基础库是最新的:开发者工具项目窗口右上角 -> 详情 -> 本地设置 -> 调试基础库
Minium 为了保证同一套代码在 IDE,Android,IOS 上运行,环境组成比较复杂,所以测试用例的运行依赖于配置文件。支持配置运行平台、IDE 监听端口号、连接手机的参数、账号信息、自动处理授权弹窗等等,可参考 项目配置
执行完用例后,会生成日志文件,提供本地测试报告,包括截图、运行日志、错误日志。具体实践可参考 示例
云测服务测试
开发者可以将本地调试好的用例上传至云测,新建测试计划,新建 Minium 任务,可选择多平台真机,且支持多平台同时运行,无需用户部署和维护真机环境。
测试结束后,云测服务提供详细的测试报告,包括运行截图、日志信息,网络请求分析,性能分析等。
当用例执行失败时,会提供错误日志及错误行代码,方便用户排查错误原因。
具体操作可参考云测官方文档 自定义测试
对比
能力 | 本地执行 | 云测服务执行 |
---|---|---|
测试账号 | 可以用自己的微信账号 | 支持使用虚拟账号和自己的微信账号测试 |
真机部署 | 需要自己部署真机,安装 wda 或者 adb 环境 | 无需准备真机环境,直接提测 |
查看报告 | 需要自己搭建报告查看环境 | 提供详细的测试报告,并支持分享报告 https 链接 |
性能数据 | 需要手动调用接口获取 | 支持查看用例性能数据,如 CPU,内存占用等,可以开启体验评分,进一步查看运行时性能数据 |
Devops | 需要自己实现 | 提供第三方 https 接口提交任务,获取结果,详情参考 打通 devops 流程 |
三、 最佳实践
小程序开发者有两种,第一种是普通开发小程序,由小程序拥有者自行开发。还有一种是第三方服务商,小程序拥有者可以授权给他们代开发小程序。
对于第三方服务商测试团队来说,他们面临的情况会更加复杂。例如在明源云的测试团队中,授权给他们开发的地产开发商小程序非常多(1000+),并且每个小程序的页面数量也很多,手工测试显然无法覆盖业务需求。明源云测试同学希望可以利用自动化测试能力,解决这个问题。
如果用微信小程序自动化测试——录制回放的方案,每个页面都需要手动录制,耗时耗力。
这里他们使用了 Minium 框架编写自定义测试用例,目前已经有 90+ 用例执行。在编写用例时采用了Page Object模式(简称 PO 模式),将测试用例和页面元素定位、元素、元素操作等分离,提升用例复用性,降低维护成本。
在具体执行用例过程中,他们将云测服务和内部的 devops 流程打通,利用云测第三方接口,定时触发或者自动触发自动化任务,然后利用查询任务接口,再将测试结果同步到内部的用例管理平台,如果有问题提单给程序修复,实现整个流程闭环。
四、总结
自定义测试(Minium)的核心优点:
- 完全自主定制测试场景
- 灵活度高
- 支持数据驱动测试
- 结合云测服务,可以无需用户部署维护真机环境,并且提供详细的测试报告,并提供第三方接口方便用户打通 devops 流程
前面《微信小程序自动化测试》系列文章介绍了智能化 Monkey,录制回放测试,以及本文介绍了自定义测试(Minium),三种自动化测试能力各有优缺点,如下所示
自动化测试能力 | 优点 | 缺点 | 适应场景 |
---|---|---|---|
智能化 Monkey | 零代码,接入即用,可通过简单配置页面提供覆盖率 | 场景无法定制化;不支持输入,上传图片等复杂操作;不校验页面逻辑 | 快速冒烟测试 |
录制回放 | 零代码生成用例脚本;快速生成用例,效率高 | 部分操作不支持,如果是上传图片用例调整不如 Minium 灵活;录制和回放的环境不同,有一定概率回放失败,需要调试 | 较简单的用例,自动化回归测试 |
Minium 自定义测试 | 完全定制测试场景;灵活度高,能力全面;支持数据驱动测试(DDT) | 需要自己写 Python 脚本,有一定的学习成本 | 较复杂的用例 |