
本文介绍如何为 python unittest 测试用例设置执行优先级,借助 unitplus 库实现按耗时长短智能调度(如长耗时测试优先运行),从而提升多核并行测试效率,并支持灵活的测试筛选与计划管理。
在大型 Python 项目中,随着测试用例数量增长,单纯依赖 unittest 或 pytest 的默认执行顺序(通常按方法名字母序)会导致资源利用不均:短测试快速完成而长测试积压在队列尾部,严重拖慢整体 CI/CD 流水线耗时。理想策略是让高耗时、高优先级的测试尽早启动——这正是测试优先级(Test Priority)机制的价值所在。
原生 unittest 不支持优先级标记,但可通过轻量增强库 unitplus 实现。它完全兼容标准 unittest 语义,无需重构现有测试结构,仅需两步即可启用优先级调度:
✅ 第一步:安装与基础用法
pip install unitplus
将测试类继承自 unitplus.TestCase(而非 unittest.TestCase),并通过 @unitplus.test(priority=...) 装饰器显式声明优先级:
# testcases/test_demo.py
import unitplus
class TestClass(unitplus.TestCase):
# 类级默认优先级(可选)
priority = 'p1'
@unitplus.test(priority='p2') # 最高优先级,最先执行
def test_high_priority(self):
import time; time.sleep(3) # 模拟长耗时操作
self.assertTrue(True)
@unitplus.test(priority='p1') # 中等优先级
def test_medium_priority(self):
self.assertEqual(2 + 2, 4)
@unitplus.test(priority='p0') # 最低优先级,最后执行
def test_low_priority(self):
self.assertIn('a', 'abc')
def test_low_priority2(self): # 无装饰器 → 使用类级默认 priority='p1'
self.assertTrue(True)? 优先级命名规范:unitplus 使用字符串形式(如 'p0', 'p1', 'p2'),按字典序升序执行(即 'p0'✅ 第二步:构建可调度的测试计划(TestPlan)
为实现“按优先级分批执行”或“仅运行指定优先级子集”,unitplus 提供 TestPlan 机制。以下示例将仅运行 p0 和 p1 级别测试(跳过最耗时的 p2,适用于快速验证场景):
立即学习“Python免费学习笔记(深入)”;
# testplan.py import unitplus class TestPlanDemo(unitplus.TestPlan): tests = ['testcases.test_demo'] # 支持模块路径或包路径 filter = { 'priorities': ['p0', 'p1'], # 关键:按 priority 筛选 # 可叠加其他过滤条件: # 'tags': ['smoke'], # 'exclude_names': ['TestClass.test_high_priority'] } if __name__ == '__main__': TestPlanDemo().run(verbosity=2) # 输出详细日志运行命令:
python testplan.py⚠️ 注意事项与最佳实践
- 并行执行需额外工具:unitplus 本身不内置并行能力,但其优先级排序可无缝对接并行框架。推荐组合使用:
- pytest-xdist(配合 pytest 风格重写)+ 自定义 --priority 插件(需开发)
- 或使用 unitplus + 进程池封装(如 concurrent.futures.ProcessPoolExecutor),按 priority 分组后提交任务。
- 优先级应基于实测耗时:建议首次运行全量测试并记录各用例耗时(可用 --timing 参数或日志埋点),再反向标注 p0/p1/p2,避免主观误判。
- 避免过度细分等级:实践中 p0/p1/p2 三级已覆盖多数场景;过多等级反而增加维护成本。
- 与 CI/CD 集成:可在 GitHub Actions / GitLab CI 中通过环境变量动态传入 filter.priorities,实现“PR 验证跑 p0+p1,Nightly 跑全量”。
通过 unitplus 引入优先级机制,你不仅能显著缩短平均测试等待时间,还能构建更健壮、可预测的测试生命周期——让关键路径测试永远“抢占先机”。










