如何在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
相关产品推荐
相关产品推荐

