fscheck не генерирует достаточно случайных данных
Я играю с 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 ответ
Решение
Когда вы используете 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 используют контекст размера для определения размера или диапазона генерируемых им значений.
Если вы измените 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