评论

微信小程序UI自动化调研&minium的环境搭建和最佳实践

探索及调研并应用minium框架搭建小程序UI自动化框架

一、UI自动化背景

1.1、UI自动化测试介绍

UI自动化测试是一种基于用户界面的自动化测试技术,它通过模拟用户操作来测试软件的界面功能是否正常。以代码方式实现自动操作和验证的一种自动化测试手段。

与传统的单元测试和接口测试不同,UI自动化测试更关注用户实际使用软件的体验。

UI自动化,按照平台分类,主要分为Web端和App端。


Web:以Selenium驱动WebUI的自动化测试为主流

App:以Appium、Airtest等驱动App的自动化测试为主流

关于小程序的自动化测试,区别于常规的平台。

1.2、UI自动化测试的时机

按照测试金字塔的模型来看,对于不同层面的测试,需要不同形态的测试方法来保证其质量。

当我们的项目处于以下情况下的时候,UI自动化测试就显得尤为重要:

  • 需求相对稳定
  • 重复任务较多
  • 项目开发周期长

二、UI自动化测试方案选型

1.1、微信小程序架构

小程序分为Android、iOS、开发者工具(调试平台)三个平台。自下而上,分为渲染层(Render)、逻辑层(Logic)、视图层(View)。微信针对对于不同平台,采用了不同渲染机制和逻辑处理机制,生成统一的视图(WXML+WXSS)。

微信追求高度统一的跨平台体验,所以给UI自动化统一的测试方案提供了必要的前提。

同时由于平台的差异,也会在不同平台存在一定差异。所以UI自动化测试,多平台真机测试也显得格外重要。

1.2、微信小程序自动化技术选型

由于小程序生态方面的原因,小程序的UI自动化的自动化框架选择较少。目前有Appium、Airtest、Minium三大主流框架。

1.2.1、Appium

Appium是一个开源工具,用于自动化测试iOS手机、Android手机和Windows桌面平台上的原生、移动 Web和混合应用。它使用了各系统自带的自动化框架,无需SDK集成,Appium把这些系统本身提供的框架包装进一套API->WebDriver API中,可以使用任何语言编写Client脚本向服务器发送适当的HTTP请求。这让不同技术栈的人员都能快速上手编写测试用例。但是Appium对小程序支持的不太好,元素定位准确度还处于较低水平。

1.2.2、Airtest

Airtest Project是由网易游戏推出的一款自动化测试平台,除了支持通过系统自带的自动化测试框架(POCO),还支持了通过图像识别的方式,对于非基于原生UI系统的一些游戏引擎提供了SDK的支持。其上手难度稍低,可以一定程度上通过IDE进行相关操作来生成简单的脚本指令。Airtest虽然基于图像进行控件识别,为跨端提供了一定的可能性,然而图像识别并不能达到人眼识别的准确度,页面元素的展示规则和样式受屏幕分辨率影响较大,单纯依靠图像识别来进行元素查找成功率不高,无法保证测试的准确性。

2.2.3、Minium(MiniTest)

Minium是腾讯微信官方提供的自动化测试的框架,但是 minium 的功能不止于仅仅是 UI 自动化, 甚至可以使用 minium 来进行函数的 mock, 可以直接跳转到小程序某个页面并设置页面数据, 做针对性的全面测试, 这些都得益于腾讯开放了部分小程序 API 的能力。

  • 支持一套脚本,iOS & Android & 模拟器,三端运行
  • 提供丰富的页面跳转方式,看不到也能去得到
  • 提供丰富的元素定位方式。
  • 可以获取和设置小程序页面数据,让测试不止点点点
  • 可以直接触发小程序元素绑定事件
  • 支持往 AppSerive 注入代码片段执行
  • 可以调用部分 wx 对象上的接口
  • 支持 Mock wx 对象上的接口
  • 支持 Hook wx 对象上的接口
  • 通过 suite 方式管理用例,config 管理运行设备
  • etc...

2.2.4、对比总结

对于小程序自动化测试来说,Appium和Airtest为三方的自动化框架,没有微信官方的支持,所以无法深入小程序逻辑层,只能作用于渲染层,从另外一个角度来说,这两个框架还属于黑盒自动化测试的范畴。

但是Minium为微信官方支持,且可以深入到微信Api内部做相关测试。这意味着Minium不仅可以作用于渲染层,还可以作用于逻辑层。这样为自动化测试提供了非常全面的功能性测试范围。

minium的支持情况/方案:

  • 脚本语言:python、JavaScript
  • 是否开源:是
  • 平台支持:ios真机、Android真机、开发者工具模拟器
  • 多设备运行:支持
  • 上手难度:容易,基于unittest衍生minitest,上手容易会用例即可
  • 稳定性:高
  • 测试计划:支持按照suite.json配置按需执行case
  • CI持续集成:支持
  • 试图检索:1.基于wxml的控件识别技术2.基于小程序底层基础库提供原生能力
  • 元素定位:

1.图像识别❌

2.类选择器定位✅

3.id选择器定位✅

4.标签选择器定位✅

