Pytest-@pytest.fixture夹具篇(一)

一、定义

在Python的pytest测试框架中,@pytest.fixture是一个(不是唯一)装饰器,用于定义一个测试夹具。

二、简单实例

使用参数autouser=True

@pytest.fixture(autouse=True)
def my_fixture():
    print("Setup: 准备测试环境")
    yield
    print("Teardown: 清理测试环境")

def test_example():
    print("Running: 测试函数")

执行结果

使用参数name

    @pytest.fixture(name="test")
    def my_fixture(self):
        print("Setup: 准备测试环境")
        yield
        print("Teardown: 清理测试环境")

    def test_example(self,test):
        print("测试函数")

执行结果

使用参数params和ids

pytest 中,ids 通常与 params 参数一起使用,以便为每个参数化测试提供标识符。params 提供了参数化的值,而 ids 为这些值提供了可读的标识符

class TestWebsite:
    @pytest.fixture(name="test", params=["a", "b", "c"], ids=["id_a", "id_b", "id_c"])
    def my_fixture(self, request):
        print(f"准备测试环境,使用参数 {request.param}")
        yield request.param
        print("清理测试环境")

    def test_example(self, test):
        print(f"测试函数,使用的参数是 {test}")

执行结果

使用scope

function

函数级别,默认值。每个测试函数都会调用一次夹具

class TestWebsite:
    @pytest.fixture(autouse=True, scope="function")
    def my_fixture(self):
        print(f"准备测试环境")
        yield
        print("清理测试环境")

    def test_example1(self):
        print(f"测试函数")

    def test_example2(self):
        print(f"测试函数")

执行结果

class

类级别。夹具的设置代码在第一个测试方法执行前运行一次,清理代码在最后一个测试方法执行后运行一次

@pytest.fixture(autouse=True, scope="class")
def my_fixture():
    print(f"准备测试环境")
    yield
    print("清理测试环境")

class TestA:
    def test_example1(self):
        print(f"测试函数")

    def test_example2(self):
        print(f"测试函数")


class TestB:
    def test_example1(self):
        print(f"测试函数")

    def test_example2(self):
        print(f"测试函数")

运行结果

module

模块级别。夹具在同一个模块中的所有测试函数之间共享

@pytest.fixture(autouse=True, scope="module")
def my_fixture():
    print(f"准备测试环境")
    yield
    print("清理测试环境")


class TestA:
    def test_example1(self):
        print(f"测试函数")

    def test_example2(self):
        print(f"测试函数")


class TestB:
    def test_example1(self):
        print(f"测试函数")

    def test_example2(self):
        print(f"测试函数")

运行结果

session

会话级别。整个测试会话中只创建一次夹具示例

演示该参数需要两个Python文件。

test_1

@pytest.fixture(autouse=True, scope="session")
def my_fixture():
    print(f"\nsession准备测试环境")
    yield
    print("session清理测试环境")


class TestA:
    def test_example1(self):
        print(f"测试函数session")

test_2

@pytest.fixture(autouse=True, scope="module")
def my_fixture():
    print(f"\nmodule准备测试环境")
    yield
    print("module清理测试环境")


class TestA:
    def test_example1(self):
        print(f"测试函数module")

运行结果

可以看到module级别的作用域只能在当前模块生效,而session级别的作用域,在整个会话都生效

package

包级别。这个作用域在 pytest 3.5 版本中引入,用于跨越多个模块和会话共享夹具实例,需要导入夹具。

这里使用两个不同的模块演示。

test_1

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pytest


@pytest.fixture(scope="package")
def package_fixture():
    print(f"\n准备测试环境")
    yield
    print("清理测试环境")


def test_example1(package_fixture):
    print(f"测试函数test_1")

test_2

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pytest
from .test_1 import package_fixture

def test_example1(package_fixture):
    print(f"测试函数test_2")

运行结果

三、源码解读

注释解读:对照行

纯中文

标记一个夹具工厂函数的装饰器。

这个装饰器可以用来定义一个夹具函数,无论是否带有参数。

