6

我是单元测试的n00b。我已经从 Nuget 安装了FsCheck.NunitNUnitTestAdapter我正在尝试进行基于属性的测试,这在很大程度上受到了不可估量的 Scott Wlaschin 的启发。

我正在使用该[<Property>]属性,并且我希望能够“跳过”不符合测试要求的输入:

[<Property(MaxTest=10)>]
let ``Calling unzipTo with an invalid destination will yield a failure.`` badDest =
    if Directory.Exists(badDest)
    then // somehow skip to the next randomized input
    else // do the actual test

最简单的方法是什么?

如果 FsCheck/NUnit 存在,我更喜欢它的答案,但我也会考虑其测试可以在 Visual Studio 中运行的任何其他框架。(我以为我看到了一些框架,其中有一个简单的函数可以做到这一点,但我不知道它是什么。)

到目前为止,我更喜欢 FsCheck.NUnit,因为它可以为 F# 类型(可区分联合等)生成随机输入,而无需额外的工作。

4

3 回答 3

6

你应该能够做这样的事情:

open FsCheck
open FsCheck.Xunit

[<Property(MaxTest=10)>]
let ``Calling unzipTo with an invalid destination will yield a failure.`` badDest =
    (not Directory.Exists(badDest)) ==> lazy
    // do the actual test

第一行是一个布尔条件,==>FsCheck模块定义的自定义运算符。如果右侧的条件评估为 ,它只会强制评估惰性表达式true

但是,请考虑重构此测试,使其不依赖于文件系统。文件系统是持久化的,所以会自动创建一个Persistent Fixture,管理起来很麻烦;不是不可能处理,但最好避免。

此示例使用FsCheck.Xunit,但 IIRC FsCheck.Nunit的工作方式相同。不过,您应该认真考虑使用FsCheck.Xunit而不是FsCheck.Nunit。NUnit 2 的可扩展性模型非常差,这意味着大多数试图扩展 NUnit 的 Glue 库都会遇到很多问题。这不是FsCheck.Nunit的问题,而是 NUnit 本身的问题,但它会给你带来很多麻烦。

于 2016-01-07T15:07:35.257 回答
1

FsCheck.Prop.discard()似乎做了我想做的事——当我用日志记录运行测试时,我可以看到一些尝试被丢弃了,但有 10 次运行完成而没有被丢弃。

==>操作员用于运行测试FsCheck.Quick或类似测试。但是,这要求惰性部分采用“可测试”的格式,我目前正在编写的测试只是<inputs>->unit.

于 2016-01-07T18:23:11.803 回答
0

我对 F# 或 fscheck 不是很熟悉,但 NUnit 提供了该Assert.Ignore()功能,它会立即停止测试并将其标记为“忽略”。Assert.Inconclusive()如果Assert.Pass()您认为这些状态更合适,您也可以使用。

于 2016-01-07T14:02:07.920 回答