PageObject模型和自动化框架(一)

2023-10-31

本文是我对UI自动化测试和基于Appium自动化框架的一点点浅显的总结,如果表述中有什么谬误,欢迎博友热心指出,在此提前表示感谢;另外,该文也算是学习过程中的一个笔记,如有入门自动化相关行业的朋友,欢迎交流。

UI自动化测试

Web app和Android app现在已经很普遍了,软件开发者完成一个app的开发部署后,需要测试工程师进行测试验收,最终才为用户提供一个稳定的应用平台;从用户或者产品的角度来看,一个app需要完成特定的业务流程,为客户返回一个想要的结果或者异常提示信息。所以如果作为业务测试工程师,我们关心的是产品的业务流程,不关心底层数据流和实现原理,在自动化框架未出现之前,测试工程师需要手工模拟所有业务流程并保证app的正确性和稳定性;随着不同平台的自动化工具的推出,测试工程师可以借助这些自动化工具完成业务流程测试,自动化平台现在已经比较多了,比如Selenium,Appium,RobotFramework和Uiautomator等等,关于这些自动化平台的使用方法、底层原理和API等大家自己查一下,本篇文章重点是总结PO设计和自动化框架内容,其他内容不(ˇˍˇ) 想赘述。

PageObject

本人在基于Appium平台上进行UI自动化开发也有一年多了,有一天同行朋友随口问说:PO模型的优缺点有哪些?可以列举出来吗?当时含糊其辞,优点说了一些,缺点没怎么说出来,后来查阅博客和重新阅读《Selenium2自动化测试实战–基于Python语言》,对其优缺点进行清晰罗列,并进行个人解释。

优点:
1. 减少冗余
  个人理解:减少代码重复应该是说,我们可以通过PO模型,对页面进行封装,将页面公用的一些代码封装成API形式,提供给上层Case调用,举个例子:有一个登陆窗口,输入账户和密码,点击登陆按钮,对于这个简单的业务流程,按照测试用例设计中条件组合,有如下几条case需要执行:

		case1:账户非空,密码空,登陆;
		
		case2:账户空,密码非空,登陆;
		
		case3:账户密码均非空,登陆;
		
		case4:正确的账户密码,登陆;
				......

  如果你直接面对页面,进行自动化测试用例的编写,每条用例中都会涉及大量定位输入框,设定输入框内容,定位确认按钮,点击确认按钮这些重复的操作;对登陆页面的功能进行封装后:input_username(),input_password(),login(),然后测试用例直接调用这些页面级的API进行业务测试即可,寻找控件等操作我们就不用重复写多次.
2. 提高测试用例可读性
  还是上面的例子,通过page的封装,账户密码非空的测试用例就变成如下格式:

		def test_login_with_username_and_pwd()
			self.login_page.input_username("hahah")
			self.login_page.input_password("123456")
			self.login_page.login()

  如上所示,代码中的调用过程和人为操作过程完全一致,看不到定位元素和操作元素的底层代码,所以让测试用例可读性提高了很多。
3. 提高测试用例的可维护性。
  之前学习过一点点java web知识,其中的MVC模型非常受欢迎,该模型将webapp的视图、控制、业务和持久化处理完美的进行了解耦,并开发出了针对各个层的框架,比如专门转发请求的struts框架,专门处理持久化数据的Hibernate和mybaits等等。我们这里,PO模型也起到了解耦的作用,page对页面定位元素、操作元素的原始操作进行封装,为case层提供业务接口,case专注于业务流程的组合和覆盖。这对于页面经常变动的app有重要作用,如果app的页面随业务复杂化进行增量开发,那么页面元素也会经常改动,这时候,我们只需要改动Page中相应接口(如果仅仅是控件ID变动,我们只需要改变管理控件文件的相关字段即可,无需改动代码),case层不需要太多调整就可以适配新版本,这就大大较低了用例维护成本。
