评论

复杂场景无法自动化测试?Minium 测试试一试!

想要更灵活的自定义测试环境?Minium 测试助你一臂之力!

录制回放文章 提到录制回放支持输入、文本查找、断言等自动化测试基础操作,无需编写代码,用例生成效率高,但是该操作对于部分复杂的业务场景具有局限性。如果用户希望适用复杂的业务场景,自主制定测试场景,自定义测试(Minium)方案就非常适用了。


自定义测试 Minium 能力介绍

小程序测试框架 Minium 是微信测试团队为小程序开发或测试同学提供的一套测试接口,它实现了

  • miniprogram-automator 中小程序自动化的所有能力,例如直接触发小程序页面元素、设置页面数据、向 AppService 注入代码片段、Mock / Hook wx 对象的接口等
  • 支持并封装所有的原生操作,屏蔽 iOS / Android 底层差异,实现了一套脚本在三端同时运行
  • 用户写好的 Minium 脚本,可以在本地执行,也可以直接上传到微信小程序云测服务执行,无需准备和维护真机环境


自定义测试 Minium 流程介绍

一、 编写用例

编写小程序自动化测试脚本,常见操作包括:

  • 基本操作,例如如页面跳转,元素定位及相关操作
  • 处理小程序 API
  • 处理小程序的原生控件,例如处理授权弹窗
  • 支持数据驱动测试

1、基本操作

例如定位小程序页面元素、操作元素、跳转页面等。例如以下用例

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)          

2、处理小程序 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")

3、处理小程序原生控件

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"
    },
  }

4、数据驱动

自动化测试往往需多组数据测试,若采用录制回放测试,则需录制多个用例,灵活性不足,所以若需测试同一个用例不同组测试数据,可使用数据驱动(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))
        )

此外,DDT 模式还支持给具体的 test data 命名,自定义命名会体现在测试方法名中。数据驱动详情可参考 测试流程控制 & 数据驱动测试


二、 执行用例

开发者编写完 Python 用例脚本后,可本地调试,也可在云测上测试。


1、本地执行

开发者将编写好的用例进行本地调试,minitest 命令加载用例,初始化环境,开启自动化能力,进行环境检查,后执行用例。该方法需 IDE 依赖,支持 USB 真机调试。在初始化环境过程中遇到常见问题如下:

  • 开发者工具没有自动打开,建议先排查微信开发者工具自动化能力,进行 环境检查
  • 配置真机环境但无法拉起真机上的小程序,建议排查是否使用真机调试 2.0,如果是,切换使用真机调试 1.0
  • 报错 traceback 中有出现 _miniClassSetUp 的调用,确认微信开发者工具选用的基础库是否为最新版本。路径如下:开发者工具项目窗口右上角 -> 详情 -> 本地设置 -> 调试基础库

为了保证同一套代码在 IDE、Android、iOS 上运行,Minium 环境组成比较复杂,所以测试用例的运行依赖于配置文件,支持配置运行平台、IDE 监听端口号、连接手机的参数、账号信息、自动处理授权弹窗等等。具体操作可参考 项目配置


执行完用例后,云测平台生成日志文件,提供本地测试报告,包括截图、运行日志、错误日志。具体实践可参考 示例


2、云测服务执行

开发者可以将本地调试好的用例上传至云测平台,新建测试计划 -> 新建 Minium 任务,可选择多平台真机,且支持多平台同时运行,无需用户部署和维护真机环境

测试结束后,云测服务提供详细的测试报告,包括运行截图、日志信息、网络请求分析、性能分析等。当用例执行失败时,云测服务会提供错误日志及错误行代码,方便用户排查错误原因。具体操作可参考云测官方文档 自定义测试


对比

*详情点击查看 虚拟账号使用流程打通 devops 流程


最佳实践分享

对于第三方小程序服务商测试团队来说,多个小程序开发管理工作导致更复杂的测试情况。以明源云测试团队为例,他们需要管理多个小程序,并且每个小程序的页面数量较多。传统的手工测试显然无法覆盖业务需求。利用 Minium 自动化测试,明源云测试同学通过以下操作实现快速的自动化测试:

  • 使用了 Minium 框架编写自定义测试用例,执行超过 90 个用例;并且在编写用例时采用了 Page Object 模式(简称 PO 模式),将测试用例和页面元素定位、元素、元素操作等分离,提升用例复用性,降低维护成本;
  • 在执行用例的具体过程中,打通云测服务和内部的 devops 流程,利用云测第三方接口,定时触发或者自动触发自动化任务,然后利用查询任务接口,再将测试结果同步到内部的用例管理平台。如果有问题提单给程序修复,实现整个流程闭环。



总结

通过自定义测试(Minium),小程序测试团队能够自主定制测试场景,并且结合云测服务,获取详细的测试报告,实现较高的灵活度。

小程序云测服务提供 3 项服务,每项服务具备不同的特点,适用于不同的场景,助力开发者提升测试效率。



如有更多小程序云测服务的相关问题,可点击 微信小程序云测服务专区 发帖反馈,技术专员将为大家解答及进行深度交流。



最后一次编辑于  2022-08-05  
点赞 5
收藏
评论

3 个评论

  • 毛翼
    毛翼
    2023-01-28

    文章频次这么快的吗大佬

    2023-01-28
    赞同
    回复
  • 大白
    大白
    2022-08-04

    大佬,mock_wx_method怎么使用呀,官方的文档看的不是很明白,求解

    2022-08-04
    赞同
    回复
  • Frank
    Frank
    2022-08-03

    文章频次这么快的吗大佬

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