FsCheck无法生成足够随机的数据

6
我正在使用FsCheck进行实验,这是我的实现代码:

```

let add a b = 
    if a > 100
    then failwith "nasty bug"
    else a + b

...以及这个基于FsCheck的测试:

fun (a:int) -> (add a 0) = a
|> Check.QuickThrowOnFailure

测试从未失败。我猜测,由随机生成器产生的100个值永远不会大于100。

这些值不应该更加“随机”吗?

1个回答

11

当您使用 Check.QuickThrowOnFailure 时,它将使用配置 Config.QuickThrowOnFailure,该配置具有以下值:

> Config.QuickThrowOnFailure;;
val it : Config =
  {MaxTest = 100;
   MaxFail = 1000;
   Replay = null;
   Name = "";
   StartSize = 1;
   EndSize = 100;
   QuietOnSuccess = false;
   Every = <fun:get_Quick@342>;
   EveryShrink = <fun:get_Quick@343-1>;
   Arbitrary = [];
   Runner = <StartupCode$FsCheck>.$Runner+get_throwingRunner@355;}

在这里需要考虑的重要值是StartSize,但特别是EndSize。 FsCheck中的某些生成器使用size上下文来确定它所生成值的大小或范围。

如果您将EndSize更改为例如1,000,则测试可能会失败:

> Check.One({Config.QuickThrowOnFailure with EndSize = 1000}, fun (a:int) -> (add a 0) = a);;
System.Exception: Falsifiable, after 15 tests (0 shrinks) (StdGen (1912816373,296229213)):
Original:
101
with exception:
> System.Exception: nasty bug
   at FSI_0040.add(Int32 a, Int32 b)
   at FSI_0055.it@69-6.Invoke(Int32 a)
   at FsCheck.Testable.evaluate[a,b](FSharpFunc`2 body, a a) in C:\Users\Kurt\Projects\FsCheck\FsCheck\src\FsCheck\Testable.fs:line 161

   at <StartupCode$FsCheck>.$Runner.get_throwingRunner@365-1.Invoke(String message) in C:\Users\Kurt\Projects\FsCheck\FsCheck\src\FsCheck\Runner.fs:line 365
   at <StartupCode$FsCheck>.$Runner.get_throwingRunner@355.FsCheck-IRunner-OnFinished(String , TestResult ) in C:\Users\Kurt\Projects\FsCheck\FsCheck\src\FsCheck\Runner.fs:line 365
   at FsCheck.Runner.check[a](Config config, a p) in C:\Users\Kurt\Projects\FsCheck\FsCheck\src\FsCheck\Runner.fs:line 275
   at <StartupCode$FSI_0055>.$FSI_0055.main@()
Stopped due to error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接