pytest使用内存MySQL搭建测试环境时fixture无法正常工作问题求助
pytest-mysql 多测试用例类配置方案
核心错误原因
你之前所有配置的首要问题是fixture名称不匹配:你定义的MySQL进程fixture名为mysql_process,但调用factories.mysql()时传入的是不存在的mysql_my_proc,导致无法正确注入MySQL连接实例。其余错误分别是没有正确声明fixture依赖、fixture未注入参数直接调用全局变量。
正确配置实现(满足全部3个需求)
import pytest from pytest_mysql import factories # 定义session级内存MySQL进程,整个测试会话仅创建1次,结束后自动销毁 mysql_process = factories.mysql_proc(port=8888, logs_prefix='/tmp') # 注意这里传入的是上面定义的进程fixture名称「mysql_process」 mysql = factories.mysql('mysql_process') class BaseTest: # 类级fixture:每个测试类仅执行1次,初始化表结构 @pytest.fixture(scope="class", autouse=True) def init_mysql(self, mysql): # 调用你自己的表结构初始化逻辑 self._setup_mysql(mysql) # 保存连接实例供测试用例调用 self.mysql_conn = mysql yield # 类所有用例执行完的后置操作可写在这里,不需要额外写销毁逻辑,mysql_process会自动处理 # 方法级fixture:每个测试用例执行完清空表数据 @pytest.fixture(scope="function", autouse=True) def clear_table_after_test(self): yield # 清空所有表数据逻辑示例: cursor = self.mysql_conn.cursor() # 先关闭外键检查避免truncate报错 cursor.execute("SET FOREIGN_KEY_CHECKS = 0") # 查询当前库所有表名 cursor.execute("SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE()") tables = [t[0] for t in cursor.fetchall()] for table in tables: cursor.execute(f"TRUNCATE TABLE `{table}`") cursor.execute("SET FOREIGN_KEY_CHECKS = 1") self.mysql_conn.commit()
配置说明
- 需求1满足:
init_mysql是类级作用域,每个测试类仅执行1次表结构初始化 - 需求2满足:
clear_table_after_test是方法级作用域,每个用例执行完成后自动truncate所有表 - 需求3满足:
mysql_process是session级fixture,pytest-mysql会在整个测试会话结束后自动销毁内存MySQL实例,无需额外代码处理
内容的提问来源于stack exchange,提问作者Ido Barash
相关产品推荐
相关产品推荐

