python自动化测试实战 —— 自动化测试框架的实例

软件测试专栏

感兴趣可看:软件测试专栏
                     自动化测试学习部分源码
python自动化测试相关知识:
       【如何学习Python自动化测试】—— 自动化测试环境搭建
       【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更新driver
       【如何学习Python自动化测试】—— 页面元素定位
       【如何学习Python自动化测试】—— 时间等待
       【如何学习Python自动化测试】—— 浏览器操作
       【如何学习Python自动化测试】—— 鼠标键盘操作
       【如何学习Python自动化测试】—— 多层窗口定位
       【如何学习Python自动化测试】—— 警告框处理
       【如何学习Python自动化测试】—— Cookie 处理
       【如何学习Python自动化测试】—— expected_conditions
       【如何学习Python自动化测试】—— Python 的 unittest 框架
       【如何学习Python自动化测试】—— HTMLTestRunner 生成测试报告


自动化测试框架的实例

  • 软件测试专栏
  • 实战相关知识
  • 实战内容
    • (1)测试用例设计
    • (2)测试框架设计
    • (3)测试报告
  • 操作异常问题与解决方案
  • 附录

实战相关知识

       PO模式(Page Object模式)是一种软件测试自动化设计模式,它将网页封装成对象,通过操作对象的方法来完成自动化测试,从而将测试代码与页面逻辑分离,提高了测试代码的可维护性和可重复使用性。

       在PO模式中,每个页面或页面的一部分(如表单、菜单)都被封装到一个对象里,这个对象提供了操作页面元素的方法和属性。测试脚本只需要调用这些方法和属性,而不需要了解页面的具体实现细节。当页面元素改变时,只需要更新对象,而不需要修改测试脚本。

PO模式的优点包括:

  • 提高测试代码的可维护性和可重复使用性。
  • 降低测试代码的耦合性,测试脚本只需要关注业务逻辑,而不用关注页面实现细节。
  • 增强测试脚本的可读性和可维护性。
  • 支持多浏览器测试,只需要针对不同的浏览器实现不同的页面对象。
  • 提高测试自动化的效率和稳定性,避免了测试人员重复操作页面的失误。

实战内容

访问“新浪微博”网页 ,完成“搜索”、“登录”和“发微博”三个测试用例。

(1)测试用例设计

  1. 登录测试用例 (test_login):
    实例化LoginPage对象。
    调用click_login_button方法,点击登录按钮。
    调用verify_login_success方法,验证登录微博是否成功。

  2. 发布微博测试用例 (test_post_weibo):
    实例化HomePage对象。
    调用input_weibo_content方法,输入微博内容。
    调用click_publish_button方法,点击发布按钮。
    调用verify_publish_success方法,验证微博发布是否成功。

  3. 搜索测试用例 (test_search):
    实例化SearchPage对象。
    调用input_keyword_and_search方法,输入关键字并搜索。

(2)测试框架设计

在这里插入图片描述

       通过使用PO模式将页面元素的定位以及元素的操作分离出来,测试用例脚本直接调用这些封装好的元素操作来组织测试用例,从而实现测试用例脚本和元素定位、操作的分离。

       定义了三个页面类:LoginPage、HomePage和SearchPage,分别封装了登录页面、主页和搜索页面的操作和验证方法。样我们就可以将与页面操作相关的代码封装到对应的Page Object类中,以实现更好的代码组织和可维护性。

       在测试方法中,我们通过创建相应的Page Object实例来执行页面操作,例如在test_login中使用LoginPage执行登录操作,在test_post_weibo中使用HomePage执行发微博操作,在test_search中使用SearchPage执行搜索操作。这样可以提高代码的可读性和可维护性。

       使用了pytest作为测试框架,通过@pytest.fixture装饰器定义了setup函数,使用@pytest.mark.usefixtures装饰器将setup函数应用于测试类。测试类中定义了测试方法,最后使用pytest.main函数运行测试用例,并生成 HTML 格式的报告文件。如果该脚本直接被执行,则会运行测试用例并关闭 mpmath 中的 fp 函数。

在这里插入图片描述

封装登录页面操作和验证方法

在这里插入图片描述

封装主页页面操作和验证方法

在这里插入图片描述

