TDD如何与F#和Erlang等功能编程语言进行比较?
我还没有真正直接使用函数式编程语言,但是从我所看到的,你有一个等式的两个方面,它们必须在代数或会计方面保持平衡;这似乎有点让人想起TDD,你将期望的输出定义为Assert语句(等式的一边),其余的功能进入与测试分离的类(等式的另一面),除了函数式编程恕我直言似乎有点清洁。
两者实际上是否有相似之处,或者我只是过度思考这一点?
答案 0 :(得分:22)
他们是正交的。
答案 1 :(得分:9)
我认为TDD和函数式编程(FP)的不同之处在于TDD是一种方法论而FP是编程范式。
我会说FP在练习TDD时有助于FP,鼓励你在可能的情况下确定性。确定性函数比非确定性函数更容易测试。
答案 2 :(得分:6)
克里斯说他们是正交的是正确的。但是,函数式编程的某些方面使得函数式程序的测试变得更加容易。
功能程序由函数组成,并保证函数在所有上下文中的行为相同。这意味着当您在单元测试中测试函数时,您知道它将始终以这种方式工作。如果将其插入其他环境,则无需测试它是否有效。
函数接受参数并返回结果,这是他们唯一做的事情。这意味着您通常可以避免模拟和类似的技巧,因为您不需要验证函数是否对某些对象进行某些调用。您只需要验证它是否返回给定参数的预期结果。
最后,有一些很好的自动工具用于测试功能程序。对于F#,我们有FsCheck(基于Haskell已知的QuickCheck)。这些功能受益于功能程序的各种属性。
所以,他们都有不同的目的,本质上是一个不同的东西,但有一些很好的关系(可能像茶和茶壶 :-)他们是完全不同的东西,但一起工作得非常好!)
答案 3 :(得分:2)
在编写函数式程序时,你可能会使用等式推理来推导函数的定义。然而,这种推理通常不存在于某种形式(例如测试)中,因此通常不会以机器或人类可检查的方式证明函数是正确的。当然可以将TDD与函数语言一起使用(例如,使用任何与F#兼容的.NET TDD库)来验证函数是否已正确导出,但也有其他测试策略可能对函数式语言更为独特,例如使用QuickCheck用于随机规范检查。
答案 4 :(得分:0)
我认为两者之间的相似感觉源于这样一个事实,即两者都应该是确定性的。 FP函数不应该有副作用,并且应该通过注入存根来删除面向对象代码的测试函数中的副作用。