【发布时间】:2008-10-28 18:37:05
【问题描述】:
我在 MVCStoreFront 应用程序上观看 Rob Connerys 的网络广播,我注意到他正在对最平凡的事情进行单元测试,例如:
public Decimal DiscountPrice
{
get
{
return this.Price - this.Discount;
}
}
会有这样的测试:
[TestMethod]
public void Test_DiscountPrice
{
Product p = new Product();
p.Price = 100;
p.Discount = 20;
Assert.IsEqual(p.DiscountPrice,80);
}
虽然我完全支持单元测试,但有时我想知道这种形式的测试优先开发是否真的有益,例如,在实际流程中,您的代码上方有 3-4 层(业务请求、需求文档、架构文档),其中实际定义的业务规则(折扣价格是价格 - 折扣)可能被错误定义。
如果是这种情况,您的单元测试对您来说毫无意义。
此外,您的单元测试是另一个失败点:
[TestMethod]
public void Test_DiscountPrice
{
Product p = new Product();
p.Price = 100;
p.Discount = 20;
Assert.IsEqual(p.DiscountPrice,90);
}
现在测试有缺陷。显然在一个简单的测试中,这没什么大不了的,但是假设我们正在测试一个复杂的业务规则。我们在这里有什么收获?
应用程序生命周期快进两年,此时维护开发人员正在对其进行维护。现在业务改变了它的规则,测试又中断了,一些菜鸟开发者错误地修复了测试……我们现在又遇到了一个故障点。
我看到的都是更多可能的失败点,没有真正的收益回报,如果折扣价格错误,测试团队仍然会发现问题,单元测试如何节省任何工作?
我在这里缺少什么?请教我热爱 TDD,因为到目前为止我很难接受它是有用的。我也想,因为我想保持进步,但这对我来说没有意义。
编辑:有几个人一直提到测试有助于执行规范。根据我的经验,规范也经常出错,但也许我注定要在一个规范由不应该编写规范的人编写的组织工作。
【问题讨论】:
-
在许多情况下,单元测试是规范和文档!
-
……然后单元测试单元测试的单元测试……但是unit^4测试和unit^5测试呢……aaaaaaaaahhhhhhhhh!
-
再多的任何类型的测试都不会让您避免错误的规范。
-
有没有其他人听到像一只手拍手的声音?
-
我认为合适的引用是“这只是海龟一路下来。”
标签: tdd agile test-first