稍后可以通过引用夹具函数的名称来调用它:测试模块或类可以使用 ``pytest.mark.usefixtures(fixturename)`` 标记。

测试函数可以直接使用夹具名称作为输入参数,在这种情况下,从夹具函数返回的夹具实例将被注入。

夹具可以通过 ``return`` 或 ``yield`` 语句向测试函数提供它们的值。当使用 ``yield`` 时,``yield`` 语句后的代码块将作为清理代码执行,无论测试结果如何,并必须恰好产生一次。

:param scope:
    这个夹具共享的范围;可以是 ``"function"``(默认)、``"class"``、``"module"``、``"package"`` 或 ``"session"`` 之一。

    这个参数也可以是一个可调用的,它接收 ``(fixture_name, config)`` 作为参数,并必须返回上述值之一的 ``str``。

    有关更多信息,请参见文档中的 :ref:`dynamic scope`。

:param params:
    一个可选的参数列表,它将导致夹具函数的多次调用以及所有使用它的测试。当前的参数可以在 ``request.param`` 中获取。

:param autouse:
    如果为 True,则对于可以看到它的所有测试,夹具函数将被激活。
    如果为 False(默认值),需要显式引用才能激活夹具。

:param ids:
    每个参数对应的一组 ID,以便它们是测试 ID 的一部分。如果没有提供 ids,它们将根据参数自动生成。

:param name:
    夹具的名称。这默认为装饰函数的名称。如果夹具在定义它的模块中使用,夹具的函数名称将被请求夹具的函数参数遮蔽;解决这个问题的一个方法是将装饰函数命名为 ``fixture_<fixturename>``,然后使用 ``@pytest.fixture(name='<fixturename>')``。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端框架有哪些?

前言 用户体验是每个开发网站的企业中的重中之重。无论后台有多方面的操作和功能&#xff0c;用户的视图和体验都必须是无缝的最友好的。这需要使用前端框架来简化交互式、以用户为中心的网站的开发。 前端框架是一种用于简化Web开发的工具&#xff0c;它提供了一套预定义的代…

[环境配置]ubuntu20.04安装后wifi有图标但是搜不到热点解决方法

最近刚入手一台主机&#xff0c;暗影精灵8plus电竞主机&#xff0c;安装ubuntu后wifi怎么都搜不到热点&#xff0c;前后重装系统6次才算解决问题。这个心酸历程只有搞技术人才明白。下面介绍我解决过程。 首先主机到手后是个windows10系统&#xff0c;我用无线网连接了一下&am…

基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…

Redis面试题整理

Redis 1、Redis主从集群 1.1、搭建主从集群 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离 1.2、主从同步原理 当主从第一次同步连接或断开重连时&#xff0c;从节点都会发送psync请求&…

sass实现文字两侧横线

sass实现文字两侧横线 自我记录 mixin 的基本作用&#xff1a; 代码复用&#xff1a;把常用的样式封装在一起&#xff0c;不需要重复写相同的代码。参数化&#xff1a;可以通过参数动态生成样式&#xff0c;提高灵活性。逻辑处理&#xff1a;结合 Sass 的控制语句&#xff0…

【最新华为OD机试E卷-支持在线评测】计算疫情扩散时间(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

【JavaScript】LeetCode:31-35

文章目录 31 反转链表32 回文链表33 环形链表34 环形链表Ⅱ35 合并两个有序链表 31 反转链表 初始化&#xff1a;cur head&#xff0c;pre null。pre和cur一起向前移。由于反转链表时&#xff0c;cur.next指向pre&#xff0c;导致cur在下次循环中就找不到了原来的cur.next&am…

微擎忘记后台登录用户名和密码怎么办?解决方法

微擎忘记后台登录名和登录密码是很常见的&#xff0c;服务器百科网fwqbk.com告诉你找回后台登录用户名和密码的方法&#xff1a; 一&#xff1a;找回微擎后台用户名 &#xff08;如果只是忘记了后台登录密码&#xff0c;请忽略此步骤&#xff0c;跳转到第二步&#xff09; 通…

2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)

