Docker部署Django与PostgreSQL时本地运行pytest的问题
故障核心原因
pytest-django 框架的django_db标记被自动跳过,本质是测试执行时判定数据库连接不可用,自动过滤了所有依赖数据库操作的测试用例。容器内可正常执行测试说明Django业务代码、测试逻辑、容器内服务配置均无问题,故障出在容器外本地环境和容器化PostgreSQL的连通性、本地Django加载的配置差异上。
逐项修复步骤
- 确认PostgreSQL容器端口映射配置
检查docker-compose配置或容器启动命令,是否给PostgreSQL容器配置了宿主机端口映射,参考配置如下:
如无端口映射配置,新增后重启容器生效。services: postgres: image: postgres:15-alpine ports: - "5432:5432" # 宿主机端口映射到容器内5432端口 environment: POSTGRES_USER: db_user POSTGRES_PASSWORD: db_pass POSTGRES_DB: db_name - 调整本地测试用的Django数据库配置
容器内运行时DATABASES的HOST字段填的是PostgreSQL容器的服务名(如上述示例中的postgres),容器外本地运行时需将HOST改为127.0.0.1,端口填映射的宿主机端口,用户名、密码、库名和容器内配置保持一致。
可单独编写本地测试配置文件settings_local.py,运行测试时指定加载:pytest --settings=your_project.settings_local tests/ - 校验pytest依赖与配置一致性
确认本地环境安装的pytest-django版本和容器内版本一致,避免版本差异导致的标记识别异常。同时检查本地pytest配置文件(pytest.ini/pyproject.toml),确认没有配置--no-django、skip_django_db等跳过数据库测试的参数。 - 验证数据库连通性
运行测试前先在本地用psql工具测试连通性,确认可以正常访问容器内的PostgreSQL实例:
如登录失败,检查PostgreSQL的psql -h 127.0.0.1 -p 5432 -U db_user db_namepg_hba.conf配置,确认开放了宿主机IP的访问权限,官方默认postgres镜像允许所有IP密码登录,自定义配置场景需单独调整。
可选优化方案
无需维护两份配置文件,可通过环境变量动态适配不同运行环境:
import os DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql", "HOST": os.getenv("DJANGO_DB_HOST", "127.0.0.1"), "PORT": os.getenv("DJANGO_DB_PORT", "5432"), "USER": os.getenv("DJANGO_DB_USER", "db_user"), "PASSWORD": os.getenv("DJANGO_DB_PASS", "db_pass"), "NAME": os.getenv("DJANGO_DB_NAME", "db_name"), } }
容器内运行时设置环境变量DJANGO_DB_HOST=postgres,本地运行时无需额外设置,默认使用127.0.0.1即可。
内容的提问来源于stack exchange,提问作者AssertionError
相关产品推荐
相关产品推荐

