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

Docker容器中Django Pytest如何无需通配导入改用SQLite测试

解决Docker中Django+pytest用SQLite测试的两种方案

方案一:在主settings.py中根据测试环境自动切换

不用额外写test_settings.py,直接在你的django_app/settings.py里添加判断逻辑,检测到pytest运行时自动切换到SQLite:

import os
import sys

# 原有MySQL数据库配置(保持不变)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST'),
        'PORT': os.getenv('DB_PORT'),
    }
}

# 测试时自动切换到SQLite内存库
if 'pytest' in sys.argv[0] or os.getenv('TESTING') == 'True':
    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    }

然后修改pyproject.toml,去掉指定测试配置模块的参数:

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = []

[tool.pytest.ini_options.env]
PYTHONPATH = "web"
# 可选:如果不想依赖sys.argv判断,就添加这个环境变量
# TESTING = "True"

这样既避免了通配导入,也不用额外的测试配置文件,pytest启动时会自动触发数据库切换。

方案二:用conftest.py强制覆盖数据库配置

如果偏好通过conftest管理测试配置,可以在tests/conftest.py里编写钩子函数,绕过容器环境变量DJANGO_SETTINGS_MODULE的覆盖:

import os
import django
from django.conf import settings

def pytest_configure():
    # 强制加载主配置模块
    os.environ['DJANGO_SETTINGS_MODULE'] = 'django_app.settings'
    django.setup()
    # 直接覆盖数据库配置
    settings.DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    }

对应pyproject.toml保持简洁即可:

[tool.pytest.ini_options]
testpaths = ["tests"]

[tool.pytest.ini_options.env]
PYTHONPATH = "web"

这个方案的核心是在pytest初始化阶段,先加载主配置再强制修改数据库设置,不会被容器里的环境变量覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:03:20