相关疑难解决方法(0)

fscheck不会生成足够随机的数据

我正在玩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.

价值不应该更"随机"吗?

f# quickcheck fscheck

6
推荐指数
1
解决办法
192
查看次数

如何使用FsCheck的固定项目列表创建生成器

我最初尝试创建一个固定前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提供程序更容易.

random f# fscheck

4
推荐指数
1
解决办法
251
查看次数

标签 统计

f# ×2

fscheck ×2

quickcheck ×1

random ×1