通过单元测试有什么意义?

Jer*_*oen 2 tdd unit-testing

假设我正在开发一种方法,我可以传入两个数字并获得最高数字.由于我正在做这种TDD风格,我将进行十几次单元测试并提出以下实现:

public int GetHighestNumber(int x, int y)
{
    if (x > y) return x;
    else return y;
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.

测试已用于创建实现.实施完成后,保持这些单元测试有什么意义?这就像在房子交付后将脚手架放在房子周围.

我不是在寻找单元测试的原因,或者是否/何时使用TDD.我只是好奇为什么在代码完全实现后应该保留单元测试,而不是将这些测试作为临时手段,并在不需要支持开发人员时删除.


编辑

在对CodeGnome发表评论后,我意识到我应该强调这只是关于TDD测试,这些测试主要是为了让开发人员指向正确的方向.脚手架可以这么说.

我很欣赏所有的评论.


阅读完所有消息后,我可以得出两件事:

  1. stackoverflow上没有人真正读取原始问题
  2. 你应该保留那些单元测试,不是因为测试本身有任何用处,而是因为你可能正在与高度无能的同事一起工作,这些测试可以防止他们做出令人难以置信的愚蠢的事情

Mic*_*rdt 9

现实生活中的代码几乎从未"完成".

需求变化和扩展.功能已添加.尽管有TDD,还有一些问题需要解决.

单元测试也可用作回归测试,以证明代码在这些更改后仍然有效.这实际上是单元测试中最有价值的方面(任何TDD支持者声称设计优势自欺欺人并不重要).

  • @Jeroen:我会说几乎没有代码就这么简单,也不能这么简单.如果是,你根本不需要测试. (2认同)
  • @Jeroen:如果你过度简化单个单元,你所实现的只是单元测试变得几乎毫无意义的make-work,而它们的重要性都转移到集成测试,因为集成是代码的复杂性转移到的地方,使整体变得更难了解. (2认同)

ass*_*ias 5

有几个原因(至少)浮现在脑海中:

  • 它们有助于记录您的代码应该/不应该做的事情
  • 推论:它们为未来的开发人员提供了方法的示例用法
  • 如果你想在以后阶段改变你的方法,它们就可以作为回归测试:你可以检查原始测试是否在你的更改后仍然通过,并且你没有破坏任何东西

编辑

"将不会对该方法进行任何更改,并且该级别的回归测试是不必要的"

直到一些聪明人到达并将代码更改为

if (x - y > 0) return x;
else return y;
Run Code Online (Sandbox Code Playgroud)

(是的,它可以并且将会发生,如果不是在那个方法中,在其他地方).

希望您的测试之一是:

assertEquals(Integer.MAX_VALUE, GetHighestNumber(Integer.MIN_VALUE, Integer.MAX_VALUE));
Run Code Online (Sandbox Code Playgroud)

那个测试会失败.