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

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实例:
    psql -h 127.0.0.1 -p 5432 -U db_user db_name
    
    如登录失败,检查PostgreSQL的pg_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:45:03