关于 django-test-parallelization
帮助 Django 测试套件安全并有效地并行运行的技能。它强调先测量运行时间、检查测试隔离、诊断共享状态故障,再平衡工作负载。
主要功能
- 01测量串行测试耗时
- 02检查反向与随机顺序
- 03配置 Django 或 pytest 运行器
- 04分类顺序与并行故障
- 05安全拆分共享资源
适用场景
- 01发现隐藏的测试顺序依赖
- 02诊断仅在并行运行时出现的故障
- 03隔离性检查后加快测试套件
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-test-parallelization安装后在 Claude Code 中输入/django-test-parallelization确认已加载。
附带文件references/shared-resources.md
详细介绍
Django 测试并行化
只有在测试套件已实现隔离后,并行执行才能带来倍增效果。在并行执行下出现的失败,应先视为存在隐藏共享状态的证据,直到证明并非如此。
就绪工作流
-
先测量串行运行时间。
- 如果测试套件的主要耗时已经是启动或创建数据库,那么并行化本身可能无法带来足够的帮助。
-
默认启用并行化之前,先检查隔离情况。
- 以相反顺序运行。
- 如果相反顺序仍不够,再以随机顺序运行。
- 保留随机种子,以便重现失败。
-
有意启用运行器。
- Django 运行器:安装
tblib,然后运行python manage.py test --parallel。 - pytest-django:安装
pytest-xdist,然后运行pytest -n auto。
- Django 运行器:安装
-
对失败进行分类。
- 与顺序有关的失败通常源于被修改的全局变量、类属性、设置、缓存、monkeypatch 或数据库假设。
- 仅在并行执行时出现的失败通常源于共享资源,例如文件、缓存键、端口、队列、外部服务或临时目录。
-
确保资源可由各工作进程安全使用。
- 优先按进程或工作进程拆分资源。
- 只有在资源无法拆分时才使用锁。
- 尽量缩小锁的作用范围。
-
在确保正确后再平衡工作量。
- 只有在测量表明某个组拖慢并行运行时,才拆分大型测试类或模块。
命令
python -m pip install tblib
python manage.py test --parallel
python manage.py test --parallel 1
python manage.py test --reverse
python -m pip install pytest-xdist
pytest -n auto
pytest -n auto --dist loadscope
有关共享资源模式,请参阅 shared-resources.md。
决策规则
- 在新项目中尽早加入并行测试;较旧的串行测试套件往往存在隐藏的隔离假设。
- 使用 CI 反向顺序测试,以低成本防范顺序依赖。
- 当反向顺序测试未能发现疑似依赖时,使用随机顺序并记录种子。
- 对于以 Django
TestCase为主的测试套件,优先使用pytest -n auto --dist loadscope,因为类级或模块级设置可能耗时较长。 - 先拆分资源,再考虑使用锁。
- 仅在测试设置中加入特定于进程的行为,不要放入生产设置。
- 只有在性能分析显示工作量不均衡后,才拆分大型测试组。
常见错误
- 认为数据库事务隔离能够保护缓存、文件、任务队列或外部系统。
- 修改类属性、全局变量、应用设置或缓存条目后未将其恢复。
- 启用随机顺序,却不保留随机种子。
- 对过多工作使用同一个锁文件,意外导致整个测试套件串行运行。
- 让 pytest-xdist 过细地拆分相关测试,导致重复设置。
- 在测试套件尚未通过顺序隔离检查、无法稳定运行之前,就将并行化设为默认。
验证
在确认并行化完成之前:
- 串行运行通过。
- 反向顺序或随机顺序运行通过,或已修复已知失败。
- 并行运行至少通过两次。
- 共享资源的拆分逻辑位于测试配置中。
- CI 中有用于调试的串行备用命令。
评论
支持 Markdown