Pytest系列-fixture的详细使用和结合conftest.py的详细使用(3)

介绍

前面一篇讲了setup、teardown可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局生效的。
Fixture是pytest的非常核心功能之一,在不改变被装饰函数的前提下对函数进行功能增强,经常用于自定义测试用例前置和后置工作,更强大灵活。

一 、Fixture的优势

  • fixture命名方式灵活,不局限于 setup 和teardown 那几个命名规则
  • conftest.py 配置里可以实现数据共享,不需要 import就能够自动搜索需要的fixture
  • fixture 配置不同的参数可以轻松实现跨文件共享前置、session会话共享

二、fixture工作原理

  • 在普通函数上使用@Pytest.fixture()装饰器,声明函数为一个fixture函数
  • 如果测试用例函数的参数列表中存在fixture的函数名或者使用@pytest.mark.usefixtures(fixture_name)
  • 在测试执行阶段,pytest执行用例之前执行fixture函数功能
  • 如果fixture装饰的函数无返回值,相当于用例前置操作,否则相当于传参
  • 如果fixture设置了后置操作,则用例执行完成后进行执行

三、fixture的参数

@pytest.fixture(scope="function",params=None,autouse=True,ids=None,name=None)
def test():print("fixture初始化的参数")

参数

1、scope:可以理解成fixture的作用域。
(1) function:在函数之前和之后执行。函数测试用例时使用时需要引用参数 def test(seif,fixtures_def)

  • 手动调用的方式是在测试用例的参数里面加入 fixture的名称。
  • 如果说fixture有通过return或yield返回值的话,那么可以把这个值传递到测试用例中。值是通过固件的名字传递的。

参考用例:

import pytest@pytest.fixture(scope="function",autouse=False)
def test_fixture():print("fixture初始化的参数")return "success"   #后面不能有其他语句#yield "success"   #后面可以有其他语句#print("参数后置")class TestFixture:def test_one(self):print("测试用例1")def test_two(self,test_fixture):print("测试用例2")print(test_fixture)def test_three(self):print("测试用例1")if __name__ == '__main__':pytest.main()

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

(2) class:在类之前和之后执行。

  • 手动调用的方式是在类的上面加@pytest.mark.usefixtures(“login”)装饰器

参考用例:

import pytest@pytest.fixture(scope="class",autouse=False)
def test_fixture():print("fixture初始化的参数")yield "success"   #后面可以有其他语句print("参数后置")@pytest.mark.usefixtures("test_fixture")
class TestFixture:def test_one(self):print("测试用例1")def test_two(self,test_fixture):print("测试用例2")print(test_fixture)class TestStudy:def test_three(self):print("测试用例3")if __name__ == '__main__':pytest.main()

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

(3) module:每一个.py文件调用一次
参考用例:

import pytest@pytest.fixture(scope="module",autouse=False,)
def test_fixture():print("fixture初始化的参数")yield "success"print("参数后置")# 通过参数方式使用fixture
def test_01(test_fixture):print("类外面的测试用例")class TestFixture:def test_one(self):print("测试用例1")def test_two(self,test_fixture):print("测试用例2"+test_fixture)if __name__ == '__main__':pytest.main()

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

(4) package/session:在整个项目会话之前和之后,即开始执行pytest到结束测试一般用于打开浏览器、启动APP、登录等操作。会结合conftest.py文件来实现

2、autouse:默认False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture,无需传入fixture函数名,作用范围跟着scope走(注意使用)。

3、param:实现参数化

  • 如何把值传到Fixture是通过fixture函数的参数里面加入request来接收参数。然后通过request.param来取值。(这里的param没有s)
@pytest.fixture(scope="function",autouse=False,params=read_yaml())
def test_fixture(request):print("fixture初始化的参数")yield (request.param)print("参数后置")

参考用例:

import pytest#读取数据文件
def read_yaml():return ['cehsi','houduan','qianduan']#return [{'a':'b'},{'c','d'}]@pytest.fixture(scope="function",autouse=False,params=read_yaml())
def test_fixture(request):print("fixture初始化的参数")yield request.paramprint("参数后置")class TestFixture:def test_one(self):print("测试用例1")def test_two(self,test_fixture):print("测试用例2"+test_fixture)#print("测试用例2"+str(test_fixture)) #数据是字典的话需要强转if __name__ == '__main__':pytest.main()

执行结果:
在这里插入图片描述
5、ids:不单独使用,需要与params配合使用,一对一关系,作用是对参数起别名。
参考用例:

@pytest.fixture(scope="function",autouse=False,params=read_yaml(),ids=['a','b','c'])
def test_fixture(request):print("fixture初始化的参数")yield request.paramprint("参数后置")

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

5、name:作用给Fixture取别名,用来区分不同的使用。
【特别注意】:一旦使用别名之后,那么fixture的名称就不能用了。只能用别名。
参考用例:

