首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用一元QuickCheck测试IO操作

使用一元QuickCheck测试IO操作
EN

Stack Overflow用户
提问于 2010-02-14 10:27:15
回答 2查看 6.3K关注 0票数 52

有没有人能给我举个简单的例子,用一元QuickCheck来测试IO操作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-01 07:45:34

Test.QuickCheck.Monadic模块允许您测试一元代码,甚至可以测试在IO中运行的代码。

一元属性测试的类型为PropertyM m a,其中m是运行测试的monad,a最终被忽略。对于PropertyM IO a,您可以使用monadicIO将一元测试转换为Property;对于所有其他monad,您可以使用monadic (它需要一个函数来运行monad,这是IO所没有的)。

在一元测试中,会忽略单数的returned值。要检查表达式,请使用assert;如果assert的值为false,则测试将失败。使用run在被测试的monad中执行代码。

您还可以使用其他单行操作。例如,pick将从Gen a生成新的测试输入,而pre将检查测试前提条件。如果测试输入或前置条件本身依赖于通过被测试的monad计算的值,那么这些方法就很有用,在这种情况下,生成输入或检查前置条件的正常方法将不起作用。

下面是测试一些IO代码的示例:我们检查在将某些内容写入临时文件后,是否可以读回相同的数据。出于演示目的,我们将强加一个前提条件,即至少向文件中写入一个字节。这两个测试属性做同样的事情;一个不必要地使用pickpre,而另一个则不使用。

代码语言:javascript
复制
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
票数 60
EN

Stack Overflow用户

发布于 2010-02-15 09:59:17

测试一元代码的标准参考是"Testing Monadic Code with QuickCheck"。它展示了在monad上下文中进行测试的各种方法,比如IO。

但你真的应该考虑发布一个更具体的问题,关于你想要测试的是什么。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2259926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档