单元测试是否可以保护您的代码免受其他开发人员的错误影响?

Does Unit testing protect your code from other developers mistakes?

我一直在研究单元测试和验证代码正确性的好处,以及如果操作得当,您自然会创建松散耦合代码的额外好处。换句话说,一个单元与一种方法一样小——而不是更大。这些似乎是最大的 2。我只是想知道良好的单元测试是否会围栏代码并保护其功能免受其他开发人员代码更改的影响(假设失败的单元测试是失败的构建)。还有其他我忽略的好处吗?

是的,大多数时候,单元测试确实可以防止其他开发人员犯错误。然而,这并非总是如此。测试点是更可行解决方案的更好选择。

取决于其他开发人员是否会删除您的测试。

但说真的,如果你正确地模块化你的代码并使测试清晰,如果它破坏了测试,人们通常会三思而后行。

除非他们有充分的理由进行更改 - 然后他们将需要相应地更改测试以描述新功能。

Does Unit testing protect your code from other developers mistakes?

不完全是。

单元测试隔离一段特定的代码("unit"),并以正负两种方式调用它,每次都根据预期结果测试输出。这可确保该单元坚固耐用并满足预期要求 - 在该单元的上下文中

这不会阻止其他开发人员在将值传递给您的代码之前犯错误,或对您的返回值采取不正确的操作。传递给您的代码的值可能有效但仍然是错误的。例如,您的代码可能需要一个介于 0 和 100 之间的正整数,但您的代码并不知道传递值 50 的特定调用者是不正确的 - 您的代码只能根据接收到的内容进行操作,它没有围绕该值的其他上下文.在这种情况下,对该调用代码进行单元测试可能会发现问题,但对您的代码进行单元测试则不会。

I just would like to know if good unit testing will ring-fence code and protect its functionality from other developers code changes

单元测试不会围栏任何东西。假设测试编写得很好,他们会告诉您代码是否已更改并且不再符合其原始意图。他们不会告诉您调用者是否在 运行 时间传递了错误的值,但他们会帮助您确保代码在传入错误值时正确运行。

根据我的经验,单元测试的好坏取决于编写代码的人。如果那个人是一个糟糕的编码员或者没有正确理解需求那么测试可能毫无价值。我在过去看到过一些非常糟糕的单元测试,因此我总是建议它们应该只是你测试方法的一部分,你不应该完全依赖它们——它们只是严格方法的一部分。

拥有良好的单元测试覆盖率的另一个(被忽视的)好处是,它实际上可以鼓励开发人员将他们的脚趾伸入大型 solution/old 遗留代码中,因为他们知道他们有一个安全网当重构出错时应该提供即时反馈。