我正在玩FsCheck所以我有这个实现:
let add a b =
if a > 100
then failwith "nasty bug"
else a + b
Run Code Online (Sandbox Code Playgroud)
......以及基于FsCheck的测试:
fun (a:int) -> (add a 0) = a
|> Check.QuickThrowOnFailure
Run Code Online (Sandbox Code Playgroud)
而测试永远不会失败.我的猜测是随机生成器产生的100个值绝不会大于100.
价值不应该更"随机"吗?
我最初尝试创建一个固定前5个元素的生成器(并且在使用Prop.forAll前五个元素的任何测试中总是会运行),但是这样做失败了.
现在我试图通过为一个范围内的随机数据生成一个生成器,并为非随机数据生成一个生成器(即固定序列)来简化此操作.它类似于Gen.constant,除了代替一个值,它是一系列值.
我有这个(简化的可重现的例子,适用于NUnit和xUnit):
[<Property(Verbose = true, MaxTest=5)>]
static member MultiplyIdentityCornerCases () =
Gen.elements [0L; -1L; 1L; Int64.MinValue; Int64.MaxValue]
|> Arb.fromGen
|> Prop.forAll <| fun x -> x = x * 1L
Run Code Online (Sandbox Code Playgroud)
输出是(不知道null它来自哪里):
0:
<null>
9223372036854775807L
1:
<null>
-9223372036854775807L
2:
<null>
-9223372036854775807L
3:
<null>
1L
4:
<null>
-9223372036854775807L
Ok, passed 5 tests.
Run Code Online (Sandbox Code Playgroud)
我希望输出包含序列中的所有五个测试,最好是但不一定按顺序排列.我知道我可以使用测试数据提供程序使用NUnit(或任何单元测试系统),但我想知道我是否可以使用FsCheck(或者我是否应该这样做,也许这是一个坏主意).
我认为使用FsCheck是有用的,对于有多个函数参数的情况,我希望它能够详尽地测试我提供的极端情况参数的所有组合.使用FsCheck比使用testdata提供程序更容易.