全网最火爆,Web自动化测试POM模式分层实战,框架封装看这一篇就够了

news2024/12/24 10:06:39

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

线性脚本以快递 100 网站登录举例:

Web自动化测试:https://www.bilibili.com/video/BV1MS4y1W79K/

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get("https://sso.kuaidi100.com/sso/v2/authorize.do")
driver.maximize_window()
driver.find_element(By.ID, 'name').send_keys("***********")
driver.find_element(By.ID, 'password').send_keys("***********")
driver.find_element(By.ID, 'submit').click()
time.sleep(2)
text = driver.find_element(By.PARTIAL_LINK_TEXT, '首页').text
assert text == '首页'
driver.close()

使用以上代码,最基础最简单的 Web UI 自动化测试就做起来了。
但是,问题也随之而来,线性脚本的缺点也暴露出来了:

Web UI 自动化测试,简单来说,就是模拟人在浏览器上的操作,打开浏览器 - 定位元素 - 操作元素 - 模拟页面动作 - 断言结果;

由于线性脚本中的元素定位、元素操作细节、测试数据、结果验证(断言)是捆绑在一起的,代码会显得非常冗余、可读性差、不可复用、工作量大且可维护性差;

刚开始,少数的测试用例维护起来可能很容易,但随着时间迁移、产品迭代、测试套件持续增长,脚本也越来越臃肿,可能需要维护几十个页面,且很多页面是公用的,元素的任何改变都会让我们的脚本变得繁琐复杂、耗时易出错。
例如:十几个用例中都用到了 A 元素,某一天 A 元素被前端改成了 B 元素,我们就需要去十几个用到 A 元素的地方,将 A 元素修改为 B 元素;

如果可以把公共元素抽取出来,即使元素被前端修改,我们也只需更新元素的定位方式,而不用修改每条测试用例,无论多少用例用到该元素,都只需修改元素定位方式,重新获取元素即可;

所以我们引入了 PageObject 这种解决方案,它可以帮我们解决设计上的问题,可以将 testcase 和 page 分层,形成一个非常好的结果

POM 设计模式

POM:Page Object Model,页面对象模型的简称

意指为:每个待测页面创建一个页面对象,从而将繁琐的定位操作、操作细节封装到这个页面对象中,对外只提供必要的操作接口,在调用的时候只调用提供的接口,不用去调用操作细节,最终实现程序的高内聚低耦合,使程序模块的可重用性、移植性大大增强。

在这种模式下,对于应用程序中的每个页面都应该有相应单独的页面类(例如:login_page、userinfo_page),类中应该包含此页面上的元素对象和操作这些元素对象所需要的方法

再将流程所关联的页面作为对象,将对象串联起来形成不同的业务流程,例如:在登录页面完成登录操作后跳转到用户中心页面进行个人信息的修改

PageObject 的六大原则

The public methods represent the services that the page offers
用公共方法表示页面提供的服务

例如:登录页面,有用户名输入框、密码输入框、登录按钮,于是就可以用 input_username () 代表输入用户名、用 input_password () 代表输入密码、用 click_submit () 代表点击登录按钮

Try not to expose the internals of the page
尽量不要暴露页面的内部信息

将操作细节封装成方法,对外只提供对应的方法供调用

Generally don’t make assertions
一般不使用断言

断言要和 Page 代码分开,不要将断言写在 PageObject 层

Methods return other PageObjects
方法返回其他 PageObjects

例如:首页有个方法是点击登录图标跳转到登录页面,因此这个方法应该返回 login_page

Need not represent an entire page
不需要表示整个页面

不需要对页面中的每一个元素进行建模,只需要关注我们需要用到的元素。例如:登录页面除了账号密码登录,还有快捷登录、手机短信登录、扫码登录等

Different results for the same action are modelled as different methods
同一行为的不同结果可以用不同的方法来模拟

例如:对一个页面进行操作,可能出现正确的结果或者错误的结果,可以为这两种不同的结果分别创建两个不同的方法

POM 框架实战

请添加图片描述

base:base_page,基类,定义项目所需的基础方法,对 Selenium 一些常用的 api 进行二次封装,如:find_element、click、send_keys、screenshot、调用 JavaScript 脚本的方法以及其他与浏览器相关的操作

由于每个页面都会频繁使用这些方法,若单纯使用 Selenium 原始 api,可能遇到一些问题。
例如:某个按钮未加载完成,但已触发了点击事件,导致元素定位不到而报错。这时就可以对原始 api 进行二次封装。
如:加入等待时间、对异常进行捕获并打印日志等,之后所有的 PageObject 都继承 BasePage 类,后续只需要调用这些封装好的方法,增强复用性
假设以后不使用 Selenium 这个框架,就只需要修改 BasePage 中的方法,不用去修改具体的测试用例业务代码

