单元测试以防止生产

时间:2016-08-24 13:34:13

标签: ruby-on-rails unit-testing

我们最近有一个错误进入生产,我们将validates_presence_of添加到模型中,但是对于在更改之前创建的任何记录,该列都是nil,因此任何在旧数据上实例化模型的代码都会被破坏。 / p>

这似乎是一类只能在对生产数据进行测试时才能捕获的错误。

有没有办法创建可以防止这些类型问题的单元测试?

1 个答案:

答案 0 :(得分:0)

当谈到为代码中的不愉快路径或案例编写自动化测试(也称为负面测试)时,最终会为您所期望的事情编写测试。采取validates_presence_of情况,您可以编写现在一个测试,以验证列为零的情况的正确处理,因为您现在知道它可能发生。在问题出现之前编写这些测试是棘手的部分,因为你不知道你必须这样做。

如果你真的想在这些案件发生之前预防这些案件,你可以考虑:

  1. 针对实际数据进行测试:获取实际数据库并在其中运行功能测试和数据库一致性检查。这种方法需要考虑的一些事项:

    • 如果您考虑作为参考的数据库有客户数据,为了客户隐私,您可能希望对其进行虚拟化。
    • 这种方法很难在开发循环中正确完成,因为自动化设置和编排的成本很高。例如,在进行大规模迁移之前,这种策略更适合一次性的努力。
    • 正如我之前指出的那样,你仍然会为你期望发生的事情编写测试,但鉴于你正在增加你的数据集,更有可能偶然发现意外事件
  2. 探索性测试:我知道您提到了问题中的单元测试,因为您希望自动执行此过程,但在这些情况发生之前防止这些情况的另一个好方法是应用您的完整提出意想不到但可行的方案的大脑能量,并手动测试它们以查看您的代码是否支持这些方案(如果没有,则捕获错误,修补并编写测试以确保错误永远不会发现错误)。

  3. 可能会更好地扩展的自动化方法会在检测方面出错。在某些时候,我们必须接受软件有错误,软件开发不是一个完美的过程,阻止所有这些。其中一些错误很可能会投入生产,所以尽量减少它们产生的影响。

    我们仍然希望编写测试以在发布之前捕获尽可能多的问题,以便那些到达我们用户的测试很少并且没有危险。当发生这种情况时,良好的日志记录实践,日志聚合器,良好的错误监控和良好的警报方案将立即让我们知道,并且我们能够在它影响更多用户或变得更糟之前做出反应。

    执行canary releases时,此路径可以变得更加稳定,anomaly detection模式应用于实时行为数据,并且在事情开始出错时编程自动回滚。