FsCheck NUnit. Тесты с условием - PullRequest
2 голосов
/ 14 мая 2010

Я пытаюсь сделать тест для этой функции

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)

но я вижу исключение "неверное дерево для альтернативного расширения!" но когда я использую что-то подобное

let ExpandAlterTest(t : Rule.t<Source.t,Source.t> ) = (correctForAlExp t.body) ==> lazy ( convertToMeta t |> List.forall (fun x -> ruleIsAfterEBNF x))

NUnit не перестает работать Почему это может быть?

1 Ответ

3 голосов
/ 22 мая 2010

Может случиться так, что добавленное вами предварительное условие является очень ограничительным, поэтому может пройти много времени, прежде чем будет найдено хорошее значение (то, которое фактически проходит предварительное условие). FsCheck защищен от этого - по умолчанию он пытается найти 100 значений, но когда он отклонил 1000, он сдается, и вы должны увидеть вывод «Аргументы исчерпаны после x тестов». Но это может занять много времени, если генерация и проверка значения занимают много времени.

Возможно также, что у вас где-то есть ошибка, например, бесконечный цикл.

Попробуйте изменить конфигурацию FsCheck для запуска меньшего количества тестов, выполнить подробный запуск (verboseCheck) и отключить отладчик, когда он кажется зависшим.

...