pages:page_object,页面对象层,也是 PO 的核心层,继承 BasePage,管理页面元素以及操作元素的方法(将操作元素的动作写成方法)

cases:测试用例层,用于管理测试用例,这里会用到单元测试框架,如:Pytest、Unittest。

data:测试数据层,用于测试数据的管理,数据与脚本分离,降低维护成本,提高可移植性,如:yml 文件数据

config:配置文件层,存放整个项目需要用到的配置项,如:URL、数据库信息等

utils:CommonUtil,公共模块,将一些公共函数、方法以及通用操作进行封装,如:日志模块、yaml 操作模块、时间模块等

run.py:批量执行测试用例的主程序,根据不同需求不同场景进行组装,遵循框架的灵活性和扩展性

logs:日志模块,用于记录和管理日志,针对不同情况,设置不同的日志级别,方便定位问题

reports:测试报告层,用于测试报告的生成和管理,如:基于 Allure 生成的定制化报告

请添加图片描述

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

只有付出才有收获,只有努力才有成功。每一次的尝试,都是你迈向胜利的一步。不要害怕失败,因为失败并不可怕,可怕的是放弃。相信自己,坚持奋斗,你一定能成为最好的自己!

只有不断努力,才能够实现自己的梦想;只有坚持不懈,才能够创造属于自己的奇迹。不怕困难,不畏挑战,勇往直前,顽强拼搏,让我们一起为了向往的未来拼搏吧!

鞭策自己,不断前进;挑战自我,追求卓越。奋斗的道路不会一帆风顺,但只要心怀理想,始终坚定向前,就能跨越困难,迎来辉煌的胜利。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【可信平台】SO202303191426,销售订单未同步,销售出库单未同步

1.销售订单未同步 这里先说下推送逻辑:1.物料描述带有‘再生’ 。2.公司是芮邦 这个物料应该在EOS里查,可我不会,我在MES里查,的确符合条件。 可信平台同步逻辑,是销售订单同步了,才会同步销售出库单。 这个SO销售订单就没同步,要先解决这个问题。 可以在接口看日志…

HighTec编译器错误记录

目录 1、HighTec安装后缺少Universal Debug Engine 2、HighTec工程改名后不能跳转函数定义,提示找不到定义。 3、HighTec工程重复编译 1、HighTec安装后缺少Universal Debug Engine 在HighTec安装后,没有调试UDE,重装系统后还是没有&#x…

STM32F4_OLED显示

目录 1. OLED简介 2. 硬件模块 3. 8080并行接口 4. SPI方式 5. SSD1306常用命令表 6. 完整源码 (STM32F407对应的源码) 6.1 oled.c 6.2 oled.h 6.3 oledfont.h 7. IIC接口下的OLED(STM32F407搭配4Pin OLED) 7.1 OLED.c 7.2 OLED.h 7.3 OLED_Font.h 7.4 MyI2C.c …

QTableview 隐藏单元格内控件无效的原因

QTableview 隐藏单元格内控件无效的原因 背景: 在QTableview的单元格中创建多个QComboBox,当某条件成立时,隐藏特定单元格中的QComboBox,使得该单元格为空。 DEMO: #ifndef MAINWINDOW_H #define MAINWINDOW_H#inc…

【Redis】Redis键(key)

常用命令 常用案例 keys * 查看当前库所有的key 127.0.0.1:6379> keys * 1) "k1"exists key 判断某个key是否存在,存在几个则返回几,不存在则返回0 127.0.0.1:6379> exists k1 (integer) 1 127.0.0.1:6379> exists k2 (integer)…

西工大电子实习单片机-7+1亮灯编程C语言代码分享

电子实习是西工大大多数学生绕不开的一门实习课程。单片机是电子实习课程中较为重要的一部分,需要上两次。我们在单片机编程时在西工大电脑机房老系统上往往由于大一学习的C语言忘得一干二净而无从下手。流水灯成了流水账。 废话不多说,仅供参考。71是指…

分享5款办公效率工具|让你早点下班

如果每天你的工作都很多,做不完需要加班怎么办? 不知道你会不会加班,但是我肯定不会,因为我知道哪些高效率的办公工具,可以帮助我早点下班,今天来给大家分享一下。 1.FlowUs FlowUs 是一款为个人和团队打造的新一代生…

Netty通信技术进阶二

