mcpField
D
django-test-parallelization

django-test-parallelization

github.com/lvtd-llc测试与质量160 次安装7 周前更新
代码仓库

关于 django-test-parallelization

帮助 Django 测试套件安全并有效地并行运行的技能。它强调先测量运行时间、检查测试隔离、诊断共享状态故障,再平衡工作负载。

主要功能

  1. 01测量串行测试耗时
  2. 02检查反向与随机顺序
  3. 03配置 Django 或 pytest 运行器
  4. 04分类顺序与并行故障
  5. 05安全拆分共享资源

适用场景

  1. 01发现隐藏的测试顺序依赖
  2. 02诊断仅在并行运行时出现的故障
  3. 03隔离性检查后加快测试套件

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lvtd-llc/skills --skill django-test-parallelization

安装后在 Claude Code 中输入/django-test-parallelization确认已加载。

附带文件references/shared-resources.md

详细介绍

Django 测试并行化

只有在测试套件已实现隔离后,并行执行才能带来倍增效果。在并行执行下出现的失败,应先视为存在隐藏共享状态的证据,直到证明并非如此。

就绪工作流

  1. 先测量串行运行时间。

    • 如果测试套件的主要耗时已经是启动或创建数据库,那么并行化本身可能无法带来足够的帮助。
  2. 默认启用并行化之前,先检查隔离情况。

    • 以相反顺序运行。
    • 如果相反顺序仍不够,再以随机顺序运行。
    • 保留随机种子,以便重现失败。
  3. 有意启用运行器。

    • Django 运行器:安装 tblib,然后运行 python manage.py test --parallel。
    • pytest-django:安装 pytest-xdist,然后运行 pytest -n auto。
  4. 对失败进行分类。

    • 与顺序有关的失败通常源于被修改的全局变量、类属性、设置、缓存、monkeypatch 或数据库假设。
    • 仅在并行执行时出现的失败通常源于共享资源,例如文件、缓存键、端口、队列、外部服务或临时目录。
  5. 确保资源可由各工作进程安全使用。

    • 优先按进程或工作进程拆分资源。
    • 只有在资源无法拆分时才使用锁。
    • 尽量缩小锁的作用范围。
  6. 在确保正确后再平衡工作量。

    • 只有在测量表明某个组拖慢并行运行时,才拆分大型测试类或模块。

命令

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