2010-02-14 4 views
48

누구나 Monadic QuickCheck를 사용하여 IO 작업을 테스트하는 간단한 예를 제공 할 수 있습니까?Monadic QuickCheck로 IO 작업 테스트

+2

테스트하려는 것을 제공하면 더 나은 질문을하게됩니다. – Egon

답변

55

Test.QuickCheck.Monadic 모듈을 사용하면 모나 딕 코드 (IO에서 실행되는 코드 포함)를 테스트 할 수 있습니다.

모나드 특성 시험

m이 테스트에서 실행 a 궁극적으로 무시됩니다 모나드이다 유형 PropertyM m a,이다. PropertyM IO a의 경우 monadicIO을 사용하여 모나드 테스트를 Property으로 변환합니다. 다른 모든 모나드의 경우 monadic 대신에 (에는없는 모나드를 실행하는 함수가 필요합니다).

모나드 테스트에서 모나드에서 편집 된 값 return은 무시됩니다. 표현식을 확인하려면 assert을 사용하십시오. false 값을 지정하면 테스트가 실패합니다. 테스트중인 모나드에서 코드를 실행하려면 run을 사용하십시오.

다른 모나 딕 액션이 있습니다. 예를 들어, pickGen a에서 새 테스트 입력을 생성하고 pre은 테스트 전제 조건을 검사합니다. 테스트 입력 또는 전제 조건 자체가 테스트중인 모나드를 통해 계산 된 값에 의존하는 경우 유용합니다.이 경우 입력을 생성하거나 선행 조건을 검사하는 정상적인 방법이 작동하지 않습니다.

다음은 일부 IO 코드를 테스트하는 예입니다. 임시 파일에 무언가를 작성한 후 동일한 데이터를 다시 읽을 수 있는지 확인합니다. 데모 목적을 위해 파일에 적어도 하나의 바이트를 쓰는 전제 조건을 부과 할 것입니다. 두 가지 테스트 속성은 동일한 작업을 수행합니다. 하나는 pickpre을 불필요하게 사용하지만 다른 하나는 사용하지 않습니다.

import System.Directory (removeFile) 
import System.IO (hGetContents, hPutStr, hSeek, openBinaryTempFile, SeekMode (..)) 
import Test.QuickCheck (arbitrary, Property, quickCheck, (==>)) 
import Test.QuickCheck.Monadic (assert, monadicIO, pick, pre, run) 

-- Demonstrating pick and pre as well: 
prop_writeThenRead :: Property 
prop_writeThenRead = monadicIO $ do writtenData <- pick arbitrary 
            pre $ not (null writtenData) 
            readData <- run $ writeThenRead writtenData 
            assert $ writtenData == readData 

-- A more idiomatic way to write the above: 
prop_writeThenRead2 :: [Char] -> Property 
prop_writeThenRead2 writtenData = not (null writtenData) ==> monadicIO test 
    where test = do readData <- run $ writeThenRead writtenData 
        assert $ writtenData == readData 

writeThenRead :: [Char] -> IO [Char] 
writeThenRead output = do (path, h) <- openBinaryTempFile "/tmp" "quickcheck.tmp" 
          removeFile path 
          hPutStr h output 
          hSeek h AbsoluteSeek 0 
          hGetContents h 

main :: IO() 
main = do quickCheck prop_writeThenRead 
      quickCheck prop_writeThenRead2 
7

모나 딕 코드를 테스트하는 표준 참조는 "Testing Monadic Code with QuickCheck"입니다. IO와 같은 모나드 환경에서 다양한 테스트 방법을 보여줍니다.

하지만 실제로 테스트하고 싶은 내용에 대해보다 구체적인 질문을 게시하는 것이 좋습니다.

+0

링크가 끊어졌습니다. –

+0

Koen은 분명히 그의 홈페이지를 재구성하고 있습니다. 대신 다음 URL을 사용해보십시오. [www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps](http://www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps) – svenningsson