使用Django parallel参数测试时如何正确执行模型迁移?
Django并行测试多测试库未执行迁移问题修复方案
问题根因
Django的并行测试机制中,主进程仅会初始化1个默认测试数据库并执行全量迁移,当你指定--parallel=3参数时,后续启动的3个并行测试子进程会各自创建带数字后缀的独立测试库(如test_xxx_1、test_xxx_2、test_xxx_3),但子进程默认不会触发迁移流程,因此后缀结尾的测试库为空,就会抛出1146 Table 'xxx' doesn't exist的错误。
可选修复方案
- 方案1:加
--keepdb参数快速解决(适合本地调试)
开启参数后所有子进程会复用主进程已经建好表结构的测试库,不会额外创建空的后缀测试库,无需改动代码,修改后的测试命令如下:python manage.py test --settings=server.settings.test --parallel=3 --keepdb - 方案2:自定义测试运行器(适合需要多库隔离的CI/CD场景)
如果你需要每个并行子进程使用完全隔离的独立测试库,可以重写测试运行器的子进程初始化逻辑,强制子进程建库后执行迁移:- 在项目对应应用下新建
test_runner.py文件,代码如下:
from django.test.runner import DiscoverRunner, ParallelTestSuite class ParallelMigrateTestSuite(ParallelTestSuite): def init_worker(self, counter): # 子进程初始化时为当前进程对应的测试库执行迁移 from django.db import connections for alias in connections: connections[alias].creation.create_test_db(serialize=False) super().init_worker(counter) class CustomTestRunner(DiscoverRunner): parallel_test_suite_class = ParallelMigrateTestSuite- 有两种方式启用自定义运行器:
- 单次运行时在命令中指定:
python manage.py test --settings=server.settings.test --parallel=3 --testrunner=你的应用名.test_runner.CustomTestRunner- 永久生效:在测试配置文件
server.settings.test中添加配置:
TEST_RUNNER = "你的应用名.test_runner.CustomTestRunner"
- 在项目对应应用下新建
- 方案3:升级Django版本(最优解)
Django 4.2及以上版本已经官方修复了并行测试的迁移同步问题,升级后无需额外配置即可自动为所有子进程的测试库执行迁移。
内容的提问来源于stack exchange,提问作者Ryan Park
相关产品推荐
相关产品推荐

