背景
微盟集团成立于2013年,是业内领先的小程序第三方服务商,致力于为商家打造去中心化的数字化转型SaaS产品及全链路增长服务,助力商家经营可持续增长。
目前授权微盟开发的的小程序多达10万多个。保证这么多小程序的质量,依赖手动测试显然无法覆盖众多情况。
微盟电商零售团队在小程序自动化方向做了调研与探索,从行业调查,选型分析等过程中选定了微信测试团队开发的 Minium测试框架 和 小程序云测服务。
本文将结合微盟的实际业务需求与小程序自动化在业界的实践经验进行分析,阐述电商零售小程序使用Minium+云测服务落地实践。
技术选型
多年来,针对小程序的自动化测试框架、工具一直处于半真空地带,业界主流的落地方案分为:
- Appium,AirTest,UiAutomator2等app测试思路
- miniprogram,MiniTest(minium)这种官方提供的测试框架;
我们调研后对各框架在小程序测试方面的适用性与优缺点进行分析对比:
为什么选择Minium?
- 微盟作为小程序服务商,管理的小程序也是千店千面,不同小程序的页面组件,样式都是完全不同的,这就使得图像识别的AirTest先被排除;
- 另外我们需要在渲染层之外对逻辑层就行测试,例如接口mock,js注入,获取页面JsonData,Storage等需求是appium等基于Chrome DevTools Protocol的测试方案所不具备的;
- Minium支持Python进行case开发,与现有的UI自动化与接口自动化技术栈匹配,可降低学习开发成本;
- 微信测试团队提供了一套可视化测试平台--小程序云测服务,方便了case管理,任务创建,报告查看和分享。最重要的是,云测服务提供的丰富WeTest云真机,无需本地维护真机,且每周针对服务商有1000分钟的免费时长,基本满足测试需求。
从POM开始设计自动化case
无论是小程序的UI测试亦或是Web UI, 本质都可以将业务流程与页面元素操作分离,这将使得测试代码变得更加清晰。页面对象模型将页面抽象为一个对象(一个类), 页面的元素以及操作分别抽象为对象的属性和方法,与case机型分离,case的流程编写更像是搭积木,页面的方法就是你的积木块。
完整的示例代码下载可前往 : 微信开发者代码管理
页面示例
例如微盟小程序中一个商品列表页面,有如下功能:
获取元素
我们将页面中这些元素分别通过微信开发者工具获取其选择器,如要获取搜索框的selector:
这里我们看到在input框之外存在#shadow-root(shadow-dom 其实是浏览器的一种能力,它允许在浏览器渲染文档(document)的时候向其中的 Dom 结构中插入一棵 DOM 元素子树,但是特殊的是,这棵子树(shadow-dom)并不在主 DOM 树中),是因为ti-input是一个自定义组件,我们就需要用到跨自定义组件的后代选择器,最终selector为:'ti-input >>> input'
我们在元素选择器中大量使用了class与标签选择器,尽可能避免使用xpath,一方面在于xpath非常容易受到业务更新的影响而导致失效,另一方面在于微盟小程序统一使用了自研UI组件库:Titian,实现了页面元素的标与统一。
实现对页面对象模型
可参考商品页面示例代码 goods_list_page.py
这里完成了一个商品列表页面的抽象模型,后续如果新的元素以及操作新增,只需要在class中补齐selector选择器以及操作方法即可
抽象页面基类
由于很多操作在不同页面会有相同的,所以需要抽出来作为公共方法,放在base_page里面,这样做的好处是一次定义多次复用,如指定页面跳转,滚动,等待页面加载完成,自定义授权等。
页面通用方法示例代码 base_page.py
编写case
测试商品列表功能页面的用例 ,可参考代码 test_demo.py
查看运行效果
微盟运行效果
POM结构图
随着页面与case越来越多,可组合性也就越多,我们大致可以得出如下图所示的case平面图,还可以拓展出数据驱动以及接口调用等模块完善case测功能验证点。
详细示例代码,可参考附录的Git地址。
使用jupyter-notebook辅助调试case
在case的实际编写过程中,如何高效的定位元素以及调试case对工作效率的的提升至关重要。试想一下,我现在需要订单创建页面的发票信息进行新增,那从小程序启动到发票信息添加页面我至少需要经历如下页面切换流程:
如此想要调试发票信息页面相关元素与方法,就需要case先运行创建订单以及之前的步骤流程,调试一个元素或者方法运行一次,调试成本极高。
为什么不能指定path¶ms编译
由于页面的特殊性,需要对下单时生成的页面参数orderKey进行检查,所以不允许直接通过指定path以及参数编译小程序打开页面
![](https://i-blog.csdnimg.cn/blog_migrate/b0013b40792e082652cd7b32f8874dc3.png)
jupyter-notebook怎么用于case调试
借助jupyter-notebook进行交互式调试页面元素&方法,这个过程就变得极其简单了:
- 安装jupyter-notebook: pip install jupyter
- 在终端项目路径下打开jupyter-notebook:
![](https://i-blog.csdnimg.cn/blog_migrate/0674e2758eef10266e6769375f77aa15.png)
3. 浏览器会自动打开项目目录
a. 自己新建一个notebook文件
b. 从config.json中提取出关键信息,并赋值给minium.WXMinium的conf参数
import minium
# native = minium.Native({"serial": "f3054355"}, "Android")
native = minium.Native({}, "ide")
mini = minium.WXMinium(conf={
"debug_mode": "debug",
"enable_app_log": False,
"platform": "ide",
"wda_project_path": "/Users/baojunw/wda/node_modules/appium/node_modules/appium-webdriveragent",
"device_desire": {
"serial": "f3054355"
},
"remote_connect_timeout": 1200,
"project_path": "/Users/baojunw/Desktop/v1.1.76-20230823",
"dev_tool_path": "/Applications/wechatwebdevtools.app/Contents/MacOS/cli",
"auto_authorize": False,
"enable_network_panel": True,
"assert_capture": True,
}, native=native)
4. 接着我们光标选中代码快运行一下,ide会打开小程序:
![](https://i-blog.csdnimg.cn/blog_migrate/9ebf7b7a821d7703d03237c1cfb983da.png)
5.通过手动在微信ide执行前置下单流程,让页面跳转到发票添加页面
a. 获取发票类型选项元素:class选择器 value:sinvoceSelecttem
![](https://i-blog.csdnimg.cn/blog_migrate/fc6d3f5f508c0e324b2d1b87bd3b646a.png)
b. 在jupyter-notebook中调试:
c. 调试一个方法 switch_invoice_type,可见调试代码运行后元素发票类型已经更改为”增值税专用发票“:
![](https://i-blog.csdnimg.cn/blog_migrate/2d5f31e3a8cc8b205d331c2a67ee09c8.png)
持续集成
云测服务提供了可视化的操作平台,但是受限于项目成员登录权限问题(如AppID开发者权限仅部分人员被添加),此外为了简化创建任务成本,我们通过云测服务提供的 第三方接口,在内部测试平台实现了简化版本的任务管理功能,解决账号限制的使用问题
![](https://i-blog.csdnimg.cn/blog_migrate/58800a2032d561683797b49d449dbce9.png)
此外还打通微盟内部小程序发布平台与灰度平台,实现了自感知版本变更的任务自动触发,以及报告通知到企微:
![](https://i-blog.csdnimg.cn/blog_migrate/3be631b80f45add84b2f2a5f7a5bfc52.png)
小程序自动化成果
截止目前已完成:
1. 小程序页面覆盖数达到49个;
2. 覆盖C端业务场景数:142+;
3. case稳定性到通过率97%+;
4. 小程序发版上线代替人工值守回归验证;
5. 发现有效bug 46 个
附录:
1、 微盟自动化测试代码示例下载:登录 - 微信开发者代码管理
2、 Minium文档:小程序云测-MiniTest
3、 小程序云测服务官方文档:MiniTest 小程序云测服务简介 | 微信开放文档