2010-05-14 7 views
2

와 테스트 그래서 내가이FsCheck NUnit. 조건

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

을 가지고 있지만 예외 i'l 참조 FsCheck 를 사용하여이 기능

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}) 

에 대한 테스트를 만들기 위해 노력하고있어 "대안 확장하는 잘못된 트리를!" 하지만 난 그것을 할 수 있습니다 왜 를 작동을 중지하지 않는

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

NUnit과 같이 떨어지게를 사용하는 경우?

답변

3

추가 한 전제 조건은 매우 제한적이어서 좋은 값 (실제로 전제 조건을 통과하는 값)이 발견되기까지 시간이 오래 걸릴 수 있습니다. FsCheck는 기본적으로 100 개의 값을 찾으려고 시도하지만, 1000을 거부하면 포기하고 "x 테스트 후 고갈 된 인수"출력이 표시됩니다. 그러나 값을 생성하고 확인하는 데 오랜 시간이 걸리면 시간이 오래 걸릴 수 있습니다.

실제로 무한 루프와 같은 어딘가에 버그가있을 수도 있습니다.

FsCheck 구성을 변경하여 적은 테스트를 실행하고, 자세한 실행 (verboseCheck)을 실행하고, 멈춘 것처럼 보일 때 디버거를 중단하십시오.