测试套件突然变慢,不一定要先上 profiler。pytest 可以直接列出最慢的用例:
pytest --durations=10
它会在结尾显示耗时最长的 10 个测试;想把很短的测试也列出来,可以用 --durations=0 看完整列表。
环境:pytest 4.2+。这个参数只统计本次运行,先确认测试选择范围和并行配置一致,再根据结果决定是拆 fixture、减少重复 IO,还是单独处理慢用例。
这个参数很适合做第一轮定位。再补一个容易忽略的点:想把短耗时条目也纳入统计,可以用 pytest --durations=0 --durations-min=0。输出里如果出现 setup/teardown,慢点可能在 fixture,不一定是测试函数本身。用了 xdist 的话,我一般会先单进程跑一遍,方便比较各项耗时。
还有一种情况是收集阶段变慢,--durations 不一定能看出来,尤其是模块导入或动态生成用例比较重时。可以单独跑 time pytest --collect-only -q 看收集耗时,再和正常执行时间分开判断。