5.子元素选择器定位✅

6.后代选择器定位✅

7.跨自定义组件的后代选择器定位✅

8.多选择器的并集定位

9.xpath定位✅

  • 元素定位纠错:支持
  • hook、mock、网络拦截、微信原生native、小程序内嵌h5支持

三、minium框架的介绍和支持情况

以下为minium的一些核心能力。更多详细的能力可以查看官方的文档:

官方文档:https://minitest.weixin.qq.com/#/minium/Python/readme

3.1、元素定位能力

minium的元素定位极其丰富,可以通过多重选择器来定位。同时也可以根据文本、xpath等常规方法来定位。

当max_timeout != 0且没有找到目标元素时, 框架尝试通过整个页面元素【推测】你可以想要查找的元素,如果有符合条件的【可能的元素】,则返回该元素实例;一般可以解决:xpath 丢失中间节点、跨自定义组件 css selector 写法不当问题; minium v.5.5支持

3.2、多账号运行能力

minium支持多账号运行

3.3、Minitest支持能力

MiniTest是minium中继承自unittest.TestCase的测试基类, 可以在testcase中使用框架实例化好的Minium/App/Native实例。 也可以使用unittest中的各种断言函数

名称 类型 默认值 说明

mini minium.Minium None Minium实例,可直接调用minium.Minium中的方法

app minium.App None App实例,可直接调用minium.App中的方法

page minium.Page None 当前页面Page实例,可直接调用minium.Page中的方法

native minium.Native None Native实例,可直接调用minium.Native中的方法

logger Logger None 可以调用logger.info、logger.warning、logger.error、logger.debug打印日志, 日志内容会在报告日志中体现

test_config minium.MiniConfig None case运行时对应的配置实例, case setUp时创建


每个对象都提供了极其丰富的api支持UI自动化的操作。

3.4、断言能力

minium提供了丰富的断言方法

assertFalse(expr)
assertTrue(expr)
assertRaises(expected_exception)
assertEqual(a, b)
assertNotEqual(a, b)
assertAlmostEqual(a, b, places=7)
assertNotAlmostEqual(a, b, places=7)
assertSequenceEqual(seq1, seq2)
assertListEqual(list1, list2) / assertTupleEqual(tuple1, tuple2)
assertSetEqual(set1, set2)
assertIn(a, b)
assertNotIn(a, b)
assertIs(a, b)
assertIsNot(a, b)
assertDictEqual(d1, d2)
assertDictContainsSubset(d1, d2)
assertMultiLineEqual(s1, s2)
assertLess(a, b)
assertLessEqual(a, b)
assertGreater(a, b)
assertGreaterEqual(a, b)
assertIsNone(a)
assertIsNotNone(a, b)
assertIsInstance(obj, cls)
assertNotIsInstance(a, b)
assertRegex(text, expected_regex)
assertNotRegex(text, unexpected_regex)
assertSetContainsSubset(subset, superset)

3.5、Mock/Hook能力

minium中基于mock/hook能力实现了很多实用api, mock/hook能力是否正常也关系着这一类的api能力是否能正常使用.。

Mock

mock, 替换接口实现. 如wx.getStorageSync("test")返回结果是1, mock该接口后可以让其返回2

Hook

hook, 在api调用前后进行插桩监控。分为:

  • before: 函数调用前
  • after: 函数调用后.
  • callback: 函数回调时

3.6、网络能力

minium的网络记录能力,本质上是根据其hook能力来实现的。

网络请求日志文件存放在{self.test_config.case_output}/request.log中,case运行过程中所有网络日志会在case运行完毕后存储到request.log中

3.7、原生能力

minium提供了Native类,实现了针对小程序内涉及原生控件(授权弹窗、弹窗、地图、分享小程序等)的操作封装。可以控制操作类型的原生操作。

3.8、真机测试能力

支持在真机上(无需配置adb等环境,直接真机运行UI自动化)

3.9、生成测试报告能力

每条用例的测试结果会存放到一个目录里面,里面包含:

  • 包含用例执行信息的json文件
  • 用例运行中的截图
  • 用例运行中的日志
  • 小程序运行中的日志

基于这些数据可以生成测试报告,也可以做一些存档的事情。

四、minium框架集成和使用

4.1、注册开发者账号

在微信公众平台注册小程序:https://mp.weixin.qq.com/

注册成功后,会得到一个AppId

如果项目已有AppId,则申请添加体验者,授权即可。无需申请。

4.2、配置环境

  • Python 3.8及以上
  • 微信 >= 7.0.7 (确认微信公共库版本 >= 2.7.3即可)
  • 微信开发者工具

4.3、下载微信开发者工具

下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

打开安全模式:设置 -> 安全设置 -> 服务端口:打开

4.4、拉取源码并登录开发者工具

因为minium依赖于源代码的运行。

  • 拉取源代码
  • 采用授权微信账号登录微信开发者工具。
  • 自动编译

4.5、开启端口监听

"path/to/cli" auto --project "path/to/project" --auto-port 9420

"path/to/cli":表示微信开发者工具的cli命令地址

