消除不稳定的测试

非确定性或波动性测试 是指在相同的代码下,测试有时通过,有时失败(Martin Fowler, 2011)。波动性测试会破坏对测试套件的信任。这可能导致团队忽略失败的测试结果,或者开发者禁用测试,从而减少测试覆盖率和套件的可靠性。

波动性测试的原因有很多。通常,它们是由于缺乏隔离性造成的。许多测试在同一台机器上的同一个进程中运行——因此,每个测试必须确保找到并恢复系统的干净状态。另一个常见的原因是异步行为。测试异步代码具有挑战性,因为你无法确定异步任务执行的顺序。其他原因可能包括资源泄漏或对远程资源的调用。

应对波动性测试的方法有多种:

  • 重试失败的测试:一些框架允许你重试失败的测试。有时,你甚至可以配置更高的隔离级别。如果一个测试在重新运行时通过,它就被视为波动性测试,并且你应该使用 git blame 提交一个可靠性问题报告。

  • 可靠性运行:你可以在构建通过的代码上执行工作流。那些失败的测试被视为波动性测试,并可以通过 git blame 提交可靠性问题报告。

一些公司将波动性测试隔离,但这样做会阻止你收集额外的数据,因为这些测试无法执行。最佳实践是继续执行波动性测试,但将它们从报告中排除。

如果你想了解GitHub或Google如何处理波动性测试,可以阅读Jordan Raine(2020年)或John Micco(2016年)的相关资料。