import pytest#读取数据文件
def read_yaml():return ['cehsi','houduan','qianduan']#return [{'a':'b'},{'c','d'}]@pytest.fixture(scope="function",autouse=False,params=read_yaml(),ids=['a','b','c'],name='abc')
def test_fixture(request):print("fixture初始化的参数")yield request.paramprint("参数后置")class TestFixture:def test_one(self):print("测试用例1")def test_two(self,abc):print("测试用例2"+abc)#print("测试用例2"+str(test_fixture)) #数据是字典的话需要强转if __name__ == '__main__':pytest.main()

注意

@pytest.mark.usefixtures():

  • 在类声明上面加 @pytest.mark.usefixtures() ,代表这个类里面所有测试用例都会调用该fixture
  • 可以叠加多个 @pytest.mark.usefixtures() ,先执行的放底层,后执行的放上层
  • 可以传多个fixture参数,先执行的放前面,后执行的放后面
  • 如果fixture有返回值,用 @pytest.mark.usefixtures() 是无法获取到返回值的,必须用传参的方式(方式一)

四、 Fixture中yield来实现teardown

用fixture实现teardown并不是一个独立的函数,而是用 yield 关键字来开启teardown操作,使用可参考上面的测试用例。

yield注意事项

  • 如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容
  • 如果测试用例抛出异常,yield后面的teardown内容还是会正常执行

yield+with的结合

# 官方例子
@pytest.fixture(scope="module")
def smtp_connection():with smtplib.SMTP("smtp.gmail.com", 587, timeout=5) as smtp_connection:yield smtp_connection  # provide the fixture value

smtp_connection 连接将测试完成执行后已经关闭,因为 smtp_connection 对象自动关闭时, with 语句结束。

五、 addfinalizer 终结函数

@pytest.fixture(scope="module")
def test_addfinalizer(request):# 前置操作setupprint("==再次打开浏览器==")test = "test_addfinalizer"def fin():# 后置操作teardownprint("==再次关闭浏览器==")request.addfinalizer(fin)# 返回前置操作的变量return testdef test_anthor(test_addfinalizer):print("==最新用例==", test_addfinalizer)

注意事项

  • 如果 request.addfinalizer() 前面的代码,即setup部分已经抛出异常了,则不会执行 request.addfinalizer() 的teardown内容(和yield相似,应该是最近新版本改成一致了)
  • 可以声明多个终结函数并调用

六、Fixture结合conftest.py的使用

conftest.py的介绍

1、pytest会默认读取conftest.py里面的所有fixture
2、 conftest.py是专门用于存放fixture的配置文件。名称是固定的,不能变。
3、在 conftest.py文件里面所有的方法在调用时都不需要导包,pytest会自动查找。
5、 conftest.py文件可以有多个,并且多个 conftest.py文件里面的多个 fixture可以被一个用例调用
6、conftest.py只对同一个package下的所有测试用例生效

conftest.py文件一般写在项目的根路径下面,文件名不要写错

参考用例:
testcase.py

# 通过参数方式使用fixture
def test_01(abc):print("类外面的测试用例")class TestFixture:def test_one(self):print("测试用例1")def test_two(self,abc,sd):print("测试用例2"+abc+sd)if __name__ == '__main__':pytest.main()

conftest.py


import pytest@pytest.fixture(scope="function",autouse=False,name='abc')
def test_fixture():print("fixture初始化的参数")yield "success"print("参数后置")@pytest.fixture(scope="function",autouse=False,name='sd')
def test_study():print("多个fixture初始化的参数")yieldprint("多个参数后置")

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

七、Fixture的优先级

  • 较高 scope 范围的fixture(session)在较低 scope 范围的fixture( function 、 class )【session > package > module > class > function】
  • 具有相同作用域的fixture遵循测试函数中声明的顺序,并遵循fixture之间的依赖关系【在fixture_A里面依赖的fixture_B优先实例化,然后到fixture_A实例化】

八、setup、teardown、setup_class、teardown_class、fixture、conftest优先级

会话:fixture的session级别的优先级最高。

类:fixture的class级别的优先级最高。
类:setup_class

函数:fixture的function级别的优先级最高。
函数:setup

九、总结Pytest的执行过程

1、查询当前目录下的 conftest.py 文件;
2、查询当前目录下的 pytest.ini 文件,找到测试用例的位置;
3、查询用例目录下的 conftest.py 文件;
4、查询py文件中是否有setup_class、teardown_class;
5、再根据 pytest.ini 文件的测试用例规则去查询用例并执行。

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

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

相关文章

网络原理

网络原理 传输层 UDP 特点 特点:无连接,不可靠,面向数据报,全双工 格式 怎么进行校验呢? 把UDP数据报中的源端口,目的端口,UDP报文长度的每个字节,都依次进行累加 把累加结果&a…

Kafka源码分析之网络通信

1、生产者网络设计 架构设计图 2、生产者消息缓存机制 1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器,首先得从 Deque 里找到自己的目标分区,如果没有就新建一个批量消息 Deque 加进入 2、消…

excel中的引用与查找函数篇1