Netty核心组件 1. Bootstrap2 Channel3. EventLoopGroup 和 EventLoop3.1 eventLoopThreads 是多少? 4. ChannelHandler & ChannelHandlerContext & ChannelPipeline4.1 复用Handler4.2 ChannelInboundHandlerAdapter or SimpleChannelInboundHandler 5. By…

Linux系统之部署ZFile在线网盘服务

Linux系统之部署ZFile在线网盘服务 一、ZFile介绍1.ZFile简介2.ZFile特点 二、本地环境介绍1.本次实践说明2.本地环境规划 三、安装环境依赖1.安装java2.检查java版本 四、下载ZFile软件1.创建安装部署目录2.声明安装路径3.下载ZFile软件包4.解压ZFile软件包5.授权启动停止脚本…

FOC专题--环路PID算法拆分分析

foc中,其实foc算法并不是最难理解的,反而是在其中使用的PID算法,之前我只会套用别人的代码,但并不理解其中的各参数含义,导致在实际调整PI参数的时候,很难调到合适的值。 在实际理解什么是PID算法以及各参数…

【C++引用 】

目录 前言一、引用的概念二、使用引用时注意事项三、引用的使用场景及优势四、常引用、引用的权限五、引用和指针的区别 前言 相信大家应该在网上看过这样的段子。 大家都知道鲁迅原名周树人,浙江绍兴人。"鲁迅"是"周树人"的别名或者说是笔名…

TCP版本的 echo server 和 echo client

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言Tcp的api展示服务端客户端存在的问题解决问题服务端和客户端的大致流程 前言 上一篇文章我们介绍了UCP的客户端与服务器的一个简单实例,这篇我们简单的来介绍T…

111.【金橘社区1.0】

金橘社区1.0版本 (一)、SpringBoot整合SpringSecurity1.导入依赖2.数据库3.登入表单4. 添加配置类 SecurityConfig5.接口实现类 CkqnUserServiceImpl6.前端认证问题 (二)、SpringBoot整合Ajax1.登入表单2. JavaScript (三)、SpringBoot整合editor.md1.编写页面(1).前端页面(2).…

Windows安装RedisJSON(无需编译)

文章目录 Windows安装RedisJSON下载解压配置文件启动服务启动客户端 Windows安装RedisJSON 下载 打开网址 https://github.com/zkteco-home/RedisJson。 在网页的右上角,点击“Code”按钮,然后选择“Download ZIP”以下载最新版本的RedisJSON。 网盘 …

C6678-控制GPIO输入/输出

C6678-控制GPIO输入/输出 术语寄存器起始地址原理输入输出测试中断功能原理中断原理框图芯片中断控制器原理框图内核中断控制器原理框图中断路由架构一级中断表二级中断表CIC0二级中断CIC1二级中断CIC2二级中断CIC3 中断演示代码参考资料 术语 NMI: 不可屏蔽中断CI…

6、在vscode上利用cmake创建第一个简单C++程序

文章目录 (1)前期准备工作:即安装对应的环境1)在vscode上安装插件:C/C、Cmake、CMake tools2)安装Cmake环境(这是在前面博客提到的已经安装好gcc等环境的前提下进行的) (…

Springboot基础学习之(二十二):异步任务和邮件任务

方向一:高效学习方法分享 我认为学习的最好的办法就是做笔记:本人特别喜欢在网上学习一些课堂外的知识,但是如果你没有及时的复习,要想找到自己想要的知识该怎么办呢?对,就是做笔记我在csdn这个app发的所有内容都是笔记…

Android UI布局优化之include、merge与ViewStub标签的巧用方法

前言 在开发中UI布局是我们都会遇到的问题,随着UI越来越多,布局的重复性、复杂度也会随之增长。 相信大家经常听到include、merge、ViewStub这样的标签,官方也提到这三种布局可用于布局的优化。今天就介绍下这三种布局的使用,记…

SRv6项目实践(一):环境与工具介绍

在一切开始之前,首先介绍一下我们要做什么,做这个要有什么基础,以及实现的环境 1,实验目标与实验基础 我们要在图下图所示的拓扑中,完成在如以下拓扑所示的网络中,配合ONOS实现基本的L2L3转发以及SRv6&am…

港联证券|券商再迎利好!这一比例大幅下调,释放300亿资金

券商利好接二连三。 4月10日,即日起下调证券公司转融通保证金份额。资信优质的公司,保证金份额由20%下调至5%;资信杰出的公司,由20%下调至10%;其余公司由25%下调至15%。中证金融预计,保证金份额下调后&…