- 小程序自动化实践方案总结:Minium + 云测
本文旨在为大家在着手做小程序自动化前提供参考,少踩坑。里面不会涉及细节的实践操作,主要讲解流程让大家对小程序自动化有个整体的印象。本文中存在的不足还望指出,多谢~😄 背景:由于每次迭代我们需要手动进行大量小程序用例回归,其中很多都是简单的组件操作,为了提升回归效率将更多的人力放在复杂场景回归和探索式测试中,因此希望通过小程序自动化来实现简单场景的回归用例。 要进行小程序自动化落地,需要先对下面2点进行了解: 全方位了解微信官方提供的小程序自动化能力的特点(云测、录制回放、Minium、虚拟账号)熟悉自己项目小程序的特性:是否支持一键登录、项目代码编译后元素class属性值是否会变、自己的公司是否是第三方服务商在了解小程序自动化能力之后,结合自己小程序特性,选择合适的方案进行落地。 下面陆续讲述的内容会涉及上面2点。 一、小程序自动化能力简介 1、云测整体流程 云测平台可以基于你上传的用例创建相应的测试计划,然后选择小程序不同版本(开发版、体验版、线上版)、手机系统类型(安卓和ios)、测试账号等根据测试计划创建任务,跑测完毕可以通过短信和邮件通知测试结果。 [图片] [图片] 2、录制回放 如果想要把录制回放的用例上传到云测,必须使用虚拟账号进行录制。这里有篇腾讯团队内部实践的文章。 3、Minium 要进行Minium用例编写,前提是搭建好小程序开发环境,这个可以询问自己项目组的前端开发。下图是以我们组内实践为例画的流程图,让大家对如何运行Minium脚本有个概念。图内的切换小程序,若你们不是第三方服务商则不涉及;云盾是我们公司的用例管理执行平台,同理也可以替换为你们自己的用例平台,将跑测完的结果同步到用例平台。 编写用例也是采用的PO模式,在微信开发中工具上进行元素定位,整体思路与写web自动化差异不大,这里可以参考有赞的文章,就不赘述了。 特别注意:若使用的是wxss选择器定位元素,一定要确认元素的class属性值会不会在每次编译小程序的时候发生改变,若会的话强烈建议使用xpath进行定位。 [图片] 4、虚拟账号 虚拟账号常用在录制回放和云测跑测试任务的时候。 若小程序必须登录才能使用,且符合截图中标记的这3项之一,就不能通过云测平台来跑自己录制或编写的用例了。 [图片] 5、持续集成 目前提供了在云测平台创建测试任务和获取测试任务结果的接口,所以可以搭配jenkins使用。举个例子:调用接口创建测试任务----调用接口查询任务结果----将结果同步到用例平台或定制化测试结果邮件 二、方案选择 1、3种自动化方式对比 [图片] 2、方案选择 [图片] 页面多少决定选择录制还是minium,是否适用虚拟账号决定能否用云测,用例执行时间决定本地还是云测运行更方便(当然全部跑本地也行啊~) 选择云测平台跑测的一个好处是基于真机去跑,据了解后面可能会支持付费选择手机机型和付费增加跑测时间。还有一点就是不用自己去倒腾本地配置真机运行(😂我现在都还没实践本地真机运行)。 3、举我们产品这个例子 我们作为小程序服务提供商小程序页面有上百个,绝大多数场景对账号没有要求,落地方案是:minium+云测。 所以每次迭代发布,只需运行一下测试任务的脚本便可坐等测试结果就好。 三、基于项目编写Minium用例 1、目录结构 [图片] 2、用例编写流程 若小程序页面不是非配置化的,可以省去配置这一步;若不需要同步测试结果到用例平台,可以省去最后一步。 [图片] 3、基于下面这个页面编写用例,步骤如下。 分别在page、logic、case目录下,分别创建allHouseListPage、AllHouseListLogic、AllHouseListCaseAllHouseListPage继承BasePage类,编写页面中各个组件的元素定位和操作方法AllHouseListLogic编写操作流程AllHouseListCase继承minium.MiniTest类,因为是固定在该页面执行用例,每个组件操作的前置步骤都是先进入该页面,所以在setUp里面添加进入该页面的前置操作(举一反三,其它页面的case的前置操作也是如此)。[图片] 4、tips 页面跳转后最好多用wait_for等待元素加载完,不然用例出现找不到元素的报错定位的元素必须绑定了事件,才能触发操作不熟悉怎么写的时候,可以先通过录制脚本同步到云测平台后,查看录制脚本进行参考 四、快速Monkey 只有服务商才有快速Monkey入口,这个我目前用的少,个人见解是每次有小的改动发了bg分支时,可以挑选一些流量大的甲方爸爸小程序进行冒烟测试。
2022-08-08 - 【微盟】利用 jupyter-notebook 提升编写用例效率
作者|微盟-王保军 背景 微盟集团成立于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云真机,无需本地维护真机,且每周都有赠送免费测试时长,基本满足测试需求。 从POM开始设计自动化case 无论是小程序的UI测试亦或是Web UI, 本质都可以将业务流程与页面元素操作分离,这将使得测试代码变得更加清晰。页面对象模型将页面抽象为一个对象(一个类), 页面的元素以及操作分别抽象为对象的属性和方法,与case机型分离,case的流程编写更像是搭积木,页面的方法就是你的积木块。 完整的示例代码下载可前往 : https://git.weixin.qq.com/minitest_best_practices/weimeng 页面示例 例如微盟小程序中一个商品列表页面,有如下功能: [图片] 获取元素 我们将页面中这些元素分别通过微信开发者工具获取其选择器,如要获取搜索框的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以及参数编译小程序打开页面 [图片] jupyter-notebook怎么用于case调试 借助jupyter-notebook进行交互式调试页面元素&方法,这个过程就变得极其简单了: 安装jupyter-notebook: pip install jupyter在终端项目路径下打开jupyter-notebook:[图片] 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会打开小程序: [图片] 5.通过手动在微信ide执行前置下单流程,让页面跳转到发票添加页面 a. 获取发票类型选项元素:class选择器 value:sinvoceSelecttem [图片] b. 在jupyter-notebook中调试: [图片] c. 调试一个方法 switch_invoice_type,可见调试代码运行后元素发票类型已经更改为”增值税专用发票“: [图片] 持续集成 云测服务提供了可视化的操作平台,但是受限于项目成员登录权限问题(如AppID开发者权限仅部分人员被添加),此外为了简化创建任务成本,我们通过云测服务提供的 第三方接口,在内部测试平台实现了简化版本的任务管理功能,解决账号限制的使用问题 [图片] [图片] 此外还打通微盟内部小程序发布平台与灰度平台,实现了自感知版本变更的任务自动触发,以及报告通知到企微: [图片] 小程序自动化成果 截止目前已完成: 1. 小程序页面覆盖数达到49个; 2. 覆盖C端业务场景数:142+; 3. case稳定性到通过率97%+; 4. 小程序发版上线代替人工值守回归验证; 5. 发现有效bug 46 个 附录: 1、 微盟自动化测试代码示例下载:https://git.weixin.qq.com/minitest_best_practices/weimeng 2、 Minium文档:小程序云测-MiniTest 3、 小程序云测服务官方文档:MiniTest 小程序云测服务简介 | 微信开放文档
2024-07-24 - 小程序云测入门
MiniTest 小程序云测是一套由微信测试团队自主研发,联合WeTest云真机能力,共同推出的小程序自动化测试服务。服务基于云真机,支持开发者简单快捷地实现小程序真机自动化测试和性能分析等能力。
2024-12-20