2014-04-06 1 views
0

다음 사용 사례를 고려하십시오. 두 개의 테스트 케이스 prop_testCase1prop_testCase2으로 구성된 빠른 검사 (QuickCheck) 테스트 스위트가 있습니다. hpc을 사용하여 테스트 스위트의 코드 적용 범위를 관찰 할 수 있습니다.실행 중 hpc 정보를 활용하는 방법

그러나, 나는 (더 다음에 결과를 처리) prop_testCase1prop_testCase2의 적용 범위에 대한 별도의 결과를 얻을 싶습니다. 한 가지 방법은 테스트 사례를 명령 줄 인수로 명시 적으로 지정하고 각 실행 후에 생성 된 tix 파일을 처리하기 위해 실행 파일을 여러 번 실행하는 것입니다.

그러나 라이브러리에서이 논리를 숨기는 것이 좋습니다. 또한 현실에서는 두 가지 테스트 케이스를 훨씬 뛰어 넘는 실행을 원합니다. 따라서 각 테스트 케이스에 대해 바이너리를 명시 적으로 다시 실행하는 것은 다소 불편한 것 같습니다. 동시에 hpc는 프로그램 실행 중에 중간 데이터 구조의 일종의 커버리지 데이터를 유지한다고 생각합니다.

질문 : 프로그램이 hpc 기호로 컴파일되었으며 hpc가 런타임시 생성하는 데이터에 액세스하는 것을 인식하는 방법이 있습니까?

답변

0

원하는 효과를 얻을 수있는 방법을 찾았습니다. 필요한 기능은 Trace.Hpc.Reflect 모듈에서 제공합니다. 불행히도 설명서가 다소 부족합니다.

import Trace.Hpc.Reflect 

main :: IO() 
main = do 
    print (show $ f 5) 
    tix <- examineTix 
    print (show tix) 
    print (show $ f 6) 
    print (show $ f 7) 
    tix <- examineTix 
    print (show tix) 
    return() 


f x = x*2 

컴파일하고 다음과 같이 실행 :

$ ghc -fhpc Main 
[1 of 1] Compiling Main    (Main.hs, Main.o) 
Linking Main ... 
$ ./Main 
"10" 
"Tix [TixModule \"Main\" 3889152622 31 [1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1]]" 
"12" 
"14" 
"Tix [TixModule \"Main\" 3889152622 31 [3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, in1,1,1,1,0,0,0,0,0,1,1]]" 

그래서이 사용하는 당신은 HPC에 의해 제공되는 커버리지 데이터로 활용할 수

그럼에도 불구하고, 여기에 작동하는 것 같다 최소한의 예입니다 프로그램이 실행되는 동안

실행 파일이 hpc 지원없이 컴파일 된 경우에도 프로그램은 계속 작동하지만 examineTix에서 반환 한 Tix 개체에는 빈 목록이 들어 있습니다.

관련 문제