封装搜索页面操作和验证方法

       “@pytest.fixture(scope=“class”)”是 Pytest 测试框架中的装饰器,我们使用了 scope=“class” 参数,它指定了该函数的作用范围为测试类级别。在 setup 夹具函数中,我们做了以下几个操作:创建了一个Chrome浏览器的实例,即 webdriver.Chrome()。最大化了浏览器窗口。设置了隐式等待时间为 10 秒,即在查找元素时,如果元素未立即出现,会等待最多10秒。打开了微博网站,即driver.get(“https://weibo.com”)。将创建的浏览器实例传递给测试类,通过request.cls.driver = driver。使用yield将控制权交还给测试类。在测试结束后,关闭浏览器,即driver.quit()。

       “这样,测试类中的测试方法就可以共享同一个浏览器实例,并在每个测试方法运行之前和之后进行相应的设置和清理工作。
在这里插入图片描述

setup函数

       “@pytest.mark.usefixtures(“setup”)”是 Pytest 测试框架中的装饰器,它告诉Pytest在运行测试类的每个测试方法之前先运行指定的函数(setup),这样可以确保在每个测试方法开始之前都进行一些必要的设置或准备工作。这样可以提高测试代码的可读性和可维护性,并减少重复代码。
在这里插入图片描述

测试类

(3)测试报告

运行结果
在这里插入图片描述

登录成功截图
在这里插入图片描述

发微博成功截图
在这里插入图片描述

搜索成功截图
在这里插入图片描述

测试报告
在这里插入图片描述

操作异常问题与解决方案

  • 异常问题:
    页面对象无法找到页面上的元素,导致定位失败。
  • 解决方法:
    检查页面对象中的元素定位方法和表达式是否正确。确认页面结构和元素属性是否发生了变化。可以使用开发者工具或浏览器插件来验证元素定位表达式是否有效。

  • 异常问题:
    在操作页面元素时,等待超时导致无法执行操作。
  • 解决方法:
    使用适当的等待机制等待元素的出现、可点击或可见状态。可以使用显式等待(WebDriverWait)等待元素出现或满足特定条件。调整等待时间,确保足够的时间加载页面或元素。

  • 异常问题:
    在测试用例中,断言条件未满足,导致断言失败。
  • 解决方法:
    检查断言条件是否正确,确保预期结果与实际结果一致。仔细查看测试数据、操作流程或页面变化等因素,确保断言条件正确。

  • 异常问题:
    在页面对象操作元素时,元素处于不可交互状态,无法执行操作。
  • 解决方法:
    确认元素是否被其他元素覆盖、隐藏或禁用。等待页面元素可交互的状态,如等待其他元素完成加载或动画。确保操作元素的可见性和可点击性。

附录

       具体的测试脚本、配置文件等源码。
第一层:将所有元素对象定位器放到一个文件(locator.py)

from selenium.webdriver.common.by import Byclass LoginPageLocators:LOGIN_BUTTON = (By.XPATH, "//*[@id='__sidebar']/div/div[2]/div[1]/div/button")class HomePageLocators:CONTENT_INPUT = (By.XPATH, "//*[@id='homeWrap']/div[1]/div/div[1]/div/textarea")PUBLISH_BUTTON = (By.XPATH, "//*[@id='homeWrap']/div[1]/div/div[4]/div/div[4]/button")class SearchPageLocators:SEARCH_BOX = (By.XPATH, "//*[@id='app']/div[2]/div[1]/div/div[1]/div/div/div[1]/div/div[2]/div/span/form/div/input")POST_BUTTON = (By.XPATH, "//*[@id='app']/div[2]/div[1]/div/div[1]/div/div/div[1]/div/div[2]/div/div/div/div[1]/div[1]/div/a/div/div/div/div[2]")class SuccessMessageLocators:SUCCESS_MESSAGE = (By.XPATH, "//*[@id='scroller']/div[1]/div[1]/div/article/div[2]/div/div/div")

第二层:将所有元素操作放到一个文件(elements.py)

import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from 自动化实验四.PageObject.locator import LoginPageLocators, HomePageLocators, SearchPageLocators, SuccessMessageLocatorsclass LoginPage:def __init__(self, driver):self.driver = driverdef click_login_button(self):login_button = self.driver.find_element(*LoginPageLocators.LOGIN_BUTTON)login_button.click()time.sleep(2)def verify_login_success(self):assert "微博 – 随时随地发现新鲜事" in self.driver.titleclass HomePage:def __init__(self, driver):self.driver = driverdef input_weibo_content(self, content):content_input = self.driver.find_element(*HomePageLocators.CONTENT_INPUT)content_input.clear()content_input.send_keys(content)def click_publish_button(self):publish_button = self.driver.find_element(*HomePageLocators.PUBLISH_BUTTON)publish_button.click()time.sleep(3)def verify_publish_success(self):success_message = self.driver.find_element(*SuccessMessageLocators.SUCCESS_MESSAGE)assert success_message.is_displayed()class SearchPage:def __init__(self, driver):self.driver = driverdef input_keyword_and_search(self, keyword):search_box = self.driver.find_element(*SearchPageLocators.SEARCH_BOX)search_box.send_keys(keyword)time.sleep(3)post_button = self.driver.find_element(*SearchPageLocators.POST_BUTTON)post_button.click()time.sleep(3)

第三层:将公共的业务场景封装到一个文件中(test_weibo_ui.py)

import pytest
from mpmath import fp
from selenium import webdriver
from 自动化实验四.Scenario.elements import LoginPage,HomePage,SearchPage@pytest.fixture(scope="class")
def setup(request):driver = webdriver.Chrome()driver.maximize_window()driver.implicitly_wait(10)driver.get("https://weibo.com")request.cls.driver = driveryielddriver.quit()@pytest.mark.usefixtures("setup")
class TestWeiboUI:def test_login(self):login_page = LoginPage(self.driver)login_page.click_login_button()login_page.verify_login_success()def test_post_weibo(self):home_page = HomePage(self.driver)home_page.input_weibo_content("今天好热啊!--20215120808")home_page.click_publish_button()home_page.verify_publish_success()def test_search(self):search_page = SearchPage(self.driver)search_page.input_keyword_and_search("自动化")if __name__ == '__main__':pytest.main(['-v', '--html=test_weibo_ui.html'])fp.close()

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

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

相关文章

python+pytest接口自动化(10)-session会话保持

在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能请求,否则会提示请登录,那么怎样解决呢? 上一篇文章我们介绍了Cookie绕过登录,其实这就是保持登录状态的方法之一。 另外一种方式则是通过session进行会…

【python】魔术方法大全——基础篇

什么是魔术方法 所谓魔法方法,它的官方的名字实际上叫special method,是Python的一种高级语法,允许你在类中自定义函数,并绑定到类的特殊方法中。比如在类A中自定义__str__()函数,则在调用str(A())时,会自动…

MySQL笔记-第12章_MySQL数据类型精讲

视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第12章_MySQL数据类型精讲1. MySQL中的数据类型2. 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4…

希亦|鲸立|小吉内衣洗衣机好用吗?强势PK“洗护一体”王者!

随着人们的生活水平的提升,越来越多小伙伴来开始追求更高的生活水平,一些智能化的小家电就被发明出来,而且内衣洗衣机是其中一个。我们对内衣裤的清洗频次会高于普通衣服,大多数人会选择手洗内衣裤,都在手洗过程不仅会…

Live800:企业做好客服质检的5大方法

在现代商业社会中,客服质量已经成为了企业竞争力的重要组成部分。一家企业的客服质量直接关系到其品牌形象和客户满意度,因此企业必须要重视客服质量,并且采取一些有效的方法来做好客服质检。下面将介绍企业做好客服质检的5大方法。 一、建立…

HI3559AV100和FPGA 7K690T的PCIE接口调试记录

1、基本情况 HI3559AV100和690t之间使用pcie2.0 x2接口连接,3559作为RC端,690T作为EP端,驱动使用XDMA。系统主要功能是FPGA采集srio接口过来的图像数据,再通过pcie把数据传递给3559,3559再实现图像数据的存储、AI处理、…

HarmonyOS鸿蒙应用开发——数据持久化Preferences

文章目录 数据持久化简述基本使用与封装测试用例参考 数据持久化简述 数据持久化就是将内存数据通过文件或者数据库的方式保存到设备中。HarmonyOS提供两两种持久化方案: Preferences:主要用于保存一些配置信息,是通过文本的形式存储的&…

面试必备的Linux常用命令

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Linux常用命令 1、文件及内容2、网络3、进程服务4、…

【FPGA】综合设计练习题目

前言 这是作者这学期上的数电实验期末大作业的题目,综合性还是十分强的,根据组号作者是需要做“4、篮球比赛计分器”,相关代码会在之后一篇发出来,这篇文章用于记录练习题目,说不定以后有兴趣或者有时间了回来做做。 …

慢SQL的治理经验

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、慢SQL导致的后果 二、可能导致慢SQL的原因 三、如何发现慢SQL 3.1 JVM Sandbox 四、识别高危SQL 4.1 阿里的重点强制SQL规…

微信小程序ios中非cover组件点击重复触发地图tap事件

现象&#xff1a; map中使用view组件的click事件会重复触发地图的tap组件&#xff0c;只在ios上出现 <map id"maps" style"width: 100vw;height: 100vh;" :latitude"latitude" :longitude"longitude":markers"markers"…

element-ui以服务方式调用loading,自定义修改icon

一、以服务的方式调用Loading 除了常用的v-loading、this.$loading我们还可以以服务的方式调用。主要有以下步骤 引入Loading服务 import { Loading } from element-ui;在需要时调用 Loading.service(options);其中 options 参数为 Loading 的配置项&#xff0c;具体见下表…

(第8天)保姆级 PL/SQL Developer 安装与配置

PL/SQL Developer 安装与配置(第8天) 咱们前面分享了很多 Oracle 数据库的安装,但是还没有正式使用过 Oracle 数据库,怎么连接 Oracle 数据库?今天就来讲讲我学习中比较常用的 Oracle 数据库连接工具:PL/SQL DEVELOPER。 PL/SQL Developer 的安装和配置对于新手来说还是…

Unity 射线检测(Raycast)检测图层(LayerMask)的设置

目录 主要内容 拓展&#xff1a; 主要内容 Raycast函数有很多重载(函数的重载根据函数的参数来决定) 这里只涉及这个重载,其余重载可以很方便得在Visual Studio中看源码获取&#xff1b; public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hit…

链游成为蓝海,潮游世界开创未来新时代

区块链、元宇宙浪潮来袭&#xff0c;为数字世界开启崭新的大门&#xff0c;一场链游模式的范式革命正在发生&#xff01; 未来&#xff0c;元宇宙中&#xff0c;链游将成为中坚力量。 潮游世界抢占时代先机&#xff0c;利用区块链技术的去中心化和数字资产的不可替代性&#x…

设计原则 | 接口隔离原则

一、接口隔离原则 1、原理 客户端不应该依赖它不需要的接口&#xff0c;即一个类对另一个类的依赖应该建立在最小的接口上。如果强迫客户端依赖于那些它们不使用的接口&#xff0c;那么客户端就面临着这个未使用的接口的改变所带来的变更&#xff0c;这无意间导致了客户程序之…

【MySQL】MySQL库的操作

MySQL库的操作 一、创建数据库创建数据库案例字符集和校验规则校验规则对数据库的影响 二、操纵数据库1、查看数据库2、查看当前正在使用的数据库3、使用数据库4、显示创建语句5、数据库删除6、数据库的修改7、备份和恢复8、查看连接情况 一、创建数据库 创建数据库的语法如下…

计网 - TCP扫盲

文章目录 知识点TCP头格式TCP有限状态机&#xff08;FSM&#xff09;为何需要TCP协议TCP的定义TCP连接的概念如何唯一确定一个TCP连接TCP vs UDPTCP拥塞控制TCP流量控制 导图 知识点 TCP头格式 TCP头部包含多个字段&#xff0c;其中一些是必需的&#xff0c;而另一些是可选的…

MySQL笔记-第18章_MySQL8其它新特性

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第18章_MySQL8其它新特性1. MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性 2. 新特性1&#xff1a;窗口函数2.1 使用窗口…

数据结构实验任务八:排序算法的实现与分析

问题描述 统计成绩&#xff1a;给出 n 个学生的考试成绩表&#xff0c;每条信息由姓名和分数组成&#xff0c;试设 计一个算法&#xff1a; 1.按分数高低次序&#xff0c;打印出每个学生在考试中获得的名次&#xff0c;分数相同的为同 一名次&#xff1b; 2.按名次列出每个学生…