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

