前言

毫不夸张的说 fixture 是 pytest 的利器,是 pytest 最重要的部分!

若没有 pytest 基础,请点击前往:零基础测开学习 10——pytest_基础


1.夹具 fixture

夹具

在用例执行之前,执行之后,自动执行代码(准备、请求代码)

场景

2.创建 fixture

1.创建一个函数(不要以 test_开头)

2.添加装饰器(@pytest.fixture

3.添加关键字(yield)

示例:

import pytest

@pytest.fixture
def func():
print(前置在用例执行之前)
pytest 123
print(后置在用例执行之后)

3.请求 fixture

请求框架调用 fixture,并返回结果:

1.把 fixture 名字写在用例参数列表(可以接受结果:yield 中的结果)

2.使用@pytest.mark.usefixtures 标记(不可以接受结果)

3.不允许直接调用 fixture

4.fixture 作用域

作用域是通过定义来进行控制

pytest 支持五级作用域:

同一个作用域,fixture 不会重复执行:

场景:

示例:

import pytest

@pytest.fixture(scope = class)
def func():
print(前置在用例执行之前)
pytest 123
print(后置在用例执行之后)

5.fixture 参数化

谨慎使用!优先考虑使用 mark 实现参数化

示例:

import pytest
from my_math import add

# 定义一个参数化的fixture
@pytest.fixture(params = [
(1,2,3),
(-1,5,4),
(0,0,0)
])
def add_test_data(request):
return request.param

def test_add(test_data):
a,b,c = test_data
assert add(a,b) == c

conftest:跨文件共享 fixture

直接把 fixture 放在根目录的 conftest 包中即可

其中:conftest.py : 自动发现和加载 fixture

示例:

7.fixture 的错误用法

1.直接调用 fixture

2.不清晰的作用域和依赖

3.在 fixture 中编写递归函数

4.fixture 的异常处理:fixture 中产生的异常会导致测试被标记为 ERROR,而不是 FAILED。这意味着是测试环境搭建失败了,而非测试逻辑本身失败。为了优雅处理,可以在 fixture 中使用 try...except...finally 语句来捕获异常、记录日志,并确保清理工作(如关闭文件、断开连接)在 finally 块或 yield 后的 teardown 代码中一定会执行。


后记

pytest 的英文名称对应的是家具,这里谐音为了夹具,方便记忆、理解,更加生动形象。


↙↙↙阅读原文可查看相关链接,并与作者交流