• 0
  • 0
分享
  • 微信小程序自动化测试——自定义测试(Minium)——软件测试圈
  • 北极 2022-11-28 16:35:47 字数 4774 阅读 7944 收藏 0

小程序测试框架 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

调用小程序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监听端口号、连接手机的参数、账号信息、自动处理授权弹窗等等。

执行完用例后,会生成日志文件,提供本地测试报告,包括截图、运行日志、错误日志。

1.png

云测服务测试

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

测试结束后,云测服务提供详细的测试报告,包括运行截图、日志信息,网络请求分析,性能分析等。

当用例执行失败时,会提供错误日志及错误行代码,方便用户排查错误原因。

2.png

对比

能力本地执行云测服务执行
测试账号可以用自己的微信账号只支持使用虚拟账号测试
真机部署需要自己部署真机,安装wda或者adb环境无需准备真机环境,直接提测
环境维护需要自己维护开发者工具登录态不依赖开发者工具,无需用户维护
查看报告需要自己搭建报告查看环境提供详细的测试报告,并支持分享报告https链接
性能数据需要手动调用接口获取支持查看用例性能数据,如CPU,内存占用等,可以开启体验评分,进一步查看运行时性能数据
Devops需要自己实现提供第三方https接口提交任务,获取结果,详情参考 打通devops流程

三、 最佳实践

小程序开发者有两种,第一种是普通开发小程序,由小程序拥有者自行开发。还有一种是第三方服务商,小程序拥有者可以授权给他们代开发小程序。

对于第三方服务商测试团队来说,他们面临的情况会更加复杂。例如在明源云的测试团队中,授权给他们开发的地产开发商小程序非常多(1000+),并且每个小程序的页面数量也很多,手工测试显然无法覆盖业务需求。

如果用微信小程序自动化测试——录制回放的方案,每个页面都需要手动录制,耗时耗力。

这里他们使用了Minium框架编写自定义测试用例,目前已经有 90+ 用例执行。在编写用例时采用了Page Object模式(简称PO模式),将测试用例和页面元素定位、元素、元素操作等分离,提升用例复用性,降低维护成本。

在具体执行用例过程中,他们将云测服务和内部的devops流程打通,利用云测第三方接口,定时触发或者自动触发自动化任务,然后利用查询任务接口,再将测试结果同步到内部的用例管理平台,如果有问题提单给程序修复,实现整个流程闭环。

3.png

4.png

四、总结

自定义测试(Minium)的核心优点:

  • 完全自主定制测试场景

  • 灵活度高

  • 支持数据驱动测试

  • 结合云测服务,可以无需用户部署维护真机环境,并且提供详细的测试报告,并提供第三方接口方便用户打通devops流程


作者:WXMiniTest

原文链接:https://blog.csdn.net/WXMiniTest/article/details/126752861

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 问:你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决。首先,将问题提交到缺陷管理库里面进行备案。然后,要获取判断的依据和标准:根据需求说明书、产品说明、设计文档等,确认实际结果是否与计划有不一致的地方,提供缺陷是否确认的直接依据;如果没有文档依据,可以根据类似软件的一般特性来说明是否存在不一致的地方,来确认是否是缺陷;根据用户的一般使用习惯,来确认是否是缺陷;与设计人员、开发人员和客户代表等相关人员探讨,确认是否是缺陷;合理的论述,向测试经理说明自己的判断的理由,注意客观、严谨,不参杂个人情绪。等待测试经理做出最终决定,如果仍然存在争议,可以通过公司政策所提供的渠道...
            11 12 3102
            分享
          •   最近行业里有个苦涩的笑话:公司扛过了之前的三年,没扛过摘下最近的一年,真是让人想笑又笑不出来。年前听说政策的变化,大家都满怀希望觉得年后行情一片大好,工作岗位激增,至少能有更多的机会拥抱未来。然而,事实远没有想象的美好。  年后迎来的,是各个大厂的裁员风波,加上前几年市场冗余的人员,又积压了一大批竞争者。再然后呢?GPT的问世,直接动摇了无数人本就端的不太稳的饭碗,如果用一个词形容,那就是“愁云惨淡”。  个人经历  所幸,笔者所在的科技公司在几波裁员潮后逐渐趋于平稳。但从个人发展和其他层面出发,跳槽成了一个很大必要但并非当下紧急的事。所以,笔者也抱着试一试的心态投入了找工作的大军。  今...
            0 0 1306
            分享
          •   据沃尔特·艾萨克森(WalterIsaacson)的新传记《埃隆·马斯克》(ElonMusk)一书透露,早在2015年,特斯拉CEO埃隆·马斯克(ElonMusk)就曾在试驾时多次因自动驾驶辅助技术Autopilot而险些丧命,导致其对工程师大发雷霆。  传记中关于自动驾驶辅助技术的章节中,作者揭露了马斯克亲身经历的一个事件:在405号州际公路上有一个弯道,由于路面的车道线已经褪色,Autopilot无法识别,导致汽车转向并“几乎撞上”迎面而来的车辆。  每当发生这种情况,马斯克都会“愤怒地”冲进特斯拉的办公室,对他的工程师大发雷霆,他反复要求工程师改进程序:“做点什么来正确地编程这个东西...
            0 0 1267
            分享
          •   多年之后,当我们回顾过往时,总能发现一些漫不经意的选择却影响了我们一生的走向。  学院路两旁的树叶逐渐发黄掉落,阿聪背着书包从宿舍出发去图书馆。道路上熙熙攘攘的师兄、师姐拿着一踏踏厚厚的求职简历,晃的阿聪的内心泛起波波焦虑。阿聪在旁人眼里是一个从小长到大的听话孩子,在家听父母的话,在学校听老师的话,甚至出去玩也听朋友的话。这样的成长经历,使得阿聪喜欢随大流、喜欢被动。看着周围的同学都出去找实习机会,阿聪也萌生了找个实习机会的想法。  说干就动手,第二天阿聪就整理了一大堆实习机会,有在本地(某内陆省会城市)的实习机会,有北上广深一线城市的实习机会。在本地实习的优点就是吃住不愁,学校都有,缺点...
            0 0 348
            分享
          • 背景与问题接口,解决了从协议发起,到后台业务逻辑的测试,但是忽略了重要的部分:前端展现和交互。我们需要通过自动化回归测试,来解决端到端测试的问题,即从客户端发起到服务端完成,整个业务落成,而不仅仅是服务端的功能。界面自动化,聚焦于界面业务逻辑和交互测试,对于海量的数据组合测试,不是重点目标。当前端界面、业务逻辑发生改变,就需要通过界面自动化回归测试,来解决系统回归和覆盖的问题。自动化测试是未来发展的趋势录制回放工具与测试脚本通过录制来生成自动化的测试脚本:对象库:基于脚本与对象库分离参数化:对脚本进行参数化,可以实现相同的脚本执行不同的数据和测试用例测试脚本:定义了整个的测试过程。使用关键字视...
            14 14 1560
            分享
      • 51testing软件测试圈微信