gpt4 book ai didi

f# - FsCheck NUnit 。有条件的测试

转载 作者:行者123 更新时间:2023-12-04 06:53:09 24 4
gpt4 key购买 nike

我正在尝试对此功能进行测试

let extract_one_rule (rule:Rule.t<'a,'b>) = 
let rec expand = function
|PAlt (a,b) -> expand a @ expand b
|PSeq (a,b) -> let wrap = List.map (fun x -> (x.rule, fun r -> {x with rule = r})) a
|> List.unzip
in
let rec gen = function
| hd::tl -> [for x in hd -> x :: ( gen tl |> List.concat)]
| [] -> []
in
fst wrap |> List.map expand |> gen
|> List.map (fun x -> PSeq ((List.map2 ( |> ) x (snd wrap)),b))
|PRef _
|PLiteral _
|PToken _ as t -> [t]
| _ -> (System.Console.WriteLine("incorrect tree for alternative expanding!")
; failwith "incorrect tree for alternative expanding!")
in
expand rule.body |> List.map (fun x -> {rule with body = x})

使用 FsCheck
所以我有这个
let ExpandAlterTest(t : Rule.t<Source.t,Source.t> ) = convertToMeta t |> List.forall (fun x -> ruleIsAfterEBNF x)

但我会看到异常“替代扩展的树不正确!”
但是当我像那样使用 smth 时
let ExpandAlterTest(t : Rule.t<Source.t,Source.t> ) = (correctForAlExp t.body) ==> lazy ( convertToMeta t |> List.forall (fun x -> ruleIsAfterEBNF x))

NUnit 不会停止工作
为什么可以?

最佳答案

可能是您添加的前提条件非常严格,因此需要很长时间才能找到合适的值(实际上通过前提条件的值)。 FsCheck 对此进行了强化 - 默认情况下,它会尝试查找 100 个值,但是当它拒绝 1000 个值时,它会放弃并且您应该看到“x 测试后参数耗尽”输出。但这可能需要很长时间,如果生成和检查值需要很长时间。

也可能是您实际上在某处存在错误,例如无限循环。

尝试更改 FsCheck 配置以运行更少的测试,执行详细运行 (verboseCheck),并在调试器似乎挂起时中断它。

关于f# - FsCheck NUnit 。有条件的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2834710/

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