首页 > 编程语言 >Minium+PageObject:小程序UI自动化测试实践

Minium+PageObject:小程序UI自动化测试实践

时间:2024-12-19 19:57:48浏览次数:6  
标签:Minium title route UI 测试 PageObject self 页面

随着小程序的普及,用户体验成为各大开发团队追求的核心目标。UI自动化测试不仅提高了开发效率,更在提升用户满意度方面起到了至关重要的作用。而当你还在手动测试时,有人已经借助 Minium+PageObject 架构完成了全自动化的UI测试。

那么,Minium+PageObject 是如何为小程序UI自动化测试提供一站式解决方案的?这种方法有哪些优势?适用于哪些场景?

Minium 是由微信团队推出的小程序自动化测试框架,它提供了对小程序环境的强大控制能力,可以快速模拟用户交互行为。而 PageObject 是一种成熟的测试设计模式,通过页面对象的封装,将测试逻辑与UI操作解耦,大大提高了代码的可维护性和复用性。


案例分享:某电商小程序团队在接入 Minium+PageObject 之后,完成了商品搜索、添加购物车、订单支付等核心业务的自动化测试,仅用三周时间将覆盖率从30%提升到80%,显著降低了回归测试成本。

小程序架构上分为渲染层逻辑层,尽管各平台的运行环境十分相似,但是还是有些许的区别(如下图),比如说JavaScript 语法和 API 支持不一致,WXSS 渲染表现也有不同,所以不论是手工测试,还是UI自动化测试,都必须要在 iOS 和 Android 上分别检查小程序的真实表现。

图片

 

由于生态方面的原因,目前可选择的小程序UI自动化框架较少。在框架选取过程中,我考察了Appium、Airtest和Minium三个框架,并将三者做了对比,形成了以下图表:

图片

Appium实现微信小程序自动化测试的手段基本上还是套用针对 Hybrid App 的测试方案,通过定位H5 App资源控件,并结合屏幕坐标的方式来操控小程序的页面元素;网易推出的Airtest则是基于图像识别和Poco控件识别,之前也对此框架做过比较深入的了解,但是和Appium一样,对于小程序自动化测试来说,以上两者无法深入小程序逻辑层,只能作用于渲染层,从另外一个角度来说,这两个框架还属于黑盒自动化测试的范畴。

01 Minium

接下来再介绍一下今天的主角:Minium。它是微信小程序官方推出自动化框架,提供了 Python3 和 JavaScript 版本(后者目前已停止维护,后文中的minium单指Python版本),目前最新的版本为1.0.0b2。minium不仅限于 UI 自动化,它还提供了很多有用的特性,比如说支持调用和 Mock 部分 wx 对象上的接口,支持获取和设置小程序页面数据,支持直接触发小程序元素绑定事件等等。

另外,minium提供一个基于unittest封装好的测试框架,利用这个简单的框架对小程序测试也可以起到事半功倍的效果。有了以上功能,不但可以简化用例的一些前期准备工作,更可以对小程序做更针对和更全面的测试。

minium的下载安装和官方文档,可以在代码库查看。官方文档写的还算较为清晰,除此之外,以下网站在学习过程中也有帮助:

  • 微信开放社区: 一些minium使用方面的问题,可以在右上角搜索 "minium" 寻找答案或发起提问;

  • 微信开发者工具: minium与微信开发者工具强关联,开发调试脚本都需要使用微信开发者工具;

  • Minium Demo: 官方提供的python版本的demo,内容非常简单,可以用来简单熟悉一下框架,若要运行demo需要先下载示例小程序代码;

02 Minium + Page Object

早期 GUI 自动化测试脚本,无论是Selenium还是UFT,脚本通常是由一系列的页面控件的顺序操作组成的,有点像操作级别的“流水账”,这主要体现在以下几个方面:

  • 脚本逻辑层次不够清晰,属于 All-in-one 的风格,既有页面元素的定位查找,又有对元素的操作;

  • 脚本的可读性差,在实际项目中,很难从代码中直观看出到底脚本在操作哪个控件,并且脚本的每一行都直接描述各个页面上的元素操作,无法直观的看出脚本更高层的业务测试流程;

  • 通用步骤会在大量测试脚本中重复出现;

Page Object 就是为了解决以上问题而出现的,它是UI自动化测试项目开发实践的最佳设计模式,采用分层封装的设计思想,不同层关心不同的问题。页面对象层只关心元素定位问题,测试用例只关心测试的数据。通过对界面元素和功能模块的封装减少冗余代码,在后期维护中,若元素定位或功能模块发生变化,只需要调整页面元素或功能模块封装的代码,显著提高测试用例的可维护性。

基于PO模式,小程序UI自动化测试Demo项目的目录结构及说明如下:

图片

 

  • cases/: 存放业务测试用例;

  • outputs/: Minium测试报告;

  • pages/:页面对象模型;

  • *config.json:Minium项目配置文件;

  • suite.json:Minium测试计划文件;

  • route.py:统一存放小程序页面路由;

  • utils.py:存放一些公共方法;

03 具体代码

