pytest的fixture

本文介绍了Python pytest中的fixture功能,包括其与setup/teardown的相似性,如何通过@fixture装饰器定义和控制fixture的范围,以及在test_1和test_2函数中使用fixture的实例。

fixture的作用类似于setup/teardown。
fixture命名不以test开头,用于区分用例。
在函数前使用装饰器@pytest.fixture(),括号中有个scope的参数,用于控制fixture的范围。默认取值为function,控制范围的排序为:session > module > class > function。取值范围如下所示:
在这里插入图片描述
代码如下:定义了一个init方法,作为参数传入test_1和test_02函数,在test_1函数中对init的返回值做了断言

import pytest


@pytest.fixture()
def init():
    print('init...')
    return 1


def test_1(init):
    print('test1')
    assert init == 1


def test_2(init):
    print('test2')

输出如下:

======================================================================== test session starts ========================================================================
platform win32 -- Python 3.7.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- d:\python3.7.6\python.exe
cachedir: .pytest_cache
rootdir: D:\pythonProject\my_selenium_project\testcases\pytest, configfile: pytest.ini
collected 2 items                                                                                                                                                    

test_fixture.py::test_1 init...
test1
PASSED
test_fixture.py::test_2 init...
test2
PASSED

========================================================================= 2 passed in 0.03s =========================================================================
<think> 我们正在回答关于pytest fixture的问题,需要参考用户提供的引用内容。 用户要求:查找关于pytest fixture的相关信息,包括使用方法、示例、原理等。 根据提供的引用,我们可以整理出以下信息: 引用[1]:FixturePytest中用于提供测试环境的一种机制,可以在测试函数执行前后进行准备和清理工作,如初始化数据库连接、创建临时文件等。Fixture可以被多个测试用例共享,提高代码的复用性和可维护性。 引用[2]:Fixturepytest最强大的功能之一,用于提供测试所需的依赖资源(如数据库连接、临时文件、模拟对象等),并支持复用、作用域控制和自动清理。 引用[3]:Fixture为测试提供固定的基线(固定配置),使不同范围的测试获得统一配置。它区别于传统单元测试(setup/teardown)风格,具有更多功能。 引用[4]:Fixture可以使用scope参数设置作用域(如"function"(默认)、"class"、"module"、"session")。可以将fixture单独存放,以便多个测试模块共享。 我们需要组织一个清晰的回答,内容包括: 1. Fixture定义和用途 2. Fixture的基本使用方法(如何定义、如何调用) 3. Fixture的作用域(scope参数) 4. Fixture的共享和复用(例如conftest.py文件) 5. 简单的代码示例 由于用户要求生成相关问题,我们将在最后提出几个相关问题。 注意:回答中需要引用时,在引用段落末尾添加引用标识,如[^1]。 同时,按照系统指令,行内数学表达式用$...$,独立公式用$$...$$,但我们这个主题可能很少需要数学公式,因此主要关注代码和文字描述。 我们按照以下结构组织回答: 1. 引言:Fixture定义和主要用途 2. 基本用法:如何定义和使用Fixture 3. 作用域:scope参数的不同取值 4. 共享Fixture:通过conftest.py共享 5. 示例代码 6. 相关问题 由于引用中没有提供具体的代码示例,我们将根据知识补充一个简单的例子。 </think> ### Pytest Fixture 详解与使用指南 根据引用内容,pytest fixture 是测试框架的核心机制,用于管理测试依赖资源和环境。其主要功能是为测试提供**可复用的固定配置**,并在测试前后自动执行准备/清理工作[^1][^2][^3]。 #### 一、核心特性 1. **资源管理** 提供数据库连接、临时文件、模拟对象等依赖资源的统一管理,确保测试环境一致性[^2] 2. **作用域控制** 通过`scope`参数定义生命周期: ```python @pytest.fixture(scope="module") # 模块级:整个.py文件执行1次 @pytest.fixture(scope="session") # 会话级:所有测试仅初始化1次[^4] ``` 3. **自动清理** 执行`yield`后的清理代码,确保资源释放: ```python @pytest.fixture def db_conn(): conn = create_connection() # 准备资源 yield conn conn.close() # 自动清理[^2] ``` #### 二、基础使用方法 1. **定义 Fixture** 使用`@pytest.fixture`装饰器: ```python import pytest @pytest.fixture def mock_data(): return {"user": "test", "id": 42} ``` 2. **调用 Fixture** 测试函数通过参数直接使用: ```python def test_user_login(mock_data): assert mock_data["user"] == "test" # 自动注入fixture ``` 3. **参数化共享** 跨测试类/模块复用: ```python class TestAPI: def test_response(self, mock_data): # 类内复用 assert "id" in mock_data ``` #### 三、高阶用法 1. **作用域配置** | Scope | 执行频率 | 适用场景 | |-----------|------------------|-----------------------| | function | 每个测试函数1次 | 独立测试(默认) | | class | 每个测试类1次 | 类内共享资源[^4] | | module | 每个.py文件1次 | 模块级初始化 | | session | 整个测试过程1次 | 全局资源(如登录)[^4] | 2. **依赖注入** Fixture 可嵌套调用: ```python @pytest.fixture def db_config(): return {"host": "localhost"} @pytest.fixture def db_conn(db_config): # 依赖其他fixture return connect(db_config["host"]) ``` 3. **集中化管理** 将公共 fixture 放入`conftest.py`文件,实现跨模块共享[^4]。 #### 四、典型应用场景 1. 数据库连接池初始化与回收[^1] 2. API 测试的认证令牌生成 3. 临时文件/目录的创建与删除 4. 模拟外部服务(如支付接口) 5. 测试数据生成与注入 > 示例:模块级数据库连接 > ```python > @pytest.fixture(scope="module") > def database(): > db = Database() > db.connect() > yield db # 测试执行阶段 > db.clear() # 模块测试结束后自动清理[^4] > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远不要矫情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值