pytest的fixture梳理

fixture特性

夹具是在测试中用于提供共享资源、设置测试环境或模拟行为的工具。

1. 可以重复使用,多个用例可以使用同一个fixture

2. 一个测试用例可以使用多个装置

python 复制代码
import pytest
# Arrange
@pytest.fixture
def first_entry():
    return "a"

# Arrange
@pytest.fixture
def second_entry():
    return 2

# Arrange
@pytest.fixture
def order(first_entry, second_entry):
    return [first_entry, second_entry]

2.1 如果多个装置存在yield,则是先进后出

python 复制代码
import pytest

@pytest.fixture
def a():
    print("hello")
    yield
    print("this is a")

@pytest.fixture
def b():
    print("world")
    yield
    print("this is b")

def test_demo(a, b):
    print("this is test_demo")

if __name__ == '__main__':
    pytest.main(["-sv", "test1.py"])

3. fixture的返回值不需要接收

  • 如果一个fixture存在返回值,那么可以通过函数名直接使用其返回值,如下所示:
python 复制代码
import pytest
@pytest.fixture
def first_entry():
    return "a"

def test_a(first_entry):
    print(first_entry)

if __name__ == '__main__':
    pytest.main(["-sv","test1.py"])

4. fixfure多重嵌套

  • 如下append_first、test_string_only并且此fixture缓存即order,根据gpt即我的测试
    如果一个 fixture 被请求了多次,但它的作用范围是函数级别(默认),那么这个 fixture 在每次请求时都会重新执行一次,而不会缓存。这会导致每次请求获得的数据都是独立的,不受前一次请求的影响。

所以一般不要使用缓存,保证起独立性

python 复制代码
import pytest

# Arrange
@pytest.fixture
def first_entry():
    return "a"


# Arrange
@pytest.fixture
def order():
    return []
    
# Act
@pytest.fixture
def append_first(order, first_entry):
    order.append(first_entry)
    return order

def test_string_only(append_first, order, first_entry):
    # Assert
    print(append_first) # ['a']
    print(order) ['a']
    assert order == [first_entry]

pytest.main(["-sv", "test1.py"])

5自动使用fixture,不需要请求

  • 设置和清理环境、全局配置,例如数据库连接、日志设置等可以使用,笔者用的不多
python 复制代码
import pytest

@pytest.fixture
def first_entry():
    return "a"
    
@pytest.fixture(autouse=True)
def order():
    return "hello world"

def test_a(order):
    print(order)

pytest.main(["-sv", "test1.py"])

6 动态定义fixture范围

7 安全拆卸的fixture

8fixture的request

9 fixture的参数化

相关推荐
十年Java程序媛2 分钟前
Redis 分布式锁 + GZIP 压缩缓存踩坑|高并发缓存真实线上复盘
java·开发语言·spring boot·redis·分布式·缓存·面试
低频电磁之道2 分钟前
C++ 中有符号与无符号类型混用可能导致的问题
开发语言·c++
for_ever_love__32 分钟前
LangChain Token 计数与成本控制:先知道钱花在哪
开发语言·langchain
m0_5474866632 分钟前
《数据结构 (C语言)》期末试卷及答案(10套)2026版
c语言·开发语言·数据结构
顽疲34 分钟前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
Sand(ContextGate)36 分钟前
从开发者调试工具到消费级 App:一个 AI 电商导购项目的 C 端改造与 6 个连环踩坑实录
开发语言·人工智能·python·ai·langchain
外收内放40 分钟前
数据分析(DataFrame与series)
python·学习·数据分析
白杨尚青41 分钟前
C++入门篇(十七):priority_queue 完整模拟实现——仿函数、区间建堆与指针特化(附完整代码仓库)
开发语言·c++·stl·仿函数
逐光者9331 小时前
滤波器的 R 与 C 如何选择:从截止频率到工程实践
c语言·开发语言·r语言
Eider19981 小时前
大模型输出格式幻觉解决思路
开发语言·前端·javascript