"path/to/project":表示项目地址

# Mac中cli地址是固定的,如下:
/Applications/wechatwebdevtools.app/Contents/MacOS/cli
# Windows中,Cli地址为安装目录
windows: C:/Program Files (x86)/Tencent/微信web开发者工具/cli.bat

出现以下提示,则证明端口监听开启成功。

4.6、创建Python工程

这里采用pipenv管理,也可以直接采用pip管理

安装 pipenv

首先需要安装 pipenv,可以使用 pip 进行安装:

pip install pipenv

创建项目环境

在项目目录下,使用 pipenv 创建一个新的虚拟环境并安装依赖,这会创建一个虚拟环境并生成 Pipfile 和 Pipfile.lock 文件

pipenv install

安装依赖包

使用 pipenv 安装新包:

# minium依赖库
pipenv install minium
# 如果需要ios真机测试, 会额外安装一些依赖库
pipenv install "minium[ios]"

环境检查

minitest -v


五、项目框架搭建

5.1、直接运行测试用例

这是一个城市选择的UI自动化用例代码:

@minium.ddt_class()
class TestDemoLocation(minium.MiniTest):
    tag = "TestDemoLocation:"
    # 首页路由
    page_main_route = "/pages/index/index"
    # 城市选择页路由
    page_location_route = "/pages/city/city"

    @classmethod
    def setUpClass(cls):
        super(TestDemoLocation, cls).setUpClass()

    @minium.ddt_case("上海", "北京")
    def test_location_search_city(self, city_value):
        """
        case介绍:

        1、点击首页城市定位按钮
        2、跳转到城市选择页面
        3、并搜索城市
        4、选中搜索结果
        5、返回首页,断言切换定位成功

        """

        sleep(1)
        # 点击跳转到城市选择页面
        self.app.get_current_page().get_element(selector="header >>> .city-name").tap()

        # 等待页面跳转成功
        self.app.wait_for_page(page_path=self.page_location_route, max_timeout=10)

        # 等待1秒,用于展示页面(不等待也可以,这里只是为了效果,否则速度过快)
        sleep(1)

        # 输入城市数据
        self.app.get_current_page().get_element(selector="input", auto_fix=True).input(city_value, False)

        # 等待一秒展示出结果
        sleep(1)
        # 获取结果列表
        res_city_list = self.app.get_current_page().get_elements(selector=".result-city-filter-item-li", auto_fix=True)

        if len(res_city_list) > 0:
            self.logger.info(self.tag + "找到匹配城市")
            res_city = res_city_list[0]
            res_city.tap()
        else:
            self.logger.info(self.tag + "没有匹配的城市")

        # 等待首页跳转完成
        self.app.wait_for_page(page_path=self.page_main_route, max_timeout=10)

        self.assertEqual(first=self.app.get_current_page().get_element(selector="header >>> .city-name").text,
                         second=city_value,
                         msg="城市切换成功")

六、云测

本项目支持云测。建议在调试阶段通过ide来测试(本地真机速度较慢),真机测试直接使用云测。

云测的具体步骤如下:

5.1、打包项目代码上传云测平台

将脚本文件上传云测平台(可编写一键打包并上传代码)。

5.2、云测平台创建测试计划

代码上传完成后,可以在云测后台创建测试计划。

云测地址:https://minitest.weixin.qq.com/cloudtest/

需要使用具备小程序权限的微信扫码登录。

创建测试计划

勾选需要云测的测试用例

创建成功

5.3、创建测试任务

选择minium类型

选择刚才创建的测试计划。

若有授权弹窗场景,勾选启用小程序自动授权

勾选完成后,等待测试结果即可。

云测真机执行流程图:

环境初始化和结果处理需要 额外耗时10-15分钟,所以一般情况下会比最长测试时间要长。

环境初始化和结果处理时长不计入用户使用耗时,不会扣除用户时长

  • 账号被占用: 测试账号不能同时运行同一个小程序上。所以当运行账号被占用时,系统会自动排队等待
  • 真机排队:云测服务底层采用WeTest真机执行,当真机被占用时,需要排队等待
  • 执行出现异常:由于真机测试,无法100%保证成功。当测试任务遇到真机断连等异常情况时,默认会自动重试一次。如果第一次执行异常导致重试的任务,测试时间会增加

注意:

测试时长最短为10分钟(不超过10分钟的按照10分钟算),双平台测试,时长会加倍。

每周的免费测试时长为150分钟,超出去后需要付费。务必合理安排使用。

5.4、查看测试结果

测试完成后,可查看测试结果

包括测试截图、测试日志、网络请求、性能消耗、资源占用等。均有完整的测试结果

5.5、发送测试结果(邮箱/手机)

我的信息-绑定邮箱/手机

跑测完自动发送结果:(报告仅一个月有效期)

最后一次编辑于  01-08  
点赞 4
收藏
评论

1 个评论

  • 元素素
    元素素
    03-13

    请问如果小程序都是内嵌的H5,还可以使用minium+微信开发者工具测试吗

    03-13
    赞同
    回复
登录 后发表内容