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

news2025/7/2 14:45:42

介绍

前面一篇讲了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.param
    print("参数后置")

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.param
    print("参数后置")

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

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.param
    print("参数后置")

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):
    # 前置操作setup
    print("==再次打开浏览器==")
    test = "test_addfinalizer"

    def fin():
        # 后置操作teardown
        print("==再次关闭浏览器==")

    request.addfinalizer(fin)
    # 返回前置操作的变量
    return test

def 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初始化的参数")
    yield
    print("多个参数后置")

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

七、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.coloradmin.cn/o/996934.html

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

相关文章

【C++】string类模拟实现上篇(附完整源码)

目录 前言1. string的基本结构2. 构造函数、析构函数2.1 构造函数的实现2.1.1带参构造函数 2.2析构函数2.3无参构造函数2.4无参和带参构造函数合并 3. string的遍历3.1 operator[ ]3.2迭代器模拟实现 (简单实现)3.3 const迭代器模拟实现 4. 数据的增删查改4.1 reser…

最经典的解析LSA数据库(第六课)

初步认识OSPF的大致内容(第三课)_IHOPEDREAM的博客-CSDN博客 1 OSPF 工作过程 建立领居表 同步数据库 今天来 说一说数据库概念 计算路由表 2 什么是数据库? 数据库是一个组织化的数据集合,用于存储、管理和检索数据。它是一个可访问的集合&#x…

[SICTF 2023 #Round2] Crypto,PWN,Reverse

似乎很久没写了。 周五到周日,两天的这个比赛,有些东西还真是头回用,值得纪录一下。 Crypto 密码这块这届还是比较简单的,没有复杂的题,但量大分多。 【签到】古典大杂烩 给了一堆emoji的图 🐩&#x…

英国私校的艺术奖学金有哪些?申请要求和申请流程详解!

众所周知,英国私校不仅学术拔尖,在对学生艺术方面的培养也是毫不逊色的。几乎打开每一所英国私校的官网,都可以看到学校罗列的提供的各类课外艺术活动的精彩照片。      每个英国私校除了课后开设的五花八门的兴趣课外,还有各…

【项目 计网12】4.32UDP通信实现 4.33广播 4.34组播 4.35本地套接字通信

文章目录 4.32UDP通信实现udp_client.cudp_server.c 4.33广播bro_server.cbro_client.c 4.34组播multi_server.cmulti_client.c 4.35本地套接字通信ipc_server.cipc_client.c 4.32UDP通信实现 udp_client.c #include <stdio.h> #include <stdlib.h> #include <…

2023-09-10 LeetCode每日一题(课程表 II)

2023-09-10每日一题 一、题目编号 210. 课程表 II二、题目链接 点击跳转到题目位置 三、题目描述 现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在…

hive葵花宝典:hive函数大全

文章目录 版权声明函数1 函数分类2 查看函数列表3 数学函数取整函数: round指定精度取整函数: round向下取整函数: floor向上取整函数: ceil取随机数函数: rand幂运算函数: pow绝对值函数: abs 4 字符串函数字符串长度函数&#xff1a;length字符串反转函数&#xff1a;reverse…

表情识别-情感分析-人脸识别(代码+教程)

表情识别 面部情绪识别&#xff08;FER&#xff09;是指根据面部表情识别和分类人类情绪的过程。通过分析面部特征和模式&#xff0c;机器可以对一个人的情绪状态作出有根据的推断。这个面部识别的子领域高度跨学科&#xff0c;涉及计算机视觉、机器学习和心理学等领域的知识。…

解析Spring Boot中的Profile:配置文件与代码的双重掌控

目录 创建一个spring boot 项目spring boot 中的配置体系配置文件与 Profile代码控制与Profile 创建一个spring boot 项目 基于 Spring Boot 创建 Web 应用程序的方法有很多,我们选择在idea中直接进行创建&#xff0c;服务器URL选择Spring Initializer 网站&#xff0c;类型选…

libnetcdf.so.19: cannot open shared object file: No such file or directory

Linux编译程序时出现问题 在linux系统上&#xff0c;编译一个工具包后&#xff0c;在运行该工具包时&#xff0c;出现以下报错&#xff1a; libnetcdf.so.19: cannot open shared object file: No such file or directory仔细分析报错信息可以发现&#xff1a;在运行该工具包…

UG\NX二次开发 判断向量在指定的公差内是否为零,判断是否是零向量 UF_VEC3_is_zero

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 判断向量在指定的公差内是否为零,判断是否是零向量 UF_VEC3_is_zero 效果: 代码: #include "me.hpp"void ufusr(char* param, int* retco…

Pytorch实现基于LSTM的情感分析

文章目录 本文参考导入必要的包介绍torchnet做数据的导入给必要的参数命名加载文本数据数据前处理模型训练验证 本文参考 PyTorch深度学习项目实战100例 https://weibaohang.blog.csdn.net/article/details/127154284?spm1001.2014.3001.5501 这段代码是一个基于PyTorch实现…

LeetCode(力扣)37. 解数独Python

LeetCode37. 解数独 题目链接代码 题目链接 https://leetcode.cn/problems/sudoku-solver/description/ 代码 class Solution:def solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."…

使用数据库表快速生成代码

这里使用的EasyCode插件&#xff0c;直接下载即可&#xff0c;这里需要有数据库的技术与使用idea&#xff0c;会使用起来更流畅&#xff01; 使用idea连接数据库 右键选择表 勾选你所需要的添加&#xff0c; 鄙人一般除了debug&#xff0c;其他都会勾选上 点击确定&#xff0c;…

【电源专题】不合理接地引发的典型问题及地环路隔离的方法

在文章:【电源专题】接地的类型 中我们讲到因为历史的原因接地在不同时期的概念是不同的。到了如今大规模的集成电路时代,在单板中接地其实是想要一个参考电位,一个等势点。 但是理想终究是理想,在现实接地中,往往因为接地平面的阻抗不是0,而电源电流过大、信号频率过高…

目标检测笔记(十五): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOX介绍三、源码获取四、环境搭建4.1 环境检测 五、数据集准备六、模型训练七、模型验证八、模型测试 一、目标检测介绍 目标检测&#xff08;Object Detection&#xff09;是计算机视觉领域的一项重要技术&#xff0c;旨在识别图像或视频中的…

Linux权限的概念和管理

Linux权限的概念和管理 1. Linux权限的概念2. Linux权限管理2.1 文件访问者的分类&#xff08;人&#xff09;2.2 文件类型和访问权限&#xff08;事物属性&#xff09;2.2.1 文件类型2.2.2 基本权限 2.3 文件权限值的表示方法2.4文件访问权限的相关设置方法1. chmod&#xff0…

C++的运算符重载介绍

所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。 实际上,我们已经在不知不觉中使用了运算符重载。例如,+号可以对…

IDEA控制台取消悬浮全局配置SpringBoot配置https

IDEA控制台取消悬浮 idea 全局配置 SpringBoot(Tomcat) 配置https&#xff0c;同时支持http 利用JDK生成证书 keytool -genkey -alias httpsserver -keyalg RSA -keysize 2048 -keystore server.p12 -validity 3650配置类 Configuration public class TomcatConfig {Value(&quo…

【golang】调度系列之m

调度系列 调度系列之goroutine 上一篇中介绍了goroutine&#xff0c;最本质的一句话就是goroutine是用户态的任务。我们通常说的goroutine运行其实严格来说并不准确&#xff0c;因为任务只能被执行。那么goroutine是被谁执行呢&#xff1f;是被m执行。 在GMP的架构中&#xff…