如果我不花太多时间调试,做TDD是否有意义?

时间:2012-02-25 09:33:44

标签: debugging haskell f# tdd

我试图为自己设置一个使用TDD的案例,通常的打击线是如果你做TDD你不需要花太多时间调试。我在F#编程并找到我花了很少时间调试,代码通常第一次工作。

所以问题是TDD穿孔线是否在其他方向工作 - 如果我不调试那么我不需要测试?您对使用F#或Haskell的TDD有什么经验?在F#或Haskell中有没有使用TDD的好的开源项目?预防过度工程的其他好处是否超过了成本?

4 个答案:

答案 0 :(得分:10)

当您的代码大幅增长时,当有多个人在使用它时,当您想确保更改不会在功能上破坏代码并且不会引入性能回归时,当您想要确保下一个代码时当您想要确保代码适用于操作系统的多个版本和配置,当错误的成本很高并且可能导致严重的财务或法律问题等时,版本/发行版不会与前一个版本不兼容等等,你需要进行测试。

答案 1 :(得分:4)

调试所花费的时间与代码的复杂性成正比。 TDD是一种在设计时和维护时间内降低代码复杂性的方法,因此如果您编写的代码非常简单,那么第一个问题的答案就是否定。

您的代码有效,您不需要证明它有效,没有人会改变您的代码?如果这是真的那么你就不需要测试了。

对我来说,功能编程在设计和实现方面都不易出错,因此我发现TDD的价值较低。 (再见第一段)

防止过度工程是一件很棒的事情。大多数项目虽然没有这个要求,但确实需要时间。过度工程很有趣。任何告诉你的人都在否认他们的内部工程师。

我认为TDD是你需要练习的东西,然后才能体会到它的价值。为测试用例编写函数签名通常足以让我弄清楚我遇到的任何设计问题。我很少填写所有测试代码,因为我也很少有要求强迫我返回并更改我的代码。您的里程可能会根据您的需求而有所不同。

答案 2 :(得分:3)

这是关于TDD有什么好处的好文章。这有点诙谐,讽刺地写,但它首先证明了测试的价值:10 Reasons to Avoid Test Driven Development

答案 3 :(得分:3)

您花费更少的时间来调试F#程序,因为类型系统和对不可变数据结构和纯函数的强调消除了整个类的无效程序。

所以“如果你做TDD你没有花太多时间调试”这句话的说法确实在某种程度上保持不变,但应该是“如果你的编程语言有需要你调试的功能,那么这可能意味着你需要更少的单元测试“。也就是说,单元测试用于证明代码的正确性,但是像F#这样的语言有编译器可以证明你的代码“免费”比动态语言更多。

话虽如此,单元测试仍然是ML系列语言中非常强大的工具,如F#,用于证明代码的正确性,但您可以专注于功能的正确性而不是使用的正确性语言。

我所有的F#开源项目都有严格的单元测试套件(我认为它们非常好:)并且它们给了我宝贵的安心,并且多次保护我免受回归问题的影响。