使用FsCheck编写Property-based的测试 (2)

上面的例子使用Gen.Constant 42来作为每一个List元素的Generator,通过这种方式生成的lists只包含42。生成的数据如下:

[[42]; [42]; [42]; [42]; [42]; [42]; [42]; [42]; [42]; [42]]

除了使用Gen.ListOf,你还可以通过Gen.NoEmptyListOf来生成至少包含有一个元素的lists:

var gen = Gen.Elements("foo", "bar", "baz") .NonEmptyListOf(); var value = Gen.Sample(3, 4, gen);

F#

Gen.elements ["foo"; "bar"; "baz"] |> Gen.nonEmptyListOf |> Gen.sample 3 4

生成的输入如下:

[["foo"; "bar"; "baz"], ["foo"], ["baz", "bar"]] Filter

你已经可以通过上面的Generator来生成各种各样的数据了,你还可以通过Gen.Filter进行过滤,例如下面的例子:

var gen = Gen.Choose(1, 100) .Two() .Where(x => x.Item1 != x.Item2) .Select(x => new List<int> {x.Item1, x.Item2}); var value = gen.Sample(0, 10);

F#

Gen.choose (1, 100) |> Gen.two |> Gen.filter (fun (x, y) -> x <> y) |> Gen.map (fun (x, y) -> [x; y]) |> Gen.sample 0 10

生成的数据如下:

[[30; 89]; [12; 82]; [66; 47]; [82; 40]; [64; 5]; [18; 35]; [61; 42]; [14; 29]; [83; 93]; [100; 37]]

掌握了Generator,下一篇将介绍Shrinker和自定义Arbitrary类型。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspfwd.html