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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:05:42