如何阻止pytest-django使用live_server时每次测试后刷新数据库?
解决pytest-django中live_server fixture导致数据库刷新的问题
问题根源
默认的live_server fixture在测试会话结束时会调用call_command('flush')清理数据库,这会清空所有预先填充的数据,导致依赖这些数据的后续测试失败。你尝试的--reuse-db仅控制测试数据库的创建逻辑,不会影响live_server的清理行为;@pytest.mark.django_db(transaction=true)是函数级的事务回滚,无法覆盖live_server会话级的flush操作。
可行解决办法
1. 自定义live_server fixture,跳过flush操作
重写默认的live_server,移除其teardown阶段的flush逻辑:
import pytest from pytest_django.live_server_helper import LiveServer @pytest.fixture(scope="session") def custom_live_server(request): # 初始化live_server server = LiveServer(request.config) # 仅添加停止服务器的finalizer,跳过默认的flush操作 request.addfinalizer(server.stop) return server
测试时使用custom_live_server替代原生的live_server,同时配合会话级的预填充数据fixture。
2. 会话级预填充数据+自定义live_server
将预填充User表的逻辑放在会话级fixture中,确保数据在整个测试会话中保留:
@pytest.fixture(scope="session") def pre_populate_users(django_db_blocker): with django_db_blocker.unblock(): from django.contrib.auth.models import User # 仅在数据不存在时创建,避免重复填充 if not User.objects.filter(username="test_user").exists(): User.objects.create_user(username="test_user", password="test_pass123") # 测试用例示例 def test1(custom_live_server, pre_populate_users): # 测试逻辑 def test2(custom_live_server, pre_populate_users): # 依赖预填充User表的断言逻辑
3. 配置pytest-django禁用live_server的数据库清理
在项目根目录的pytest.ini或tox.ini中添加配置:
[pytest] django_live_server_keepdb = True
该配置会让live_server在测试结束后跳过flush操作,保留数据库中的预填充数据。注意此功能需要pytest-django 3.0及以上版本支持。
内容的提问来源于stack exchange,提问作者watch-this
相关产品推荐
相关产品推荐

