如何指定manage.py路径解决pytest-django找不到Django项目问题
我之前也碰到过一模一样的场景:Django项目的manage.py不在根目录,直接跑pytest会抛出找不到项目的错误,但单独指定测试文件却能正常运行。其实不用纠结于直接指定manage.py的路径,我们可以通过配置Django的settings模块来让pytest-django正确识别项目,同时完美兼容旧的unittest测试和新的pytest测试。这里有几个实用的解决方案:
方法1:用--ds参数直接指定settings模块
这是最直接的临时解决方案,完全不需要依赖manage.py的位置。假设你的manage.py在./backend/manage.py,对应的Django settings模块是backend.settings,运行pytest时加上参数即可:
pytest --ds=backend.settings
这个参数会告诉pytest-django直接加载指定的settings模块,跳过查找manage.py的步骤。
方法2:设置环境变量DJANGO_SETTINGS_MODULE
通过环境变量告诉pytest-django你的settings位置,这样每次运行pytest时不用重复加参数:
- Unix/Linux/macOS:
export DJANGO_SETTINGS_MODULE=backend.settings pytest - Windows CMD:
set DJANGO_SETTINGS_MODULE=backend.settings pytest - Windows PowerShell:
$env:DJANGO_SETTINGS_MODULE="backend.settings" pytest
方法3:在pytest配置文件中永久指定settings
如果不想每次都手动设置参数或环境变量,可以在项目根目录创建pytest的配置文件,让配置永久生效:
用pytest.ini配置
创建pytest.ini文件,添加以下内容:
[pytest] django_settings_module = backend.settings
用conftest.py配置
如果已经有conftest.py,可以在里面添加初始化代码:
import os import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") django.setup()
之后直接运行pytest就会自动加载指定的settings了。
方法4:将manage.py所在目录加入Python路径
如果你更希望让pytest-django找到manage.py,可以把manage.py所在的目录加入Python路径:
- Unix/Linux/macOS:
PYTHONPATH=./backend pytest - Windows:
set PYTHONPATH=./backend && pytest
这样pytest就能在指定的目录下找到manage.py,进而自动识别Django项目。
这些方法都能完美兼容你现有的unittest测试和新编写的pytest测试,因为pytest本身就支持运行unittest风格的测试用例,pytest-django也会自动处理Django的测试环境初始化。
内容的提问来源于stack exchange,提问作者Fenn-CS

