test: isolate database settings from production

This commit is contained in:
caoqianming 2026-08-07 11:15:39 +08:00
parent 24ce008d3a
commit c17552e0ea
5 changed files with 41 additions and 1 deletions

View File

@ -8,6 +8,7 @@
- [合批原料字段历史问题](project_material_ofrom_merge_bug.md)`material_ofrom` 不一致的既有排查结论。 - [合批原料字段历史问题](project_material_ofrom_merge_bug.md)`material_ofrom` 不一致的既有排查结论。
- [前端独立发版流程](reference_ehs_web_release.md):发布 `ehs_web` 时使用。 - [前端独立发版流程](reference_ehs_web_release.md):发布 `ehs_web` 时使用。
- [项目 Python 虚拟环境](reference_python_venv.md):运行 Django、pytest 和脚本时使用。 - [项目 Python 虚拟环境](reference_python_venv.md):运行 Django、pytest 和脚本时使用。
- [项目测试数据库](reference_test_database.md):测试与可切换的生产查询连接解耦,始终使用固定的 `test_ehs_develop`
- [两个 WebView 套壳 App](reference_wrapper_apps.md):修改 h5x 与扫码、返回键交互时使用。 - [两个 WebView 套壳 App](reference_wrapper_apps.md):修改 h5x 与扫码、返回键交互时使用。
这些文件记录的是长期约定或历史上下文。执行任务前应结合当前代码和数据重新验证,尤其不要把历史缺陷结论直接当成当前故障原因。 这些文件记录的是长期约定或历史上下文。执行任务前应结合当前代码和数据重新验证,尤其不要把历史缺陷结论直接当成当前故障原因。

View File

@ -0,0 +1,15 @@
# 项目测试数据库
- 生产问题查询时,默认数据库连接可以根据工厂或环境切换到不同 IP 和业务库;这类连接只用于授权范围内的生产数据只读验证。
- 所有 Django、pytest 及其他自动化测试必须与当前生产查询连接解耦,始终使用固定的 `test_ehs_develop` 测试数据库连接。
- 不能仅依赖当前默认连接的 Django 自动 `test_<NAME>` 命名;即使当前业务库是 `bxerp` 或其他库,测试也不应转而使用 `test_bxerp` 或其他派生库。
- 不得在生产数据库上运行会建表、迁移、写入或清理数据的测试。
- 生产查询与固定测试库的连接参数均从本机已忽略配置中读取,不在项目记忆、源码或提交信息中记录凭据。
当前实现:
- 固定测试连接保存在已忽略的 `config/conf_test.py`
- `server/test_settings.py` 加载该连接,`manage.py test` 会自动选择测试 settings其他 `manage.py` 命令仍使用当前业务库连接。
- 测试 settings 中的基础 `NAME``TEST.NAME` 都必须是 `test_ehs_develop`,并在启动时校验,防止通过测试 settings 误操作 `ehs_develop` 或任何生产库。
- pytest-django 通过项目根目录 `pytest.ini` 固定使用 `server.test_settings`
- 本地重复运行测试时优先使用 `.venv\\Scripts\\python.exe manage.py test --keepdb --noinput`

View File

@ -5,7 +5,12 @@ import sys
def main(): def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') settings_module = (
'server.test_settings'
if sys.argv[1:2] == ['test']
else 'server.settings'
)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', settings_module)
try: try:
from django.core.management import execute_from_command_line from django.core.management import execute_from_command_line
except ImportError as exc: except ImportError as exc:

3
pytest.ini Normal file
View File

@ -0,0 +1,3 @@
[pytest]
DJANGO_SETTINGS_MODULE = server.test_settings
python_files = tests.py test_*.py *_tests.py

16
server/test_settings.py Normal file
View File

@ -0,0 +1,16 @@
from server.settings import * # noqa: F403
from config.conf_test import TEST_DATABASES
from django.core.exceptions import ImproperlyConfigured
DATABASES = TEST_DATABASES
if (
DATABASES["default"].get("NAME") != "test_ehs_develop"
or DATABASES["default"].get("TEST", {}).get("NAME")
!= "test_ehs_develop"
):
raise ImproperlyConfigured(
"Test settings must only use the test_ehs_develop database."
)