Pytest中fixture含返回值时如何隐式自动应用?

ops/2024/10/19 23:39:37/

在我们使用 Pytest 框架进行自动化测试时,强大的 fixture 夹具为框架的灵活应用提供了极大的便利。比如我们可以利用 fixture 的autouse属性,使它在测试方法的不同范围层级上自动生效。但如果要引用fixture的返回,我们通常还是要明确指定,稍显麻烦

autouse指定fixture,但还是需要显式携带为参数才可调用

Selenium 自动化时最常用的webdriver为例, 实现自动化时,因为webdriver 对象通常会在整个执行期间都生效,而且会频繁地进行调用。

通常的做法是可以在 conftest.py 文件中编写一个session层级的通用driver夹具,设置 autouse为启用:

conftest.py

python">@pytest.fixture(scope="session",autouse=True)
def driver():option = webdriver.ChromeOptions()  driver = webdriver.Chrome(options=option)  driver.implicitly_wait(3)  driver = webdriver.Chrome()  yield driver

然后我们在另一个测试文件中,编写测试类和测试方法时,就可以直接引用这个driver夹具

test_auto_driver.py

python">class TestDriver:  def Test_open_blog(self, driver):  driver.get("https://chengxiaqiucao.github.io/")  assert driver.title == "秋 草 观 “测” 台"

但如果整个测试工程比较大,类似的测试类、测试方法比较多的时候,每定义一次测试方法都要指定这个通用fixture,才能引用driver对象,是不是总感觉不太优雅?

Pytest内置Fixture: Request

其实大家学习过通过Fixture来参数化的方法的话,应该知道通过Fixture进行参数化,是通过pytest的一个内部fixture request来完成的。 request应该是pytest中最为重要的一个内置夹具了。而利用这个fixture,我们其实可以实现隐式地将一些通用fixture默认地传递给各个测试类

request简介

通过官方文档的介绍:

在这里插入图片描述

request 是一个用于提供当前测试方法上下文信息,以及通过param参数实现参数化的一个内置夹具。

利用request,我们可以在运行过程中获取当前fixture的诸多上下文信息。比如夹具名称、路径、当前的session、模块、类信息等。

下图是引用fixture时,断点得到的request对象属性

在这里插入图片描述在这里插入图片描述

那上例中作为一个在session级别生效的通用的fixture,我们可以通过它的session属性,获取当前session中的所有类,再将driver对象赋值给相关类属性,这样我们在定义测试类时,就可以无需另外指定fixture,直接通过类属性根据需要引用即可。

实现fixture自动赋值到类属性

所以修改上面案例的代码如下:

conftest.py

python">@pytest.fixture(scope="session",autouse=True)  
def driver(request):  """  自动应用fixture,并设置到调用的类属性中  :param request: pytest内置fixture,用于获取fixture的上下文  :return:  """    driver = webdriver.Chrome()  try:  session = request.node  for item in session.items:  cls = item.getparent(pytest.Class)  setattr(cls.obj, 'driver', driver)  yield finally:  driver.quit()

这里我们将driver对象添加为类属性,而fixture本身不再yield任何对象返回

相应的,测试脚本中,直接通过self.driver 易用类属性即可

test_auto_driver.py

python">class TestDriver:  def Test_open_blog(self, driver):  self.driver.get("https://chengxiaqiucao.github.io/")  assert self.driver.title == "秋 草 观 “测” 台"

执行效果, 用例同样正确完成执行。
在这里插入图片描述
以上~~


http://www.ppmy.cn/ops/124933.html

相关文章

前端框架对比与选择:详尽分析

1. 引言 随着互联网技术的飞速发展,前端开发技术也得到了迅猛提升。无论是大型企业还是中小型开发团队,使用前端框架来简化开发过程、提升开发效率已成为一种普遍现象。如今,市场上有众多的前端框架可供选择,如React、Vue.js、Angular等,如何在这些框架中进行选择成为了开…

FPGA 串口adc学习笔记

目录 1.在FPGA中实现串口(UART)发送和接收数据通常涉及以下步骤: 2.在FPGA中采集ADC(模数转换器)的数据通常涉及以下步骤: 仿真只会仿top文件,所以需要仿真哪个文件就将该文件设置为top文件 …

大数据-161 Apache Kylin 构建Cube 按照日期、区域、产品、渠道 与 Cube 优化

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

【分布式微服务云原生】 探索SOAP协议:简单对象访问协议的深度解析与实践

探索SOAP协议:简单对象访问协议的深度解析与实践 摘要: 在现代分布式系统中,SOAP(简单对象访问协议)扮演着至关重要的角色,提供了一种标准化的方式来实现不同系统间的通信。本文深入探讨了SOAP的工作原理、…

模板方法模式、策略模式(C++)

模板方法模式: 定义:定义一个操作算法的框架,实现步骤延迟到子类中去实现 策略模式: 定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户…

第十章 RabbitMQ消息可靠性之MQ数据持久化

目录 一、引言 二、RabbitMQ传统持久化消息 三、惰性队列 3.1. 惰性队列与传统持久化的主要区别: 四、总结 一、引言 我们在使用MQ的过程中,除了生产者发送消息/连接MQ时存在的可靠性之外,MQ自身在收发消息时也存在着消息可靠性问题。如…

vue3学习记录-watch

vue3学习记录-watch 1.watch2.watchEffect2.1 watchEffect使用2.2 watchEffect好处2.2.1 消除手动维护依赖列表的负担2.2.2 侦听一个嵌套数据结构中的几个属性 1.watch 直接总结下。。。 <script setup> import { ref, reactive, computed, watch } from vueconst inpu…

ubuntu20.04 上 opencv4 源码编译安装

下载&#xff1a; 1、opencv 4.9 2、opencv_contrilb 4.x 基础依赖库 sudo apt install -y cmake make sudo apt install -y build-essential sudo apt install -y libgtk2.0-dev sudo apt install -y libavcodec-dev sudo apt install -y libavformat-dev sudo apt install …