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

news2024/7/6 19:12:02

软件测试专栏

感兴趣可看:软件测试专栏
                     自动化测试学习部分源码
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 By

class 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, SuccessMessageLocators

class LoginPage:
    def __init__(self, driver):
        self.driver = driver

    def 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.title


class HomePage:
    def __init__(self, driver):
        self.driver = driver

    def 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 = driver

    def 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 = driver
    yield
    driver.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.coloradmin.cn/o/1306466.html

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

相关文章

混频原理与频谱搬移

文章目录 混频器频谱搬移何为镜像频率信号的复混频参考 混频器 混频器是一个三端器件,两个输入一个输出,输出信号等于输入信号的乘积。所以混频器可以将两个不同频率的信号通过相乘的方式,从而产生原本两个频率和与差的新信号。 数学推导举…

vue文件下载请求blob文件流token失效的问题

页面停留很久token失效没有刷新页面,这时候点击下载依然可以导出文件,但是文件打不开且接口实际上返回的是401,这是因为文件下载的方式通过window创建a标签的形式打开的,并没有判断token失效问题 const res await this.$axios.…

Unity | Shader基础知识(第一集:unity中最简单的shader)

一、unity的shader unity写的shader并不是真正意义上的shader。 简单解释:真正的shader语言写起来还是麻烦的,unity希望大家写起来简单一点,于是在原来的基础上,给大家优化了一个语言,叫shaderLab,所以我…

PyTorch深度学习实战(25)——自编码器

PyTorch深度学习实战(25)——自编码器 0. 前言1. 自编码器2. 使用 PyTorch 实现自编码器小结系列链接 0. 前言 自编码器 (Autoencoder) 是一种无监督学习的神经网络模型,用于数据的特征提取和降维,它由一个编码器 (Encoder) 和一…

智慧燃气让城市能源系统高效运行

关键词:智慧燃气、燃气数字化、智慧燃气平台、智慧燃气解决方案、智慧燃气系统 随着我国城镇燃气行业的发展,燃气行业管理及服务从简单的手工运作阶段迈入数字燃气阶段,大量采用信息化手段管理燃气业务,智慧燃气应运而生。它既是…

互动时代的新趋势

数字人直播是指通过数字化技术将虚拟人物以真实的方式呈现在观众面前,并实现与观众的实时互动的一种新型娱乐形式。近年来,随着科技的发展和社交媒体的兴起,数字人直播越来越受到人们的关注,并成为当今互动时代的新趋势。 首先&a…

centos7x 安装支持gpu驱动的docker

1、卸载以前版本的驱动 sudo /usr/bin/nvidia-uninstall2、先安装基础项 yum install kernel kernel-devel gcc make -yyum install kernel kernel-devel gcc gcc-c make -y 3、禁用驱动源 nouveau echo "blacklist nouveau " >>/etc/modp…

移动CRM:智能化助力,销售更高效

商机稍纵即逝,及时把握机会才能促成更多交易。想要在出差途中也能掌握公司运营情况?得益于移动互联网的快速发展,现在您可以利用移动CRM客户管理系统,实时管理线索,查看销售数据。本文将向您介绍,移动CRM能…

热分析和报告软件 :FLIR Thermal Studio Pro Crack

FLIR 热工作室套件。FLIR Thermal Studio Pro FLIR Thermal Studio Suite 可帮助用户简化检查、组织数据并管理数千张热图像和视频——无论他们使用的是手持式热像仪、无人机系统 (UAS)、声学成像相机还是光学气体成像(OGI)相机。该订阅软件提供了关键组…

Qt提升绘制效率,绘制加速。

在我们绘制一些复杂逻辑且数据量巨大的图形时,经常会出现流畅性问题,本文就是来进行讲解如何提升绘制效率的。 实现思路: 场景1:我们绘制多个静态图形和绘制一张图片哪个更快。很明显绘制多个图形的时候要慢很多。所以我们将多个图…

Web漏洞分析-文件解析及上传(上)

随着互联网的迅速发展,网络安全问题变得日益复杂,而文件解析及上传漏洞成为攻击者们频繁攻击的热点之一。本文将深入研究文件解析及上传漏洞,通过对文件上传、Web容器IIS、命令执行、Nginx文件解析漏洞以及公猫任意文件上传等方面的细致分析&…

* demo、源码、桌面端软件

demo demohttps://bidding-m.gitee.io/maptalks-test-next/#/ 源码 源码https://gitee.com/bidding-M/maptalks-test-next 桌面端 桌面端https://gitee.com/bidding-M/map-collection/blob/master/apps/maptalks-win-0.0.1-x64.exe

中洺科技-数据标注创就业浪潮

平凡的事不能普通的做那么就有所不同。这也是我们在这波新的AI浪潮中做副业、创业时应该思考的。 正如一些业内从业者所说,数据标注行业本身的利润其实非常有限。如果现在招聘专职数据标注人员的成本太高,只做标注项目的公司就太难立足了,数据…

微信小程序(一) —— 常见组件

文章目录 🎀项目基本组成结构📢常见的视图容器类组件viewscroll-viewswiper和swiper-item使用viewscroll-viewswiper和swiper-itemswiper标签属性 🌶️常用的基础内容组件textrich-text 📮其他常用组件buttonimagenavigator &…

简易的JS逆向解码

在实战的漏洞挖掘中阅读JS有以下几个作用: 1.JS中存在插件名字,根据插件找到相应的漏洞直接使用 通过控制台大致阅读网站JS代码发现此网页引用了北京的一家公司的代码,并且使用了h-net的框架,接下来我们可以百度这家公司或者是这…

基于C/C++的rapidxml加载xml大文件 - 上部分翻译

RAPIDXML手册 版本 1.13 版权所有 (C) 2006, 2009 Marcin Kalicinski有关许可证信息,请参阅随附的文件许可证 .txt。 目录 1. 什么是 RapidXml? 1.1 依赖性和兼容性1.2 字符类型和编码1.3 错误处理1.4 内存分配1.5 …

HTML---基础

文章目录 目录 文章目录 前言 一.HTML概述 二.HTML相关概念 HTML作用域 HTML标签 HTML转译字符 总结 前言 一.HTML概述 HTML(超文本标记语言)是一种用于创建网络页面的标记语言。它以标记的形式编写,该标记描述了文档的结构和内容。HTML…

黑苹果之网卡篇

今天主要来聊一下黑苹果如何选择网卡 黑苹果对硬件的要求比较局限,可以用的无线网卡也比较少,而且很多也已经涨价,这里就结合自己的使用经验,简单分享几款比较好用的黑苹果无线网卡方案。 一、BCM94360系列 如果想要稳定、省心&am…

【K8S 系列】认识k8s、k8s架构

一、什么是k8s? Kubernetes 简称 k8s,是支持云原生部署的一个平台,k8s 本质上就是用来简化微服务的开发和部署的,用于自动化部署、扩展和管理容器化应用的开源容器编排技术。对于传统的docker其实也提供了容器编排的技术docker-compose&…

gdb本地调试版本移植至ARM-Linux系统

移植ncurses库 本文使用的ncurses版本为ncurses-5.9.tar.gz 下载地址:https://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz 1. 将ncurses压缩包拷贝至Linux主机或使用wget命令下载并解压 tar-zxvf ncurses-5.9.tar.gz 2. 解压后进入到ncurses-5.9目录…