【发布时间】:2017-04-25 05:17:18
【问题描述】:
我最初尝试创建一个固定前 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
输出是(不知道null 来自哪里):
0:
<null>
9223372036854775807L
1:
<null>
-9223372036854775807L
2:
<null>
-9223372036854775807L
3:
<null>
1L
4:
<null>
-9223372036854775807L
Ok, passed 5 tests.
我希望输出包含序列中的所有五个测试,最好但不一定是按顺序排列。我知道我可以使用 testdata 提供程序使用 NUnit(或任何单元测试系统)来做到这一点,但我想知道我是否可以使用 FsCheck 来做到这一点(或者我是否应该这样做,也许这是一个坏主意)。
我认为使用 FsCheck 很有用,至于有多个函数参数的情况,我希望它能够详尽地测试我给它的所有极端情况参数的组合。这希望使用 FsCheck 比使用测试数据提供者更容易。
【问题讨论】:
-
大声思考,解决这个问题的一种方法可能是使用数字生成器的非随机性(或检查它是如何完成的),对于整数,它似乎完全按照我需要的方式工作工作(参见我的earlier question 的 FsCheck 输出)