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

如何在pytest中为压力测试组配置单次数据库 setUp/tearDown

解决pytest压力测试中仅创建/销毁一次测试数据库的问题

你遇到的scope="session" fixture重复调用问题,大概率是因为fixture定义位置不对,或是被局部同名fixture覆盖了。下面是具体的解决步骤:

1. 在全局位置定义session级fixture

把数据库创建/销毁的fixture放在项目根目录的conftest.py文件中——pytest会自动加载这个文件里的全局fixture,整个测试会话周期内只会执行一次。

示例代码:

import pytest
# 替换成你实际的数据库操作模块
from my_db_utils import create_test_db, drop_test_db, get_db_connection

@pytest.fixture(scope="session")
def stress_test_db():
    # 创建测试数据库
    db_name = "stress_test_db"
    create_test_db(db_name)
    # 获取数据库连接(供测试用例使用)
    conn = get_db_connection(db_name)
    yield conn
    # 所有压力测试完成后销毁数据库
    conn.close()
    drop_test_db(db_name)

2. 在压力测试用例中引用全局fixture

在step_defs/stress_tests下的file1.py、file2.py里,直接在测试函数或BDD步骤函数中引用这个fixture即可,不要在这些文件里重复定义同名fixture,否则会覆盖全局的session级fixture。

普通pytest测试用例写法:

def test_stress_scenario_1(stress_test_db):
    # 使用stress_test_db执行测试操作
    cursor = stress_test_db.cursor()
    # 测试逻辑...

pytest-bdd步骤函数写法:

from pytest_bdd import given, when, then

@given("压力测试数据库已就绪")
def ready_stress_db(stress_test_db):
    # 可选:初始化测试数据
    stress_test_db.execute("INSERT INTO test_table VALUES (...)")
    stress_test_db.commit()

3. 运行时仅执行压力测试用例

执行测试时,指定只跑stress_tests目录下的用例,这样session级fixture只会在这次会话中创建一次数据库,所有压力测试完成后自动销毁:

pytest step_defs/stress_tests/ -v

常见坑点提醒

  • 不要在测试文件里重新定义和全局fixture同名的fixture,否则会把session级覆盖成函数/类级,导致每个用例都重新创建数据库
  • 如果压力测试是多线程/多进程运行的,要确保数据库操作是线程安全的,或是使用连接池处理并发
  • 确认conftest.py放在项目根目录(test_repo下),否则pytest可能加载不到全局fixture

内容的提问来源于stack exchange,提问作者Ashu123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:02:32