如何配置Django或pytest实现未运行makemigrations时测试直接失败
实现未生成迁移文件时测试直接失败的两种方案
方案1:直接使用Django自带检查命令
Django原生支持makemigrations --check参数,该参数会检测当前模型的变更是否已经生成对应的迁移文件,如果存在未同步的变更就会返回非0的退出码,直接中断流程。
你可以把这个命令加到测试执行的前置步骤中,不管是本地测试启动脚本还是CI流水线的测试环节,都先执行:python manage.py makemigrations --check
只要有未生成的迁移文件,这条命令就会直接报错退出,不会走到后续测试执行步骤。
方案2:pytest集成自动检查
如果你使用pytest-django,可以直接在项目的conftest.py文件中添加一个自动运行的fixture,在测试会话启动前就执行迁移检查:
import pytest from django.core.management import call_command @pytest.fixture(scope="session", autouse=True) def check_pending_migrations(): try: call_command("makemigrations", check=True) except SystemExit as e: pytest.exit("检测到未生成的模型迁移文件,请先执行makemigrations后再运行测试", returncode=e.code)
添加完成后每次启动pytest都会自动完成迁移检查,只要存在未生成的迁移就会直接终止测试,输出明确的报错信息。
补充说明:如果希望保留本地开发时的灵活性,可以添加环境变量判断逻辑,比如只在CI环境运行测试时开启该检查,本地调试时默认关闭,避免频繁调整模型时反复生成临时迁移文件的麻烦。
内容的提问来源于stack exchange,提问作者Will Gordon
相关产品推荐
相关产品推荐

