Mat*_*ias 104 tdd f# unit-testing functional-programming
我刚开始使用F#,这是我的第一个功能语言.我一直在使用C#进行准独家工作,并且很享受F#引导我重新思考如何编写代码.我觉得有点迷惑的一个方面是编写代码的过程发生了变化.我现在已经在C#中使用TDD多年了,非常感谢有单元测试知道我在哪里.
到目前为止,我用F#过程中一直写一些功能,和他们一起玩与交互式控制台,直到我在"合理"确保他们的工作,并调整与合并.这适用于像欧拉项目这样的小规模问题,但我无法想象以这种方式构建大的东西.
人们如何进行单元测试并为F#程序构建测试套件?是否有相当于TDD?任何指针或想法都表示赞赏.
Ray*_*gus 74
测试驱动的开发人员应该在F#这样的函数式语言中感到宾至如归:提供确定性可重复结果的小函数非常适合单元测试.F#语言中还有一些功能可以帮助编写测试.以对象表达式为例.您可以非常轻松地为将输入作为接口类型的函数编写伪造.
如果有的话,F#是一流的面向对象语言,您可以使用在C#中执行TDD时使用的相同工具和技巧.还有一些用于F#编写或专门用于F#的测试工具:
Matthew Podwysocki写了一篇关于函数式语言单元测试的精彩系列文章.Bob大叔还写了一个发人深省的文章在这里.
Dav*_*man 22
我使用NUnit,它不会让我觉得难以阅读或繁琐的写作:
open NUnit.Framework
[<TestFixture>]
type myFixture() = class
[<Test>]
member self.myTest() =
//test code
end
Run Code Online (Sandbox Code Playgroud)
由于我的代码是F#和其他.Net语言的混合,我喜欢这样的事实:我在F#和C#中以基本相同的方式和类似的语法编写单元测试.
pri*_*mus 15
看看Fs的自动测试工具FsCheck,基本上是Haskell的QuickCheck的一个端口.它允许您以函数或方法应满足的属性的形式提供程序的规范,并且FsCheck测试属性在大量随机生成的情况下保存.
Mar*_*ann 11
我认为这是一个非常有趣的问题,我自己也很想知道.到目前为止,我的想法只是思想,所以请把它们当作它们.
我认为自动化测试套件的安全网是一种非常有价值的资产,不管它如何引人注目,因此我计划继续编写单元测试,就像我一直以来所做的那样.
.NET的主要优势之一是跨语言功能.我知道我会尽快写F#的生产代码,但我的计划是编写单元测试在C#我的方式缓解到什么对我来说是一个新的语言.通过这种方式,我还可以测试我在F#中编写的内容是否与C#(以及其他.NET语言)兼容.
通过这种方法,我了解到F#的某些功能我只能在我的F#代码中内部使用,但不作为我的公共API的一部分公开,但我会接受,就像我今天接受某些事情一样C#允许我表达(喜欢uint)不符合CLS的内容,因此我不会使用它们.
Ade*_*ler 11
正如dglaubman建议您可以使用NUnit.xUnit.net也为此提供支持,并与TestDriven.net配合使用.代码看起来类似于NUnit测试,但没有要求将测试包装在包含类型中.
#light
// Supply a module name here not a combination of module and namespace, otherwise
// F# cannot resolve individual tests nfrom the UI.
module NBody.DomainModel.FSharp.Tests
open System
open Xunit
open Internal
[<Fact>]
let CreateOctantBoundaryReordersMinMax() =
let Max = VectorFloat(1.0, 1.0, 1.0)
let Min = VectorFloat(-1.0, -1.0, -1.0)
let result = OctantBoundary.create Min Max
Assert.Equal(Min, result.Min)
Assert.Equal(Max, result.Max)
Run Code Online (Sandbox Code Playgroud)