Bil*_*ill 49 io haskell quickcheck
有人能给我一个使用Monadic QuickCheck测试IO操作的简单示例吗?
Pau*_*icz 57
该Test.QuickCheck.Monadic模块,您可以测试一元代码,即使在运行的东西IO
.
monadic属性测试是类型的PropertyM m a
,m
测试运行的monad在哪里,a
最终被忽略.在的情况下PropertyM IO a
,你的单子测试转换为Property
用monadicIO
; 对于所有其他monad,你使用monadic
(它使用一个函数来运行monad,有些东西IO
没有).
在monadic测试中,return
monad 的值被忽略.要检查表达式,请使用assert
; assert
假值将导致测试失败.使用run
以执行该单子的代码进行测试.
您可以使用其他monadic行动.例如,pick
将从a生成新的测试输入Gen a
,pre
并将检查测试前提条件.如果测试输入或前置条件本身依赖于通过被测试的monad计算的值,则这些非常有用,在这种情况下,生成输入或检查预置的常规方法将不起作用.
这是测试一些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
Run Code Online (Sandbox Code Playgroud)
测试monadic代码的标准参考是"使用QuickCheck测试Monadic代码".它显示了在monad(例如IO)的上下文中的各种测试方法.
但是你应该考虑发布一个更具体的问题,即你要测试的是什么.
归档时间: |
|
查看次数: |
5613 次 |
最近记录: |