簡體   English   中英

使用Monadic QuickCheck測試IO操作

[英]Testing IO actions with Monadic QuickCheck

誰能給我一個使用Monadic QuickCheck測試IO操作的簡短示例?

通過Test.QuickCheck.Monadic模塊,您可以測試Monadic代碼,甚至可以在IO中運行的代碼。

單項性質測試的類型為PropertyM ma ,其中m是測試運行所在的單項,而a最終將被忽略。 對於PropertyM IO a ,您可以使用monadicIOmonadicIO測試轉換為Property 對於所有其他monad,請改用monadic (它具有運行monad的功能,而IO則沒有此功能)。

在單子測試中,將忽略單子return ed值。 要檢查表達式,請使用assert assert為假值將使測試失敗。 使用run執行要測試的monad中的代碼。

還有其他單調操作可供您使用。 例如, pick將根據Gen a生成新的測試輸入,而pre將檢查測試的前提條件。 如果測試輸入或前提條件本身取決於通過被測試的monad計算的值,則這些方法很有用,在這種情況下,生成輸入或檢查前提條件的常規方法將不起作用。

這是測試一些IO代碼的示例:我們檢查將內容寫入臨時文件后,是否可以讀回相同的數據。 為了演示起見,我們將施加一個前提條件,即至少要向該文件寫入一個字節。 這兩個測試屬性具有相同的作用。 一個不必要地使用了pick and 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

測試Monadic代碼的標准參考是“使用QuickCheck測試Monadic代碼” 它顯示了在諸如IO之類的monad上下文中進行測試的各種方式。

但是您應該真正考慮發布一個更具體的問題,即您要測試的是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM