依赖注入

fixture 允许你将测试所需的依赖项(如数据库连接、测试数据、API 客户端等)通过参数自动注入到测试函数中,无需手动实例化。

1
2
3
4
5
6
7
8
import pytest

@pytest.fixture
def user():
return {"name": "Alice", "id": 1}

def test_user_name(user): # fixture 'user' 自动注入
assert user["name"] == "Alice"

资源管理

1
2
3
4
5
6
7
8
9
10
11
fixture 可以管理资源的生命周期(如创建/销毁数据库连接、临时文件等),通过 yield或 addfinalizer实现清理逻辑。

@pytest.fixture
def db_connection():
conn = create_db_connection() # 初始化资源
yield conn
conn.close() # 清理资源(无论测试是否通过都会执行)

def test_db_query(db_connection):
data = db_connection.query("SELECT * FROM users")
assert len(data) > 0

作用域控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
通过 scope参数控制 fixture 的创建频率,避免重复初始化,提升测试效率:

function(默认):每个测试函数执行一次。

class:每个测试类执行一次。

module:每个模块执行一次。

package:每个包执行一次。

session:整个测试会话执行一次。

@pytest.fixture(scope="session")
def heavy_resource():
# 整个测试会话只初始化一次
return initialize_expensive_resource()

参数化 fixture(X)

1
2
3
4
5
6
7
8
通过 params参数为 fixture 提供多组输入,使测试覆盖不同场景。

@pytest.fixture(params=["admin", "guest", "user"])
def role(request):
return request.param # request 是内置 fixture,用于访问参数

def test_permissions(role):
assert role in ["admin", "user", "guest"]

fixture 依赖

1
2
3
4
5
6
7
@pytest.fixture
def database():
return Database()

@pytest.fixture
def current_user(database): # 依赖 database fixture
return database.get_user(id=1)

自动执行

1
2
3
4
5
6
7
设置 autouse=True,fixture 会自动应用于所有作用域内的测试,无需显式声明。

@pytest.fixture(autouse=True)
def setup_logging():
logging.info("测试开始") # 每个测试自动执行
yield
logging.info("测试结束")

工厂模式

1
2
3
4
5
6
7
8
9
10
11
fixture 可以返回一个工厂函数,延迟生成资源。

@pytest.fixture
def create_user():
def _create_user(name):
return User(name=name)
return _create_user # 返回工厂函数

def test_user_creation(create_user):
user = create_user("Bob") # 按需创建
assert user.name == "Bob"

参数化测试

1

参数化测试

1