引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;是连接人类与机器的重要桥梁。随着技术的不断进步&#xff0c;我们见证了从简单的文本分析到复杂的语言理解的转变。ChatGPT&#xff0c;作为自然语言处理领域的一个里程碑&#xff0c;其发展历程不仅…

C++ | Leetcode C++题解之第395题至少有K个重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestSubstring(string s, int k) {int ret 0;int n s.length();for (int t 1; t < 26; t) {int l 0, r 0;vector<int> cnt(26, 0);int tot 0;int less 0;while (r < n) {cnt[s[r] - a];…

[Golang] goroutine

[Golang] goroutine 文章目录 [Golang] goroutine并发进程和线程协程 goroutine概述如何使用goroutine 并发 进程和线程 谈到并发&#xff0c;大多都离不开进程和线程&#xff0c;什么是进程、什么是线程&#xff1f; 进程可以这样理解&#xff1a;进程就是运行着的程序&…

yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距

可实现对图片&#xff0c;视频&#xff0c;摄像头的检测 项目概述 本项目旨在实现一个集成了YOLOv5目标检测算法、图形用户界面&#xff08;GUI&#xff09;以及单目测距功能的系统。该系统能够对图片、视频或实时摄像头输入进行目标检测&#xff0c;并估算目标的距离。通过…

基于vue框架的城市网约车管理系统v34td(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,司机,订单评价,完成订单,司机接单,打车订单 开题报告内容 基于Vue框架的城市网约车管理系统开题报告 一、研究背景与意义 1.1 研究背景 随着城市化进程的加速和互联网技术的飞速发展&#xff0c;网约车服务作为一种新兴的出行方…

Java项目: 基于SpringBoot+mybatis+maven校园资料分享平台(含源码+数据库+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven校园资料分享平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用(text2sql)

LangChain 简介 LangChain 是一个开源框架&#xff0c;设计用于开发和部署与语言模型&#xff08;如大型语言模型LLM&#xff09;交互的应用程序。它提供了一种简便的方法来构建基于自然语言处理&#xff08;NLP&#xff09;的系统&#xff0c;这些系统可以执行各种任务&#…

Java XML

1、XML文件介绍 配置文件&#xff1a;用来保存设置的一些东西。 拿IDEA来举例&#xff0c;比如设置的背景图片&#xff0c;字体信息&#xff0c;字号信息和主题信息等等。 &#xff08;1&#xff09;以前是用txt保存的&#xff0c;没有任何优点&#xff0c;而且不利于阅读&a…

【API Testing and Development with Postman 2nd_001】关于本书

译者按 今天又淘到一本介绍 Postman 的宝藏级小册子&#xff0c;非常适合想进一步了解 API 接口测试的朋友们。本书最大的特点就是手把手教学。想当年第 1 版问世时&#xff0c;初出茅庐的我随便拣了书中一两招&#xff0c;就能轻松搞定工作中五花八门的 API 疑难杂症。只是当时…

《深度学习》OpenCV轮廓检测 模版匹配 解析及实现

目录 一、模型匹配 1、什么是模型匹配 2、步骤 1&#xff09;提取模型的特征 2&#xff09;在图像中查找特征点 3&#xff09;进行特征匹配 4&#xff09;模型匹配 3、参数及用法 1、用法 2、参数 1&#xff09;image&#xff1a;待搜索对象 2&#xff09;templ&am…

QT之QML学习五:添加自定义Qml组件,以及组件管理

开发环境: 1、Qt 6.7.2 2、Pyside6 3、Python 3.11.4 4、Windows 10 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!!…

JMM 指令重排 volatile happens-before

在单线程程序中&#xff0c;操作系统会通过编译器优化重排序、指令级并行重排序、内存系统重排序三个步骤对源代码进行指令重排&#xff0c;提高代码执行的性能。 但是在多线程情况下&#xff0c;操作系统“盲目” 地进行指令重排可能会导致我们不想看到的问题&#xff0c;如经…