Appium UI 自动化到底要不要用 Page Object 模式?(深入了解 PO 模式, 并改造 PO 模式)

Page Object 模式 python webdriver 版本

这里介绍下我近期对 PO 模式的理解, 整体思想是分层,让不同层去做不同类型的事情,让代码结构清晰,增加复用性
一般分两层或三层(也有四层的):

两层:

  • 对象逻辑层
  • 业务数据层

三层:

  • 对象库层
  • 逻辑层
  • 业务层

四层:

  • 对象库层
  • 逻辑层
  • 业务层
  • 数据层

不同层本质差不多
下面以登录为例子 (网上绝大多数都是以登录为例子,但登录只能让新手明白 PO 大概是怎样子,优势却很难传递出来)
普通方式:

PO 模式

对象库层

 

 逻辑层

 业务层

分析

一 代码量多了大概三倍, 代码量增加是一定的先忽略,后面重点讨论

二 分层之后真的易于维护吗?

我们来看下当元素发生变化的时候,只需要在对象库层找打对应元素修改。 咦? 你会说普通方式不也一样吗, 看上去一样,其实有细微差异,而一些细微差异会导致很大不同

  • 效率高 : PO 模式每个元素有变量定义,更方便查找。 而普通方式得通过备注或上下文来推断效率低。 ps:随着 case 不断增加,海量元素的定义对于英语一般的同学挑战也大,有人说有谷歌翻译。定义的时候可以通过翻译, 但到时候回过来查过元素怎么办? 翻译通常是 1 对多,我们当时选哪个? 用哪个来搜索? 这或许也是海量变量定义带来的困扰
  • 复用多收益大: 当某个元素被多次引用的时候,只需要修改一处便可,而普通方式需要一处一处找出来并修改,可以看出来复用越多 PO 模式收益越大

当界面需求发生变化

  • 1.新增或删除了一些功能点或调整操作步骤先后顺序,但上层业务不变
    • 效率高 :同理,PO 模式的逻辑层方法有具体定义,情况和元素发生变化一样 修改逻辑层,业务层不变。这样看来结构简单清晰,舒服更符合人类习惯, 普通方式就是继续堆 case
    • 复用多收益大: 同样这里如果逻辑复用越多,PO 模式收益越大,因为对于 PO 模式来说都只需要修改一个地方多处受益
    1. 上层业务发生变化

    看上去两者差异不大

小结

总得来看:

  • case 越多使用 PO 模式会使你的代码结构更清晰
  • 元素复用越多 PO 模式下维护非常容易
  • 逻辑复用越多 PO 模式下维护非常容易(如果逻辑复用多,需要多考虑逻辑层的颗粒度)
  • 元素/逻辑/数据复用越多应选择更多层的 PO 模式

 

好,我们再回过头来看看代码量大的问题,有没有办法精简一些呢? 把 a*N 中的 a 变成 1.8, 1.5, 1.2, 甚至接近 1 呢?
开始下一轮探索:

探索 代码量大的问题

以三层 PO 为例我们大概的流程是这样的:
在对象库层,我们定义了元素,再为元素定义了一些基本的操作流, 在逻辑层 为集成了基本操作流,在业务层 组装逻辑 和 数据输入
看上去 第二 第三步骤 有点重复 能不能去掉? 如果只剩下第一 四个步骤 那代码量瞬间就下来了 那该有多爽

试试看

如果去掉第二/三步骤,那意味着我们只需要定义元素,并在业务层需要指定操作的时候再自动生成对应所需操作。即需要时生成,用完后丢弃。
这里需要用到 python 下面的魔法方法 "getattribute"
思路:
在访问类 App 属性时挡截下来,历遍对象库层找到对应元素返回对应的对象类 App.LoginPage,而对象库层都继承了 BasePage 类,在 BasePage 中同样重构了"getattribute",当 App.LoginPage 对象尝试调用 click() 之类的方法时,就临时绑定 click 方法(click/swip/get_text/set_text.....)。

这样做的话,就只需要编写元素对象库,在 业务层直接自由调用,即时生成,用完丢弃。 代码量大幅减少

对象库层 (这里使用 airtest 下面的 poco 控件识别框架举例,和 Appium Selenium 略微不同)

 业务层

如此看来用例编写者就更接近只需要关注业务

