当我写代码时,我只在我需要的时候写我需要的函数。
这种方法也适用于编写测试吗?
为了安全起见,我应该为我能想到的每个用例预先编写一个测试,还是应该只为我遇到的用例编写测试?
发布于 2009-06-03 15:52:22
我认为当你写一个方法时,你应该测试预期的和潜在的错误路径。这并不意味着您应该扩展您的设计以涵盖每一个潜在的用途--把它留到需要的时候,但是您应该确保您的测试在面对无效参数或其他条件时定义了预期的行为。
据我所知,YAGNI意味着你不应该开发还不需要的特性。从这个意义上说,你不应该写一个测试来驱使你去开发不需要的代码。不过,我怀疑这不是你想问的。
在这种情况下,我更关心的是您是否应该编写涵盖意外用途的测试--例如,由于传递null或超出范围的参数而导致的错误--还是应该重复测试,这些测试只是在数据方面而不是在功能方面有所不同。在前一种情况下,正如我在上面指出的,我会说是。您的测试将记录您的方法在面对错误时的预期行为。这对于使用你的方法的人来说是很重要的信息。
在后一种情况下,我不能给您一个明确的答案。您当然希望您的测试保持干燥--不要编写简单地重复另一个测试的测试,即使它有不同的数据。或者,您可能不会发现潜在的设计问题,除非您练习数据的边缘情况。一个简单的例子是一个计算两个整数和的方法:如果将它作为两个参数都作为maxint传递,会发生什么?如果你只有一个测试,那么你可能会错过这个行为。显然,这与上一点有关。只有你才能确定什么时候真的需要测试。
发布于 2009-06-03 15:47:37
是的,YAGNI绝对适用于编写测试。
举个例子,我不会写测试来检查任何属性。我假设属性是以某种方式工作的,除非我找到一个做一些与规范不同的事情的属性,否则我不会对它们进行测试。
您应该始终考虑编写任何测试的有效性。如果写测试对你没有明显的好处,那么我建议你不要写。然而,这显然是非常主观的,因为你可能认为不值得别人认为非常值得的努力。
另外,我是否需要编写测试来验证输入?绝对一点儿没错。然而,我会把它到一个点。假设你有一个函数,它有3个整型参数,它返回一个双精度型。你要围绕这个函数写多少个测试。我将在这里使用YAGNI来确定哪些测试将为您提供良好的投资回报,哪些测试是无用的。
发布于 2009-06-03 15:48:51
在需要的时候编写测试。测试就是代码。预先编写一堆(最初失败的)测试打破了TDD的红色/修复/绿色循环,并使识别有效的失败与未编写的代码变得更加困难。
https://stackoverflow.com/questions/945493
复制相似问题