You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:15:03