Monadic Quickcheck로 IO 동작 테스트
-
20-09-2019 - |
문제
누구든지 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와 같은 모나드의 맥락에서 다양한 테스트 방법을 보여줍니다.
그러나 테스트하고 싶은 것이 무엇인지에 대한보다 구체적인 질문을 게시하는 것을 고려해야합니다.