gpt4 book ai didi

testing - 使用 FsCheck 我在测试中得到不同的结果,一次 100% 通过,另一次出错

转载 作者:行者123 更新时间:2023-11-28 20:10:23 24 4
gpt4 key购买 nike

我创建了一个生成器来生成具有相同长度的 int 列表并测试 zip 和 unzip 的属性。运行测试我偶尔会遇到错误

Error: System.ArgumentException: list2 is 1 element shorter than list1

但由于我的发电机,这不应该发生。

我得到了 3 次测试 100% 通过,然后出现上面的错误。为什么?看来我的发电机工作不正常。

let samelength (x, y) = 
List.length x = List.length y

let arbMyGen2 = Arb.filter samelength Arb.from<int list * int list>

type MyGenZ =
static member genZip() =
{
new Arbitrary<int list * int list>() with
override x.Generator = arbMyGen2 |> Arb.toGen
override x.Shrinker t = Seq.empty
}

let _ = Arb.register<MyGenZ>()

let pro_zip (xs: int list, ys: int list) =
(xs, ys) = List.unzip(List.zip xs ys)
|> Prop.collect (List.length xs = List.length ys)

do Check.Quick pro_zip

最佳答案

您编写的代码对我有用。所以我不确定到底出了什么问题,但我可以给你一些有用的(希望如此!)提示。

首先,尝试不使用注册机制,而是使用Prop.forAll,如下:

let pro_zip  = 
Prop.forAll arbMyGen2 (fun (xs,ys) ->
(xs, ys) = List.unzip(List.zip xs ys)
|> Prop.collect (List.length xs))

do Check.Quick pro_zip

请注意,我还更改了您的 Prop.collect 调用以收集列表的长度,这提供了更有趣的输出。事实上,您的属性已经检查列表是否具有相同的长度(尽管是隐式的),因此如果它们不是,则测试将失败并出现反例。

Arb.filter 将现有的 Arbitrary(即生成器 过滤器)转换为新的 Arbitrary。换句话说,arbMyGen2 有一个可以工作的收缩函数(即只返回长度相等的较小的列表对),而在 genZip() 中你抛出缩小。简单写一下就好了

type MyGenZ =
static member genZip() = arbMyGen2

相反。

关于testing - 使用 FsCheck 我在测试中得到不同的结果,一次 100% 通过,另一次出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56364287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com