哪些单元测试框架可用于F#

| 我正在专门寻找使我能够利用该语言独特功能的框架。我知道FsUnit。您会推荐其他东西吗,为什么?     
已邀请:
我自己的单元测试库Unquote,利用F#引用使您可以将测试断言编写为纯的,静态检查的F#布尔表达式,并自动生成不错的分步测试失败消息。例如,以下xUnit测试失败
[<Fact>]
let ``demo Unquote xUnit support`` () =
    test <@ ([3; 2; 1; 0] |> List.map ((+) 1)) = [1 + 3..1 + 0] @>
产生以下失败消息
Test \'Module.demo Unquote xUnit support\' failed: 

([3; 2; 1; 0] |> List.map ((+) 1)) = [1 + 3..1 + 0]
[4; 3; 2; 1] = [4..1]
[4; 3; 2; 1] = []
false

        C:\\File.fs(28,0): at Module.demo Unquote xUnit support()
FsUnit和Unquote具有相似的任务:允许您以惯用的方式编写测试,并生成有用的故障消息。但是FsUnit实际上只是NUnit约束的一个小包装,创建了一个DSL,将对象构造隐藏在可组合函数调用之后。但这要付出代价:您会在断言中丢失静态类型检查。例如,以下内容在FsUnit中有效
[<Test>]
let test1 () =
    1 |> should not (equal \"2\")
但是使用Unquote,您可以获得F#的所有静态类型检查功能,因此等效断言甚至无法编译,从而阻止了我们在测试代码中引入错误。
[<Test>] //yes, Unquote supports both xUnit and NUnit automatically
let test2 () =
    test <@ 1 <> \"2\" @> //simple assertions may be written more concisely, e.g. 1 <>! \"2\"
    //           ^^^
    //Error 22 This expression was expected to have type int but here has type string
同样,由于报价能够在编译时捕获有关断言表达式的更多信息,因此失败消息也丰富得多。例如,失败的FsUnit断言“ 4”会产生消息
Test \'Test.Swensen.Unquote.VerifyNunitSupport.test1\' failed: 
  Expected: not 1
  But was:  1
    C:\\Users\\Stephen\\Documents\\Visual Studio 2010\\Projects\\Unquote\\VerifyNunitSupport\\FsUnit.fs(11,0): at FsUnit.should[a,a](FSharpFunc`2 f, a x, Object y)
    C:\\Users\\Stephen\\Documents\\Visual Studio 2010\\Projects\\Unquote\\VerifyNunitSupport\\VerifyNunitSupport.fs(29,0): at Test.Swensen.Unquote.VerifyNunitSupport.test1()
而失败的Unquote断言
1 <>! 1
会产生以下失败消息(也请注意更清洁的堆栈跟踪)
Test \'Test.Swensen.Unquote.VerifyNunitSupport.test1\' failed: 

1 <> 1
false

    C:\\Users\\Stephen\\Documents\\Visual Studio 2010\\Projects\\Unquote\\VerifyNunitSupport\\VerifyNunitSupport.fs(29,0): at Test.Swensen.Unquote.VerifyNunitSupport.test1()
当然,从这个答案开头的第一个例子中,您可以看到如何获得丰富而复杂的Unquote表达式和失败消息。 在FsUnit DSL上使用普通F#表达式作为测试断言的另一个主要好处是,它非常适合开发单元测试的F#过程。我认为许多F#开发人员都是在FSI的帮助下开始开发和测试代码的。因此,从临时FSI测试到正式测试非常容易。实际上,除了对xUnit和NUnit的特殊支持(尽管也支持任何基于异常的单元测试框架)之外,所有Unquote运算符也都在FSI会话中工作。     
我还没有尝试过Unquote,但是我觉得我不得不提到FsCheck: http://fscheck.codeplex.com/ 这是Haskells QuickCheck库的一个端口,您无需在其中指定要执行的特定测试,而是指定函数的哪些属性应为true。 对我来说,这比使用传统测试要难一些,但是一旦确定了属性,您将拥有更多可靠的测试。请阅读介绍:http://fscheck.codeplex.com/wikipage?title=QuickStart&referringTitle=Home 我猜想将FsCheck和Unquote混合使用是理想的选择。     
您可以尝试Expecto;它具有您可能喜欢的一些功能: 全文使用F#语法,将其作为值进行测试;编写普通的F#以生成测试 使用内置的Expect模块或外部库(例如Unquote)进行断言 默认情况下并行测试 测试您的Hopac代码或异步代码; Expecto在整个过程中都是异步的 通过Logary Facade可插入的日志记录和指标;轻松编写用于构建系统的适配器,或使用计时机制来构建测试执行时间的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
    

要回复问题请先登录注册