Первоначально я пытался создать генератор с фиксированными первыми 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.
Я хотел бы, чтобы выходные данные содержали все пять тестов в последовательности, желательно, но не обязательно, по порядку. Я знаю, что могу сделать это с помощью NUnit (или любой системы модульного тестирования) с помощью поставщика тестовых данных, но мне интересно, смогу ли я сделать это с помощью FsCheck (или мне следует, возможно, это плохая идея).
Я думаю, что использование FsCheck полезно, поскольку в ситуации, когда есть более одного аргумента функции, я хочу, чтобы он исчерпывающе проверял все комбинации аргументов крайних случаев, которые я ему даю. Надеюсь, с FsCheck это проще, чем с поставщиком тестовых данных.