08-26
Mutmut:用变异测试揪出 100% 覆盖率背后的盲区
作者在维护 Python 库时发现,即便测试覆盖率 100%,仍可能漏掉边界条件和异常行为。变异测试通过在源码上做微小改动(如把 < 改成 <=)并运行测试套件,可以暴露出这些盲区。作者调研了 Mutpy 和 Cosmic Ray 后,决定自己实现一个变异测试工具 Mutmut。核心设计是使用 baron(后替换为 parso)实现 AST 无损往返,让变异后的代码可以以原格式落盘,便于审查具体变异。作者尝试用 import hook 在内存中变异模块以支持并行,但受限于 Python 导入系统必须重写全部 loader,最终放弃并退化为基于磁盘的串行变异,换来简单性和对不同测试运行器的兼容性。在 tri.declarative 和 tri.struct 上运行时,虽未发现 bug,却找到了未充分测试的边界和死代码,实际改善了测试套件。适合对 Python 测试工具链和变异测试感兴趣的工程师阅读。