4. 提高测试框架的可扩展性
  这一点是根据我自己的理解加的。综上,PO的主要作用是将Case更加业务化,不要掺杂太多非业务的元素,如果按照这个思路,我们还可以用AppObject(我随口说的,没有这个模型),就是说针对一个App,编写一个Common类,所有对该App的公共操作接口都封装到这个Common中(工作中真的这么干过),case只需要调用自己app的common类的相应接口就可以完成业务流程处理。但是后来想想,还是PO模型更胜一筹。个人理解是这样的,App之所以由多个html或者activity组成,就是为了职责清晰,编码方便管理,Page对应一个页面,也是这个原理,该Page封装的API和其他页面完全分离,其他页面的任何变化不影响该页面。将一个Common class拆分成多个Page class是合理的,对于app新增的页面只需要扩展一个轻量级的Page class,而不需要去更改调试重量级的Common class。

自动化框架

  我是做android自动化相关工作的,所以也学过一点点Android,android系统是典型的分层架构,下面这张图大家应该见过很多次:
Android系统架构图
  Android系统设计多层架构,为不同层面的开发者提供了便利,对上层App开发者而言,如果需要系统的某个服务,只需要context.getSystemService()就可以获取系统服务的代理,完成相应功能,Android Frameword层为App开发者和ROM App开发者完美地封装了底层细节。
  综上,我们的自动化框架也是这个道理,Google和其他公司提供的自动化平台只是对UI元素进行原始操作的API,对测试业务的封装没有太多意义。待续

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PageObject模型和自动化框架(一) 的相关文章

  • springboot项目添加lombok日志输出控制台和log文件

    这个配置我也是在网上查找的 但是找不到出处了 首先 在resources下面建立logback spring xml文件 这个logback spring是默认springboot可以扫描到的 不用在yml中配置 也可以自己起名字 要在ap
  • C++ 画热力图

    void get point color float intensity int r int g int b if intensity lt 1 r 0 g 0 b 118 else if intensity lt 2 r 84 g 85
  • 第十四届蓝桥杯软件类 1 期模拟赛填空题及题解

    蓝桥杯还剩仅仅10天 但是本人现在才开始准备啊 不过事已至此只好刷一点题练练手感了 系统地去学算法肯定是来不及啦 题目来源 第十四届蓝桥杯软件类 1 期模拟赛 大学组 填空题3 4 5 填空3 项数 问题描述 小蓝特别喜欢调和级数 S n

