2

この機能のテストをしようとしています

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 の動作が停止しない なぜそうなるのか?

4

1 に答える 1

3

追加した前提条件が非常に制限的であるため、適切な値 (実際に前提条件を通過する値) が見つかるまでに長い時間がかかる可能性があります。FsCheck はこれに対して強化されています。デフォルトでは、100 個の値を見つけようとしますが、1000 個を拒否するとあきらめ、「x テスト後に引数が尽きました」という出力が表示されるはずです。ただし、値の生成とチェックに時間がかかる場合、これには長い時間がかかる可能性があります。

また、無限ループなど、実際にどこかにバグがある可能性もあります。

FsCheck 構成を変更して実行するテストの数を減らし、詳細な実行 (verboseCheck) を実行し、ハングしているように見える場合はデバッガーを中断してみてください。

于 2010-05-22T15:53:31.157 に答える