1、COLUMN(reference):返回与列号对应的数字 2、ROW(reference):返回与行号对应的数字 参数reference表示引用/参考单元格,输入后引用单元格后colimn()和row()会返回这个单元格对应的列号和行号。若参数reference没有引用单元格,…

【APUE】标准I/O库

目录 1、简介 2、FILE对象 3、打开和关闭文件 3.1 fopen 3.2 fclose 4、输入输出流 4.1 fgetc 4.2 fputc 4.3 fgets 4.4 fputs 4.5 fread 4.6 fwrite 4.7 printf 族函数 4.8 scanf 族函数 5、文件指针操作 5.1 fseek 5.2 ftell 5.3 rewind 6、缓冲相关 6.…

软件测试/测试开发丨学会与 AI 对话,高效提升学习效率

点此获取更多相关资料 简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中,沟通本来就是很重要的一门课程,沟通的过程中表达越清晰,给到的信息越多,那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理&…

Java“牵手”ebay商品详情数据,ebay商品详情API接口,ebayAPI接口申请指南

天猫平台商品详情接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口,通过…

Java多线程4种拒绝策略

文章目录 一、简介二、AbortPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 三、CallerRunsPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 四、DiscardPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 五、DiscardOldes…

微信小程序AI类目-深度合成-AI问答/AI绘画 互联网信息服务算法备案审核通过教程

近期小程序审核规则变化后,很多使用人类小徐提供的chatGPT系统的会员上传小程序无法通过审核,一直提示需要增加深度合成-AI问答、深度合成-AI绘画类目,该类目需要提供互联网信息服务算法备案并上传资质,一般对企业来说这种务很难实…

ARMv7-A 那些事 - 2.通用寄存器与流水线

By: Ailson Jack Date: 2023.09.10 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/154.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…

Visual Studio 2019 简单安装教程

思路 官方页面下载 – 安装Visual Studio Installer – 安装Visual Studio 2019 下载 打开页面:Visual Studio 2019 生成号和发布日期 | Microsoft Learn 点击需要的版本,跳转后会开始下载在线安装包,这里选择第一个Community版本 安装 …

SpringMVC(一)

1.SpringMVC简介 1.1 什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean:专门存储业务逻辑的,如Student、Us…

一篇博客教会您SpringMVC文件上传、下载,多文件上传及工具jrebel的使用

目录 一.文件上传 二.文件下载 三.多文件上传 四,jrebel的介绍 前言: 我们之前已经实现了SpringMVC的增删改查,今天这一篇博客教会您SpringMVC文件上传、下载,多文件上传及工具jrebel的使用,希望这篇博客能够给正在…

图解系列 图解Kafka之Producer

开局一张图,其他全靠吹 发送消息流程如下: 1.初始化流程 指定bootstrap.servers,地址的格式为 host:port。它会连接bootstrap.servers参数指定的所有Broker,Producer启动时会发起与这些Broker的连接。因此,如果你为这…

TCP的滑动窗口协议有什么用?

分析&回答 滑动窗口协议: TCP协议的使用维持发送方/接收方缓冲区 缓冲区是 用来解决网络之间数据不可靠的问题,例如丢包,重复包,出错,乱序 在TCP协议中,发送方和接受方通过各自维护自己的缓冲区。通…

批量采集的时间管理与优化

在进行大规模数据采集时,如何合理安排和管理爬取任务的时间成为了每个专业程序员需要面对的挑战。本文将分享一些关于批量采集中时间管理和优化方面的实用技巧,帮助你提升爬虫工作效率。 1. 制定明确目标并设置合适频率 首先要明确自己所需获取数据的范…

记录在windows下安装MySQL所遇到的各种坑

1.下载 从官网下载installer 然后开始选择要安装的组件 安装了很久进度都是0,无奈点击show detail以后发现,webclient异常,最后是将链接地址复制到迅雷才成功下载的 等迅雷下载完成以后,会看到有如下2个新msi文件 msi都是windows…

Python:安装Flask web框架hello world

安装easy_install pip install distribute 安装pip easy_install pip 安装 virtualenv pip install virtualenv 激活Flask pip install Flask 创建web页面demo.py from flask import Flask app Flask(__name__)app.route(/) def hello_world():return Hello World! 2023if _…

【Go基础】编译、变量、常量、基本数据类型、字符串

面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 编译 使用 go build 1.在项目目录下执行 2.在其他路径下编译 go build ,需要再后面加上项目的路径(项目路径从GOPATH/src后开始写起,编译之后的可执行文件就保存再…

【Mybatis】Mybatis的工作原理

目录 工作原理图 使用 MyBatis 操作数据库通常需要以下几个步骤: 1、配置数据库连接信息: 2、定义数据表对应的实体类: 3、编写 SQL 映射文件: 4、配置 MyBatis 映射文件: 5、创建 MyBatis 的 SqlSessionFactory&…

基于SSM的宿舍管理系统【附源码文档】

基于SSM的宿舍管理系统【附源码文档】 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色:管理员、宿舍管理员、学生 管理员:院系信息、班级信…