随机推荐

  • WebService接口与HTTP接口的联系

    1 WebService有很多协议 为什么HTTP比较流行 WebService是个很重型的规范 它的应用协议是SOAP 简单对象访问协议 它所依赖的下层通信方式不单单是HTTP 也有SOAP over SMTP SOAP over TCP
  • 机器学习之空间滤波器

    目录 空间滤波 原理 平滑滤波 图例 均值平滑滤波器 matlab 代码 中值平滑滤波器 matlab 代码 人脸识别识别率比较 PCA k近邻分类器 锐化滤波 Unsharp Mask 效果图 拉普拉斯 效果图 锐化滤波器 matlab
  • 猿创征文| ‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    vue 不是内部或外部命令 也不是可运行的程序 或批处理文件 今天在使用vue ui进行搭建项目的时候出现了这个问题 在Visual Studio Code中通过vue ui指令使用脚手架安装项目时 终端报错 vue 不是内部或外部命令 也
  • Facebook数据中心实践分析,OCP主要工作成果介绍

    Facebook数据中心实践分析 OCP主要工作成果介绍 摘要 用讲故事的方式重点介绍了Facebook在数据中心方面的实践 其成立开放计算项目 OCP 以来的主要工作成果 以下为正文 保密本就是数据中心行业的惯例 2014年11月 我独自
  • mw325r已断开服务器无响应,水星mw325r路由器恢复出厂设置之后上不了网怎么办?...

    我把水星mw325r路由器恢复出厂设置之后有点问题了 可以教教我怎么解决吗 这是一个典型的重置路由器没有正确设置的案例 路由器恢复出厂的意思就是跟刚买来的时候一样 没有任何用户自己的配置 所以 正确配置路由器才可以上网 接下来家用路由器网小
  • Python 机器学习实战

    1 机器学习概述 机器学习正在迅速改变我们的世界 作为人工智能的核心 我们几乎每天都会读到机器学习如何改变日常的生活 一些人认为它会带领我们进入一个风格奇异的高科技乌托邦 而另一些人认为我们正迈向一个高科技天启时代 将与窃取我们工作机会的机
  • RabbitMQ消息堆积问题及惰性队列

    一 消息堆积 1 消费者堆积问题 当生产者生产消息的速度超过了消费者处理消息的速度 就会导致消息在队列中进行堆积 一定时间后会造成队列达到存储的上限 那么最开始进入队列的消息可能变成死信 会被丢弃 有关死信以及死信消息的处理问题的详细介绍可
  • LeetCode刷题-6

    数组 88 合并两个有序数组 题目描述 题目样例 Java方法 直接合并后排序 思路及算法 代码 执行结果 复杂度 Java方法 双指针 思路及算法 代码 执行结果 复杂度 Java方法 逆向双指针 思路及算法 代码 执行结果 复杂度 题目
  • 台式机计算机无线开关在哪,电脑无线wifi开关在哪里打开

    电脑无法打开wifi问题有很多 其中物理方面问题就是无线开关根本没打开 怎么可能连得上wifi呢 下面是学习啦小编整理的打开电脑wifi无线开关的方法 供您参考 打开电脑wifi无线开关的方法一 点击右下方图标 选择 所有设置 菜单 然后选
  • C#之按位或‘

    这里不介绍按位或按位与的二进制算法 网上大都说的都是关于int类型二进制的按位与和按位或的用法 这里我们来看看bool类型的用法 具体看代码 static void Main string args int i 0 Console Writ
  • Git操作记录

    版权声明 本文为博主原创文章 转载请注明出处 http blog csdn net shulianghan https blog csdn net han1202012 article details 18812279
  • MongoDB的and和or,嵌入式文档,数组查询

    现在 有一张数据表或者是集合 结构如下 我们现在对集合进行and和or查询 如下 1 隐式and查询 查询年龄大于15 且性别属于男性的数据 db tb find age gt 15 sex male 关键字 gt是大于的意思 结果 2 显
  • 面向对象编程之多态性与鸭子类型

    目录 一 什么是多态 二 多态性 三 abc抽象类模块 四 鸭子类型 六 总结 一 什么是多态 一类事物有多种不同的形态 如 动物有猫 狗 鸡等 二 多态性 所谓多态性指的是不管各对象是什么数据类型就直接使用各对象中统一的方法函数 从一定程
  • 向量与矩阵求导与实例分析

    说明 1 相关内容经过诸多学习内容整理 2 比较权威的学习源可参考维基百科 https en wikipedia org wiki Matrix calculus Scalar by vector identities 3 机器学习关联内容
  • IDEA如何创建一个web项目

    1 点击File gt new gt project 选择maven 2 点击create from archetype 在下面选择webapp 3 下一步 groupid随便填 4 下一步填写项目名字然后完成创建项目 如果第一次创建需要等
  • Python使用K-means聚类分析

    Python使用K means聚类分析 文章目录 Python使用K means聚类分析 介绍 1 集群标签作为特征 一 k 均值聚类 二 示例 加州住房 2 KMeans 总结 介绍 提示 这里可以添加本文要记录的大概内容 本文将使用所谓
  • NP是什么意思?

    举例叙述 转自百度百科 纯为学习笔记 编辑 在一个周六的晚上 你参加了一个盛大的晚会 由于感到局促不安 你想知道这一大厅中是否有你已经认识的人 你的主人向你提议说 你一定认识那位正在甜点盘附近角落的女士罗丝 不费一秒钟 你就能向那里扫视 并
  • 实验5-3 使用函数求奇数和 (15分)

    http pta patest cn pta test 13 exam 3 question 461 include
  • python官网网址是什么意思_python官网是什么

    python官网就是python的官方网站 网址为www python org python官网是我看过的比较简洁的官网之一 进入首页映入眼帘的首先是几个python代码的示例 用以表示python的一些特性 有趣的 是 python官网几
  • PageObject模型和自动化框架(一)

    本文是我对UI自动化测试和基于Appium自动化框架的一点点浅显的总结 如果表述中有什么谬误 欢迎博友热心指出 在此提前表示感谢 另外 该文也算是学习过程中的一个笔记 如有入门自动化相关行业的朋友 欢迎交流 UI自动化测试 Web app和