52

Monadic QuickCheckを使用してIOアクションをテストする簡単な例を教えてもらえますか?

4

2 に答える 2

61

Test.QuickCheck.Monadicモジュールを使用すると、で実行されるものも含めて、モナディックコードをテストできますIO

モナドプロパティテストのタイプはですPropertyM m a。ここmで、はテストが実行されるモナドであり、a最終的には無視されます。の場合、;を使用しPropertyM IO aてモナディックテストをaに変換します。他のすべてのモナドについては、代わりに使用します(モナドを実行する関数を取りますが、何かがありません)。PropertymonadicIOmonadicIO

モナドテストではreturn、モナドから出力された値は無視されます。式を確認するには、assert;を使用します。assert偽の値を指定すると、テストに失敗します。runテスト対象のモナドでコードを実行するために使用します。

あなたの処分で他のmonadicアクションがあります。たとえば、pickはから新しいテスト入力を生成しGen apreテストの前提条件をチェックします。これらは、テスト入力または前提条件自体が、テスト対象のモナドを介して計算された値に依存している場合に役立ちます。この場合、入力を生成したり、事前条件をチェックしたりする通常の方法は機能しません。

いくつかのIOコードをテストする例を次に示します。一時ファイルに何かを書き込んだ後、同じデータを読み戻すことができることを確認します。デモンストレーションの目的で、ファイルに少なくとも1バイトを書き込むという前提条件を課します。2つのテストプロパティは同じことを行います。一方は使用pickpre、もう一方は使用しません。

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
于 2010-05-31T23:45:34.147 に答える
7

モナディックコードをテストするための標準リファレンスは、「QuickCheckを使用したモナディックコードのテスト」です。IOなどのモナドのコンテキストでテストするさまざまな方法を示しています。

ただし、テストしたい内容について、より具体的な質問を投稿することを検討する必要があります。

于 2010-02-15T01:59:16.927 に答える