下面从具体代码入手,简单讲述一下项目的设计思路。

首先是BasePage,它是页面模型基类,用于封装所有页面公用的方法。

import abc
import time


class BasePage(abc.ABC):    def __init__(self, mini, route, title=""):
         self.mini = mini
         self.route = route
         self.title = title 
  
  def open(self):
       """跳转到小程序目标页面"""
        self._open(self.route, self.title, open_type='redirect')

    def check_element(self):
        """页面元素审查
        在子类中实现此方法时,建议使用Minium框架中提供的断言方法,原因如下:
        调用 Minium 框架提供的断言方法,会拦截 assert 调用,记录运行时数据和截图,自动在测试报告
        中生成截图 (需要在配置文件中将 assert_capture 设置为True)
        但是如果直接assert或使用unittest.TestCase提供的断言,当断言失败时,无法自动生成截图
        """
        raise NotImplementedError    def on_page(self, route,title=None, wait_util_page_contain_keys: list = None):
        """通过对title和route断言,校验跳转进入的当前页是否符合预期"""
        if wait_util_page_contain_keysis not None and isinstance(wait_util_page_contain_keys, list):
            self.mini.page.wait_data_contains(wait_util_page_contain_keys)
        else:
            time.sleep(2)

        self.mini.assertEqual(self.current_route, route,
                              msg="页面路由不匹配, 预期:{},实际:{}".format(route, self.current_route))
        if title:
            self.mini.assertEqual(self.current_title, title,
                                  msg="页面标题不匹配, 预期:{},实际:{}".format(title, self.current_title))

     @property
     def current_title(self) -> str:
        """获取当前页面 head title, 具体项目具体分析,以下代码仅用于演示"""
        return self.mini.page.get_element("XXXXXX").inner_text

     @property
     def current_route(self) -> str:
        """获取当前页面route, 具体项目具体分析, 以下代码仅用于演示"""
        return self.mini.app.get_current_page().path     

def _open(self, route, title, open_type=None):
        """
        小程序页面跳转可以使用以下三个方法, 一些区别如下:
        1.`navigate_to`: 此方法会保留当前页面,并跳转到应用内的某个页面(不能跳到tabbar页面). 小程序中页面栈最多十层, 如果超过十层时,再使用此方法
        跳转页面, 会抛出以下异常:`minium.framework.exception.MiniAppError: webview count limit exceed`. 因此需要在运行用例后及时清除页面栈;
        2. `redirect_to`: 关闭当前页面,重定向到应用内的某个页面,使用此方法跳转页面时,会替换页面栈,因此页面栈不会超限,但是也导致不支持页面回退;
        3. `relaunch`: 关闭所有页面,清空页面栈,打开到应用内的某个页面;
        """
        open_type = 'redirect' if open_type is None else open_type       if open_type.lower() == "navigate":
            self.mini.app.navigate_to(route)
        elif open_type.lower() == "redirect":
            self.mini.app.redirect_to(route)
        else:
            self.mini.app.relaunch(route)

        self.on_page(route, title)

具体业务的页面模型对象都需要继承BasePage,以IndexPage为例,代码如下所示:

from pages.BasePage import BasePage
from route import XXXXX


class IndexPage(BasePage):    
    locators = {
        "AAA": "view#aaa",  
        "BBB": "view.bbb>image"
    }

    def check_element(self):
        self.mini.assertTrue(self.mini.page.element_is_exists(IndexPage.locators['AAA']) is True)
        self.mini.assertTrue(self.mini.page.element_is_exists(IndexPage.locators['BBB']) is True)

    def click_query_btn(self):
        self.mini.page.get_element("view", inner_text="xxxx").click()
        self.on_page(route=XXXXX.XXXX.route, title=XXXXX.XXXX.title)

BaseEntity为测试用例基类,用于统一设置用例准备和清理工作,所有项目的测试用例都继承此类:

from pathlib import Path
import minium


class BaseEntity(minium.MiniTest):    
    """测试用例基类"""
    @classmethod
    def setUpClass(cls):
         super(BaseEntity, cls).setUpClass()
         output_dir = Path(cls.CONFIG.outputs)
         if not output_dir.is_dir():
             output_dir.mkdir()

    @classmethod
    def tearDownClass(cls):
        super(BaseEntity, cls).tearDownClass()
        cls.app.go_home()

    def setUp(self):
        super(BaseEntity, self).setUp()

    def tearDown(self):
        super(BaseEntity, self).tearDown()

cases.Moudle_1.index_test.IndexTest代码内容如下:

from cases import BaseEntity
from pages.Moudle_1.IndexPage import IndexPage
from route import XXXXX


class ParkIndexTest(BaseEntity):    
    def test_index_page(self):
         index_page = IndexPage(self, XXXXX.INDEX.route, XXXXX.INDEX.title)
         index_page.open()
         index_page.check_element()
         index_page.click_query_btn()

