当前位置: 首页 > article >正文

自动化测试:PO模式介绍及案例

点击文末小卡片免费获取软件测试全套资料资料在手涨薪更快POPage Object设计模式是一种面向对象( 页面对象的设计模式将测试对象及单个的测试步骤封装在每个Page对象以page为单位进行管理。优点可以使代码复用降低维护成本提高程序可读性和编写效率。可以将页面定位和业务操作分开测试对象元素对象和测试脚本用例脚本提高用例的可维护非PO模式PO模式面向过程的线性脚本POM把页面元素定位和业务操作流程分开实现松耦合复用性性差UI元素的改变不需要修改业务逻辑代码只需要找到对应的PO页修改定位即可数据代码分离维护性差PO能使代码更具有可读性高复用性、可维护性PO三层模式主要分三层1.base层对象库层page页面一些公共的方法。如初始化、元素定位、点击、输入、获取文本、截图等方法2.page层操作层封装对元素的操作。将每个涉及的元素操作单独封装一个操作方法然后根据需求组装操作步骤如登录方法输入帐号输入密码点击登录三个操作进行组装3.scripts层业务层导包调用 page页面使用单元测试框架对业务逻辑进行封装测试。如实现登录直接调用page组装的登陆方法即可。三者的关系page层继承base层scripts层调用page层案例项目结构介绍创建项目如下图1. 构建基础的 BasePage 对象层创建driver浏览器驱动封装# encodingUTF-8 # 浏览器启动 from selenium import webdriver def browser(): driverwebdriver.Chrome() # driver.get(http://www.baidu.com) return driver创建myuni.py文件,初始化封装定义一个继承自unittest.TestCase的测试用例类定义setUp和tearDown这两个方法与junit相同即如果定义了则会在每个测试case执行前先执行setUp方法执行完毕后执行tearDown方法。# encodingUTF-8 import unittest from driver import * class StartEnd(unittest.TestCase): def setUp(self): self.driverbrowser() self.driver.implicitly_wait(10) self.driver.maximize_window() def tearDown(self): self.driver.quit()创建function.py文件截图功能# encodingUTF-8 import os from selenium import webdriver # 截图 def insert_img(driver,filename): func_pathos.path.dirname(__file__) # print(func_path) base_diros.path.dirname(func_path) # print(base_dir) # 将路径转化为字符串 base_dirstr(base_dir) # 对路径的字符串进行替换 base_dirbase_dir.replace(\\,/) # print(base_dir) # 获取项目文件的要目录路径 basebase_dir.split(/Website)[0] # print(base) # 指定截图存放路径(注意路径最后要加/) filepathbase/Website/test_report/screnshot/filename driver.get_screenshot_as_file(filepath) if __name____main__: driverwebdriver.Chrome() driver.get(http://www.sogou.com)2. 构建首页的 Page 层操作层创建BasePage.py文件判断打开的页面是否是预期的页面# encodingUTF-8 from time import sleep class Page(): def __init__(self,driver): self.driverdriver self.base_urlhttp://localhost self.timeout10 def _open(self,url): url_self.base_urlurl # print(这个页面url是%s%url_) self.driver.maximize_window() self.driver.get(url_) # sleep(2) assert self.driver.current_urlurl_,这不是我们想要的地址 def open(self): self._open(self.url) def find_element(self,*loc): return self.driver.find_element(*loc)创建LoginPage.py文件页面元素定位封装# encodingUTF-8 from BasePage import * from selenium.webdriver.common.by import By class LoginPage(Page): url/news/ username_loc(By.NAME,username) password_loc(By.NAME,password) submit_loc(By.NAME,Submit) def type_username(self,username): self.find_element(*self.username_loc).send_keys(username) def type_password(self,password): self.find_element(*self.password_loc).send_keys(password) def type_submit(self): self.find_element(*self.submit_loc).click() def login_action(self,username,password): self.open() self.type_username(username) self.type_password(password) self.type_submit() loginPass_loc(By.LINK_TEXT,我的空间) loginErr_loc(By.LINK_TEXT,加入收藏) def type_loginPass_hint(self): return self.find_element(*self.loginPass_loc).text def type_loginErr_hit(self): return self.find_element(*self.loginErr_loc).text3.构建业务层创建test_login.py文件导包function、myunit、LoginPage创建LoginTest类继承myunit.StartEnd初始化方法定义测试用例名字以test开头unittest会自动将test开头的方法放入测试用例集中实现登录调用LoginPage组装的登陆方法输入用户名、密码、点击登录、断言截图# encodingUTF-8 import unittest from model import function,myunit from page_object.LoginPage import * from time import sleep class LoginTest(myunit.StartEnd): def test_login1_normal(self): print(test_login1_normal测试开始) poLoginPage(self.driver) po.login_action(yuruyi,12345678) sleep(5) self.assertEqual(po.type_loginPass_hint(),我的空间) function.insert_img(self.driver,login_normal.png) print(test_login1_normal执行结束) def test_login2_PasswdError(self): print(test_login2_PasswdError测试开始) poLoginPage(self.driver) po.login_action(yuruyi,1234567) sleep(5) self.assertEqual(po.type_loginErr_hit(),加入收藏) function.insert_img(self.driver,login_Err.png) print(test_login2_PasswdError执行结束) def test_login3_empty(self): print(test_login3_empty测试开始) po LoginPage(self.driver) po.login_action(, ) sleep(5) self.assertEqual(po.type_loginErr_hit(), 加入收藏) function.insert_img(self.driver, login_empty.png) print(test_login3_empty执行结束) if __name____main__: unittest.main()常用断言方法4. 构建用例集执行文件输出自动化测试报告在测试用例、测试文件比较多的时候使用统一的主测试执行文件进行测试用例的执行非常方便这就需要结合discover方法和TextTestRunner进行。# encodingUTF-8 import unittest # 测试报告模板 from HTMLTestRunnerCN import HTMLTestRunner import time report_dir./test_report test_dir./test_case print(start run test case) discoverunittest.defaultTestLoader.discover(test_dir,patterntest_login.py) nowtime.strftime(%Y-%m-%d %H_%M_%S) report_namereport_dir/nowresult.html print(start write report..) #使用runner运行器运行测试集 with open(report_name,wb)as f: runnerHTMLTestRunner(streamf,titleTest Report,descriptionlocalhost login test) runner.run(discover) f.close() print(Test end)测试报告模板最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走这些资料对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你凡事要趁早特别是技术行业一定要提升技术功底。

相关文章:

自动化测试:PO模式介绍及案例

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快PO(Page Object)设计模式是一种面向对象( 页面对象)的设计模式,将测试对象及单个的测试步骤封装在每个Page对象以pag…...

【GitHub项目推荐--InkOS:把 AI 写小说变成“全自动流水线”】

GitHub 地址:https://github.com/Narcooo/inkos 简介 InkOS​ 是一个基于 TypeScript 开发的命令行(CLI)AI 小说创作智能体。它彻底颠覆了“单次生成”的玩法,将写小说变成了一个可审计、可续写、可仿写的工程化系统。 普通 AI …...

终极Windows安卓应用安装指南:如何快速批量安装APK文件

终极Windows安卓应用安装指南:如何快速批量安装APK文件 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想要在Windows电脑上轻松安装Android应用吗&#xf…...

K8s StatefulSet 的数据持久化方案

Kubernetes StatefulSet 的数据持久化方案解析 在云原生应用架构中,有状态服务的数据持久化一直是关键挑战之一。Kubernetes StatefulSet 作为管理有状态工作负载的核心控制器,通过独特的持久化机制为分布式数据库、消息队列等场景提供了稳定支持。本文…...

吗替麦考酚酯Mycophenolate Mofetil预防实体器官移植排斥的长期移植物存活效果

在实体器官移植领域,移植物长期存活是评估免疫抑制治疗方案成功与否的核心指标。作为新一代免疫抑制剂,吗替麦考酚酯(Mycophenolate Mofetil,MMF)凭借其独特的药理特性,已成为预防器官移植排斥反应的标准药…...

云原生技术思考

云原生技术思考:构建未来数字基础设施的核心 在数字化转型的浪潮中,云原生技术已成为企业构建敏捷、弹性与高效系统的关键。它不仅是技术栈的升级,更是一种全新的架构理念,通过容器化、微服务、DevOps等方法,帮助组织…...

宗格替尼Zongertinib靶向治疗HER2突变非小细胞肺癌的真实客观缓解率

在非小细胞肺癌(NSCLC)的治疗领域,HER2突变型非小细胞肺癌因其独特的生物学特性和治疗挑战,一直是临床研究的热点。随着靶向治疗药物的不断研发与进步,宗格替尼(Zongertinib)作为一种新型口服HE…...

从GCC源码看DWARF栈展开:_Unwind_FrameState结构体详解与调试技巧

从GCC源码看DWARF栈展开:_Unwind_FrameState结构体详解与调试技巧 调试器如何实现栈回溯?当程序崩溃时,gdb为何能准确显示调用链?这一切的核心在于DWARF调试格式中的栈展开机制。本文将深入GCC 4.8.5源码,剖析_Unwind_…...

HTML标签不区分大小写吗_标签大小写规范建议【解答】

HTML标签名必须统一用小写,因HTML5规范强制要求、工具链默认适配、团队协作需要;大写标签虽浏览器可解析,但在XHTML/XML工具、编辑器校验、SSR框架、JSX及TypeScript中均会出错。HTML 标签在解析时确实不区分大小写,但实际开发中必…...

叶片泵的结构设计及造型(论文+CAD图纸+三维图+动画仿真……)

叶片泵作为流体机械领域的关键设备,其结构设计直接影响系统效率与可靠性。其核心作用在于通过转子旋转带动叶片运动,实现流体压力能转换,广泛应用于液压系统、润滑装置及化工流程中。结构设计需兼顾密封性、耐磨性与动态平衡,例如…...

Sunshine游戏串流实战解析:构建你的专属高性能云端游戏平台

Sunshine游戏串流实战解析:构建你的专属高性能云端游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 还在为游戏设备的限制而烦恼吗?想象一下&#x…...

考拉兹猜想完整证明:全域数学理论的威力【乖乖数学】

考拉兹猜想完整证明:全域数学理论的威力【乖乖数学】 考拉兹猜想(3n1猜想)完整证明 —基于全域数学理论与平行素数对网格的统一框架 作者:乖乖数学抖音名;国际精算师SOA微信名;20260408...

Nunchaku FLUX.1 CustomV3快速部署:支持CUDA 12.4+PyTorch 2.3的开箱即用镜像

Nunchaku FLUX.1 CustomV3快速部署:支持CUDA 12.4PyTorch 2.3的开箱即用镜像 1. 开篇介绍:为什么选择这个镜像? 如果你正在寻找一个能够快速生成高质量图片的AI工具,但又不想折腾复杂的环境配置,那么Nunchaku FLUX.1…...

横河 GX90XA-10-U2N-CC无纸记录仪采集模块 适用于GP10,GP20

无纸记录仪SMARTDAC GX10/GX20通过触摸屏为用户提供更直观的操作。模块化结构支持丰富的输入/输出模块,并将不断扩展。灵活的用户界面 多种显示功能标准显示画面清晰的指示通道数据及其单位、标记,以及报警日志、信息日志和其他事件日志信息。 触摸屏实现…...

Agilent E5100A 高速网络分析仪

10 kHz 至 180 MHz/300M 提供快速测量(扫描速度高达 0.04 ms/点)、快速波形分析命令和高速处理器,可提高生产线的生产效率 使用波形分析命令和相位跟踪功能更快速地完成滤波器和谐振器评测 使用嵌入式 IBASIC 更轻松地开发自动化程序 使用蒸发…...

横河 Yokogawa 便携式无纸记录仪 GP10/GP20系列

主要特点 ● PID控制(GX90UT PID控制模块) ● 程序控制(/PG选件) ● 双测量周期 ● 高速(1ms)测量(GX90XA-04-H0 高速AI模块) ● 4线RTD输入、 电阻测量(GX90XA-06-R1 4线RTD模块) ● 再传输/手动mA输出(GX90YA模拟输出模块)技术参数 型号 GP20 GP10 结构 便携型 便…...

从Gaussian Splatting到‘像素级’镜面:手把手拆解延迟着色如何让3DGS学会精准反射

从Gaussian Splatting到像素级镜面:延迟着色技术深度解析 在计算机图形学领域,3D Gaussian Splatting(3DGS)技术因其高效的实时渲染能力而备受瞩目。然而,当场景中出现镜面反射材质时,传统3DGS方法往往力不…...

手把手教你用kimera-semantics实现3D语义重建:从环境配置到Euroc数据集运行

从零构建3D语义地图:Kimera-Semantics实战指南与Euroc数据集调优 在三维感知与机器人自主导航领域,实时语义重建技术正成为学术界和工业界的热点。MIT SPARK实验室开源的Kimera-Semantics框架,通过融合几何重建与语义分割,实现了对…...

3步快速实现知网文献批量下载:CNKI-download自动化工具完整指南

3步快速实现知网文献批量下载:CNKI-download自动化工具完整指南 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 (Web Scraper for Extracting Data) 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 你是否曾经为了收…...

11. TCN BPDU:揭秘 STP 拓扑变更的通知与收敛机制

一、TCN BPDU介绍 在 STP 网络稳定运行时,根桥会周期性发送​​​配置 BPDU​​(Configuration BPDU),用于维持整个生成树拓扑的稳定性。然而,当网络中出现链路故障、端口 UP/DOWN 等拓扑变更事件时,仅靠常…...

【Linux命令饲养指南】Ubuntu 安装 MySQL【AI辅助实现】

声明:由于本人经常记混 Linux 软件安装和卸载命令,本文相关步骤是在 AI 辅助下整理完成,仅供参考。一、APT 是啥?它和 yum 是兄弟 APT(Advanced Package Tool):Ubuntu/Debian 的包管理器&#x…...

大量TIME_WAIT状态的连接问题

服务器卡顿的元凶:TIME_WAIT连接之谜当服务器突然响应变慢,运维人员查看网络状态时,常会发现成千上万的TIME_WAIT连接。这种看似无害的状态,实则是隐藏在TCP协议中的"沉默杀手"。作为TCP四次挥手过程的最后环节&#xf…...

Genshin FPS Unlocker:三步解锁《原神》60帧限制,畅享高刷游戏体验

Genshin FPS Unlocker:三步解锁《原神》60帧限制,畅享高刷游戏体验 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否因为《原神》的60帧限制而无法充分发挥高…...

动手学深度学习——使用注意力机制的 Seq2Seq 代码

1. 前言上一篇我们已经从原理上理解了使用注意力机制的 Seq2Seq:基础 Seq2Seq 的问题是固定上下文向量注意力机制让解码器在每一步都能动态查看输入序列query 通常来自解码器当前状态key 和 value 通常来自编码器所有时间步输出这一篇就继续按李沐的节奏&#xff0c…...

科沃斯 Deebot X12 扫地机器人上市,1499 美元解锁顽固污渍清洁新体验

Deebot X12:顽固污渍清洁新利器科沃斯为 Deebot 系列自动清洁器增添新成员 Deebot X12 OmniCyclone。它利用摄像头和 AI 技术识别泥脚印、洒出的汽水渍等顽固污渍,在使用滚刷拖把清洁前,会喷洒水和清洁液的混合溶液软化污渍,使其更…...

动手学深度学习——注意力分数

1. 前言 上一篇我们已经把注意力机制代码的整体流程看清楚了: 先算 query 和 key 的相关性分数 再通过 softmax 变成注意力权重 最后对 value 做加权和 到这里,一个很自然的问题就来了: 这个“分数”到底该怎么计算? 因为注意…...

动手学深度学习——注意力机制代码

1. 前言上一篇我们已经从思想上理解了注意力机制:基础 Seq2Seq 的问题在于固定长度上下文向量解码器在不同时间步,其实应该关注输入序列的不同位置注意力机制的本质,就是对输入表示做加权和权重由当前位置和各输入位置的相关性决定这一篇就继…...

Python 安全开发全栈指南:零基础

Python 安全开发当前时间背景:2026年4月 (Python 3.14) 核心工具:Python 3.x | Requests | Lxml | Re️ 全栈知识体系思维导图mindmaproot((Python安全开发))基础核心变量与数据类型数值 (int, float)字符串 (str)布尔 (bool)运算符算术 ( - * /)赋值 ()…...

深入osgEarth内核:3DTiles加载背后的多线程机制与性能优化

深入osgEarth内核:3DTiles加载背后的多线程机制与性能优化 在三维地理信息系统开发中,osgEarth作为开源的高性能三维地球引擎,其加载海量3DTiles数据的能力直接影响用户体验。本文将深入剖析osgEarth加载3DTiles时的多线程架构设计&#xff0…...

乐高Studio与Solidworks联动指南:如何快速导入自定义3D模型并生成积木设计

乐高Studio与Solidworks联动指南:如何快速导入自定义3D模型并生成积木设计 在数字设计与实体搭建的交汇点上,乐高Studio和Solidworks的联动为创意工作者开辟了全新可能。想象一下,当你精心设计的机械结构或建筑模型能够直接转化为可拼装的乐…...