哪些单元测试框架可用于 F# [英] What unit testing frameworks are available for F#

查看:22
本文介绍了哪些单元测试框架可用于 F#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找能够让我利用该语言独特功能的框架.我知道 FsUnit.你会推荐其他东西吗?为什么?

I am looking specifically for frameworks that allow me to take advantage of unique features of the language. I am aware of FsUnit. Would you recommend something else, and why?

推荐答案

我自己的单元测试库,取消引用,利用F#引用让您将测试断言编写为简单的、静态检查的 F# 布尔表达式,并自动生成漂亮的分步测试失败消息.例如,以下失败的 xUnit 测试

My own unit testing library, Unquote, takes advantage of F# quotations to allow you to write test assertions as plain, statically checked F# boolean expressions and automatically produces nice step-by-step test failure messages. For example, the following failing xUnit test

[<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 中有效

FsUnit and Unquote have similar missions: to allow you to write tests in an idiomatic way, and to produce informative failure messages. But FsUnit is really just a small wrapper around NUnit Constraints, creating a DSL which hides object construction behind composable function calls. But it comes at a cost: you lose static type checking in your assertions. For example, the following is valid in FsUnit

[<Test>]
let test1 () =
    1 |> should not (equal "2")

但是使用 Unquote,您可以获得 F# 的所有静态类型检查功能,因此等效的断言甚至无法编译,从而防止我们在测试代码中引入错误

But with Unquote, you get all of F#'s static type-checking features so the equivalent assertion would not even compile, preventing us from introducing a bug in our test code

[<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 断言 1 |>不应该(等于 1) 产生消息

Also, since quotations are able to capture more information at compile time about an assertion expression, failure messages are a lot richer too. For example the failing FsUnit assertion 1 |> should not (equal 1) produces the message

Test 'Test.Swensen.Unquote.VerifyNunitSupport.test1' failed: 
  Expected: not 1
  But was:  1
    C:UsersStephenDocumentsVisual Studio 2010ProjectsUnquoteVerifyNunitSupportFsUnit.fs(11,0): at FsUnit.should[a,a](FSharpFunc`2 f, a x, Object y)
    C:UsersStephenDocumentsVisual Studio 2010ProjectsUnquoteVerifyNunitSupportVerifyNunitSupport.fs(29,0): at Test.Swensen.Unquote.VerifyNunitSupport.test1()

而失败的 Unquote 断言 1 <>!1 产生以下失败信息(注意更干净的堆栈跟踪)

Whereas the failing Unquote assertion 1 <>! 1 produces the following failure message (notice the cleaner stack trace too)

Test 'Test.Swensen.Unquote.VerifyNunitSupport.test1' failed: 

1 <> 1
false

    C:UsersStephenDocumentsVisual Studio 2010ProjectsUnquoteVerifyNunitSupportVerifyNunitSupport.fs(29,0): at Test.Swensen.Unquote.VerifyNunitSupport.test1()

当然,从我在本答案开头的第一个示例中,您可以看到 Unquote 表达式和失败消息有多么丰富和复杂.

And of course from my first example at the beginning of this answer, you can see just how rich and complex Unquote expressions and failure messages can get.

使用普通 F# 表达式作为 FsUnit DSL 上的测试断言的另一个主要好处是它非常适合开发单元测试的 F# 过程.我认为很多 F# 开发人员都是在 FSI 的帮助下开发和测试代码的.因此,从临时 FSI 测试到正式测试非常容易.事实上,除了对 xUnit 和 NUnit 的特殊支持(尽管也支持任何基于异常的单元测试框架),所有 Unquote 运算符也在 FSI 会话中工作.

Another major benefit of using plain F# expressions as test assertions over the FsUnit DSL, is that it fits very well with the F# process of developing unit tests. I think a lot of F# developers start by developing and testing code with the assistance of FSI. Hence, it is very easy to go from ad-hoc FSI tests to formal tests. In fact, in addition to special support for xUnit and NUnit (though any exception-based unit testing framework is supported as well), all Unquote operators work within FSI sessions too.

这篇关于哪些单元测试框架可用于 F#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