我刚刚开始使用F#,这是我的第一个功能性的语言。 我一直在工作的准专门与C#和F#如何使我重新思考我如何写代码享受了一番。 一方面我觉得有点迷惑是在编写代码的过程中变化。 我一直在使用TDD多年在C#中,现在,真的很感谢有单元测试就知道我在哪里。
到目前为止,我用F#过程中一直写一些功能,和他们一起玩与交互式控制台,直到我在“合理”确保他们的工作,并调整与合并。 这非常像欧拉项目规模小的问题,但我无法想象建设事大呀。
人们如何接近单元测试和构建测试套件的F#程序? 是否有一个相当于TDD? 任何指针或想法赞赏。
测试驱动的开发人员应该觉得函数式语言如F#宾至如归:小功能,让确定性重复的结果借给自己完美的单元测试。 也有在F#语言功能,便于编写测试。 举个例子来说, 对象表达式 。 你可以很容易写的是取作为其输入接口类型功能假货。
如果有的话,F#是一流的面向对象的语言,你可以使用在C#进行TDD时,使用相同的工具和技巧。 也有写的,或是专门用于F#的一些测试工具:
- NaturalSpec
- FsCheck
- FsTest
- FsUnit
马修Podwysocki写了一个伟大的一系列关于函数式语言的单元测试。 Bob大叔还写了一个发人深省的文章在这里 。
我使用NUnit,它不罢工我难以阅读或繁重的写:
open NUnit.Framework
[<TestFixture>]
type myFixture() = class
[<Test>]
member self.myTest() =
//test code
end
由于我的代码是F#和其它.NET语言的混合,我喜欢的是我写的单元测试基本相同的方式,并在这两个F#和C#类似的语法。
看一看FsCheck,F#的自动测试工具,基本上是Haskell的快速检查的端口。 它允许提供该程序的说明书中,该功能或方法应满足属性的形式,和FsCheck测试该性能在大量的随机生成的情况下成立。
FsCheck CodePlex上页
FsCheck作者页
作为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)
我觉得这是我想了很多自己是一个很有趣的问题。 我的想法至今都只是想法,所以带他们到底是什么。
我认为,一个自动化测试套件的安全网是太宝贵的资产放手,但诱人的交互式控制台的可能,所以我打算继续编写单元测试,因为我一直在做的。
一个.NET的主要优势之一是跨语言的能力。 我知道我会尽快写F#的生产代码,但我的计划是编写单元测试在C#我的方式缓解到什么对我来说是一个新的语言。 就这样,我也得来测试什么,我F中写#将与C#(和其他.NET语言)兼容。
通过这种方法,据我所知,有F#,我只能在我的F#代码在内部使用,但不能暴露我的公共API的一部分的某些特征,但我会接受这一点,就像我今天接受,有一些事情C#允许我表达(如uint
)是不符合CLS,所以我避免使用核武器。
你可以看看FSUnit -虽然我还没有使用它,它可能值得一试。 当然,不是在F#中使用例如(本机)NUnit的更好。
尽管是有点迟到了,我想欢迎马蒂亚斯到F#(迟到总比不到好;))和帮腔,你可能会喜欢Expecto
Expecto有一些你可能会喜欢的功能:
- F#的语法贯穿始终,测试,价值观; 写简单的F#生成测试
- 使用内置的期待模块,或外部LIB像引文结束的断言
- 并行测试默认
- 测试你的Hopac代码或您的异步代码; Expecto在整个异步
- 可插拔记录和经由Logary门面度量; 轻松地编写适配器构建系统,或者使用定时机制,建立你的测试的执行时间的InfluxDB + Grafana仪表板
- 内置支持BenchmarkDotNet
- 建立在FsCheck支持; 可以很容易地建立与生成/随机数据或建立你的对象/演员的状态空间不变的模型试验
-
open Expecto
let tests =
test "A simple test" {
let subject = "Hello World"
Expect.equal subject "Hello World" "The strings should equal"
}
[<EntryPoint>]
let main args =
runTestsWithArgs defaultConfig args tests
https://github.com/haf/expecto/