一、需求分析
同时使用 class 级别和 function 级别 fixture,且 function 级别 fixture 依赖 class 级别 fixture。
二、示例代码
以下是完整示例,包含详细注释和执行顺序说明:
import pytest
# ---------------------------
# 模拟业务逻辑(此部分非重点,只是模拟业务)
# ---------------------------
class Database:
def __init__(self):
self.tables = {}
def create_table(self, name):
self.tables[name] = []
def drop_table(self, name):
del self.tables[name]
def insert_data(self, table, data):
self.tables[table].append(data)
# ---------------------------
# class 级别 fixture (初始化数据库连接)
# ---------------------------
@pytest.fixture(scope="class")
def db_connection():
"""每个测试类共享的数据库连接"""
print("\n[Class] 初始化数据库连接")
db = Database()
yield db # 将数据库实例传递给测试类
print("\n[Class] 关闭数据库连接")
# ---------------------------
# function 级别 fixture (依赖 class 级别的 db_connection)
# ---------------------------
@pytest.fixture
def temp_table(db_connection): # 接收 class 级别 fixture 返回值
"""每个测试方法独立的临时表"""
print("\n[Function] 创建临时表")
table_name = "test_data"
db_connection.create_table(table_name)
yield table_name # 传递表名给测试方法
print("\n[Function] 删除临时表")
db_connection.drop_table(table_name)
# ---------------------------
# 测试类
# ---------------------------
class TestDatabaseOperations:
def test_insert_data(self, db_connection, temp_table):
"""测试数据插入"""
db_connection.insert_data(temp_table, {"id": 1, "name": "Alice"})
assert len(db_connection.tables[temp_table]) == 1
print("\n执行 test_insert_data")
def test_query_data(self, db_connection, temp_table):
"""测试数据查询"""
assert temp_table in db_connection.tables
print("\n执行 test_query_data")
大约 3 分钟