문제

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

도움이 되었습니까?

해결책

그만큼 test.quickcheck.monadic 모듈은 모나디 코드, 심지어 실행되는 것까지 테스트 할 수 있습니다. IO.

모나디 한 속성 테스트는 유형입니다 PropertyM m a, 어디 m 테스트가 실행되는 모나드입니다 a 궁극적으로 무시됩니다. 의 경우 PropertyM IO a, 당신은 모나 딕 테스트를 a로 변환합니다 Property 사용하여 monadicIO; 다른 모든 모나드의 경우 사용합니다 monadic 대신 (모나드를 실행하기 위해 기능이 필요합니다. IO 가지고 있지 않음).

모나 딕 테스트에서는 가치가 있습니다 return모나드에서 에드는 무시됩니다. 표현을 확인하려면 사용하십시오 assert; assert잘못된 값을 사용하면 테스트가 실패합니다. 사용 run 테스트중인 모나드에서 코드를 실행합니다.

당신의 처분에는 다른 모나디 한 행동이 있습니다. 예를 들어, pick 새로운 테스트 입력을 생성합니다 Gen a, 그리고 pre 테스트 전제 조건을 확인합니다. 테스트 입력 또는 전제 조건 자체가 테스트중인 모나드를 통해 계산 된 값에 의존하는 경우 유용합니다.이 경우 입력을 생성하거나 선입견을 확인하는 일반적인 방법은 작동하지 않습니다.

다음은 일부 테스트의 예입니다 IO 코드 : 임시 파일에 무언가를 작성한 후 동일한 데이터를 다시 읽을 수 있는지 확인합니다. 데모 목적으로, 우리는 파일에 적어도 하나의 바이트를 작성하는 전제 조건을 부과 할 것입니다. 두 테스트 속성은 같은 일을합니다. 하나의 용도 pick 그리고 pre 불필요하게 다른 사람은 그렇지 않습니다.

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

다른 팁

모나디 코드 테스트에 대한 표준 참조는 다음과 같습니다 "QuickCheck로 모나디 코드 테스트". 그것은 IO와 같은 모나드의 맥락에서 다양한 테스트 방법을 보여줍니다.

그러나 테스트하고 싶은 것이 무엇인지에 대한보다 구체적인 질문을 게시하는 것을 고려해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top