以下是关键思路的实现 以 App 类为例子 BasePage Element 大概相同
  • App 类

 结尾

以上这近几天对 PO 的新认识,欢迎大家多多指点

添加部分具体代码

对象元素库层:
BasePage:

 ScoutingPage:

 业务层:

执行报告如下:

 

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方进群即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538170.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动硬盘放久了会不会坏?移动硬盘长期不用数据会丢失吗

随着数字化时代的到来,移动硬盘已成为我们生活中不可或缺的一部分,用于存储和备份大量的照片、视频、文档等重要数据。然而,当移动硬盘长时间不使用或被放置一旁时,我们不禁会产生疑问:它会坏掉吗?存储在里…

H5 自适应超人背景引导页源码

源码名称:自适应超人背景引导页源码 源码介绍:一款自适应引导页源码,带超人背景。有四个跳转按钮。 需求环境:H5 下载地址: https://www.changyouzuhao.cn/11608.html

《互联网的世界》第七讲-能源

本想聊聊 tcp 和 quic,但这些都属于术的范畴,变化多端,等孩子们长大了又不知变成什么样子了,趁这段时间在家,还是得讲一些相对不变的东西,或法或势。 从 安阳卖血糕的精巧篦子 想到如何做圆米粉和圆面条&a…

ubuntu下摩尔线程s80配置ai绘图环境

首先我的桌面是gdm,然后安装github上的sdk,重启进不去桌面了 解决方法: 开机以后选ubuntu的高级选项,换旧一点的linux内核,然后卡在进程上,ctrlaltf2斤tty sudo apt remove musa 卸载完驱动就可以进系统了

PLC通信网关的介绍-天拓四方

在工业自动化日益发展的今天,PLC已成为工业控制领域的核心设备。工业自动化与信息化深度融合,PLC的应用日益广泛。PLC通信网关,作为工业物联网的重要组成部分,扮演着连接PLC与云平台的桥梁角色,实现设备间的数据交换与…

pgsql常用索引简写

文章来源:互联网博客文章,后续有时间再来细化整理。 在数据库查询中,合理的使用索引,可以极大提升数据库查询效率,充分利用系统资源。这个随着数据量的增加得到提升,越大越明显,也和业务线有关…

Java中的LinkedBlockingQueue:原理、应用与性能深入剖析

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在当今这个多线程、高并发的时代,Java的并发编程显得尤为重要。而当我们提及Java的并发编程,不可不提的一…

性能压测-jstack的使用

Jstack命令使用 使用top命令查看cpu占用比较高的进程pidps H -eo pid,tid,%cpu|grep 71 (71为进程数pid,tid为线程数) 此命令答应 进程数为71 下所有的线程数,看哪个线程数占用的cpu较高 Jstack中线程数记录的是16进制,需要将步…

ipa文件证书监测有什么用?测试安装包有什么用?什么类型包需要要求资质?

哈喽大家好,我是咕噜签名分发可爱多。今天给大家介绍一下ipa文件证书监测有什么用,测试安装包有什么用,以及什么类型包需要要求资质。 IPA 文件证书监测主要用于验证和确认一个 iOS 应用程序是否具有合法的签名证书。下面是一些监测证书的用途…

SaaS应用加速:提高企业办公效率,解决业务挑战

随着企业业务的迅猛发展,为满足业务需求,企业纷纷投入更多SaaS应用以提高办公效率。然而,随着企业应用数量和用户数的不断增加,经常会遇到SaaS应用访问速度受限的问题。在这种情况下,SaaS应用加速解决方案受到越来越多…

1.Spring核心功能梳理

概述 本篇旨在整体的梳理一下Spring的核心功能,让我们对Spring的整体印象更加具体深刻,为接下来的Spring学习打下基础。 本片主体内容如下: Bean的生命周期依赖注入的实现Bean初始化原理推断构造方法原理AOP的实现这里要说明一下,我们这里说到的Spring,一般指的是Spring F…

matplotlib-条形图

日期:2024.03.14 内容:将matplotlib的常用方法做一个记录,方便后续查找。 from matplotlib import pyplot as plt# 设置画布大小,横坐标想分开,就要使用到子图 plt.figure(figsize(20,8),dpi 300)# 全局设置中文字体…