总结:

  • 优点:PO模式对页面界面交互细节进行了封装,而测试用例基于页面对象完成具体操作,这样可以使我们的自动化测试脚本案例更关注业务,而非界面细节,提高了测试案例的可读性。

  • 缺点(个人观点):开发和维护页面对象的类(Page Class),是一件很耗费时间和体力的事儿。

    待研究方案:小程序页面对象自动生成,不用再手工维护 Page Class ,只需要提供页面路由,就会自动生成这个页面上控件的定位信息,并自动生成 Page Class;

当前,小程序已成为企业布局移动端市场的重要阵地,但随之而来的测试需求激增,人工测试的效率无法满足快速迭代的需求。Minium+PageObject 提供了一种高效、可扩展的自动化测试方案,正逐步被更多企业采纳。

小程序UI自动化测试是大势所趋,而 Minium+PageObject 的结合不仅提供了技术支持,还改变了传统的测试方式,真正实现了“快速、精准、高效”的目标。

用自动化提升效率,用专业成就体验,掌握 Minium+PageObject,你的小程序开发之路将更加从容!

标签:Minium,title,route,UI,测试,PageObject,self,页面
From: https://blog.csdn.net/m0_58552717/article/details/144568529

相关文章

  • 本地大模型构建系列(一):3、安装部署Open WebUI(Windows 10)
    引言:什么是OpenWebUIOpenWebUI是一种用于构建和管理基于Web的用户界面的开源框架,常用于简化开发者创建现代、交互性强的Web应用程序的过程。以下是它的关键点:1、框架开源:OpenWebUI是开源的,开发者可以自由使用它,适用于各种Web应用开发;2、用户界面构建:它提供了丰富的U......
  • 基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架) 图像识别与分类 前
    基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架)前端界面:flask+python,UI界面:pyqt5+python这是一个完整项目,包括代码,数据集,模型训练记录,前端界面,ui界面,各种指标图:包括准确率,精确率,召回率,F1值,损失曲线,准确率曲线等卷积模型采用vgg16模型或efficien......
  • Autodesk.Revit.UI.Selection
    Autodesk.Revit.UI.SelectionClassesPickedBox包含两个XYZ点的类,表示屏幕上的选取框。PropertiesMax最大坐标数(拾取框的右上角)。Min最小坐标(拾取框的左下角)。SelectableInViewFilter一个过滤器,用于传递在给定视图中可选的元素。ConstructorsSelectabl......
  • 一款使用NET+MQTT+Arduino开发的智能浇花工具
    最近闲来无事,对硬件控制产生了兴趣。看到家里的盆栽,我突然萌生了制作一个自动浇水工具的想法。通过在淘宝搜索并查找相关资料,我了解了需要的硬件和通信协议。接下来,我们先看看需要做哪些准备工作(如安装Arduino、.NET、EMQX工具等,请自行搜索并完成安装)。准备工作硬件清单(淘......
  • kafkaui自定义过滤器
    importgroovy.json.JsonSlurper//假设这些变量已经在Groovy上下文中可用//partition,timestampMs,keyAsText,valueAsText,header,key,value//配置要过滤的目标名称deftargetDid=""//JSON解析defjsonSlurper=newJsonSlurper()//假设valueAsText......
  • 【comfyui教程】如何快速为室内设计线稿图上色:轻松实现创意!
    前言**设计师们,你是否还在为线稿上色的繁琐工作发愁?**别担心,现在有了一键解放双手的神奇工具!在室内设计领域,色彩斑斓的室内效果图不仅能大幅提升设计的表现力,还能一秒抓住客户的眼球。传统的手工上色不仅耗时耗力,还容易陷入“调色地狱”。但有了ComfyUI的“室内设计线稿......
  • 【comfyui教程】一键更换模特姿势,ComfyUI工作流分享
    前言一键更换模特姿势,ComfyUI工作流分享在创意图像生成领域,ComfyUI正成为一款不可忽视的神器。作为一款专为StableDiffusion设计的基于节点的图形用户界面(GUI),它通过链接不同的模块(称为“节点”)来实现图像生成的高自由度和高度定制化。今天,我们就来分享一个精彩的Comf......
  • 让Chrome http3[QUIC]通信支持所有类型证书,自签名+信任机构
    Chromehttp3通信默认仅支持信任机构发行的证书,.net的开发者证书或CloudFlare的10年证书,或者其他自己创建的自签名证书是开启不了http3通信的。通过下面设置可以开启对自签名证书的支持,这样就可以愉快的使用http3测试了:Chrome最新版,目前是131,地址栏输入:chrome://flags,然后搜......
  • Angular 打包 ng build 不压缩混淆
    ngbuild后,js代码被压缩混淆了,好像不太利于学习,何解?无解???非也,非也。试试ngbuild--help,何如?可解,可解。Angular微微抬头,语重心长曰:“小伙子,运行这个命令——ngbuild-cdevelopment。”Huajianketangbuiltittolearnit.......
  • 让.NET应用支持Http/3,QUIC协议
    1.必备条件1.1.NET应用开启httpsPrograme.cs中配置了https支持,varbuilder=WebApplication.CreateBuilder(args);builder.WebHost.ConfigureKestrel((context,options)=>{options.ListenAnyIP(5001,listenOptions=>{listenOptions.Protocols=H......