Testowanie działań IO za pomocą monadic QuickCheck

Czy ktoś może mi podać krótki przykład testowania działań IO przy użyciu monadic QuickCheck?

Author: maxschlepzig, 2010-02-14

2 answers

Test .Szybkie czekanie.Moduł Monadic umożliwia testowanie kodu monadic, nawet tych, które działają w IO.

Test właściwości monadycznych jest typu PropertyM m a, Gdzie m jest monadą, w której test jest uruchamiany, A a jest ostatecznie ignorowany. W przypadku PropertyM IO a, konwertujesz test monadyczny na Property za pomocą monadicIO; dla wszystkich innych monad używasz zamiast tego monadic (co wymaga funkcji do uruchomienia monad, coś IO nie ma).

W teście monadycznym wartość returned z monada jest ignorowana. Aby sprawdzić wyrażenie, użyj assert; assertW przypadku fałszywej wartości test nie przejdzie. Użyj run, aby wykonać kod w testowanej monadzie.

Są inne monadyczne działania do twojej dyspozycji. Na przykład, pick wygeneruje nowe wejścia testowe z Gen a, a pre sprawdzi warunki wstępne testu. Są one użyteczne, jeśli same wejścia testowe lub warunki wstępne zależą od wartości obliczanych za pomocą testowanego monad, w którym to przypadku normalny sposób generowania wejścia lub warunki wstępne sprawdzania nie będą działać.

Oto przykład testowania kodu IO: sprawdzamy, czy po zapisaniu czegoś do pliku tymczasowego możemy odczytać te same dane z powrotem. Dla celów demonstracyjnych wprowadzimy warunek wstępny, aby zapisać co najmniej jeden bajt do pliku. Dwie właściwości testowe robią to samo; jedna używa pick i pre niepotrzebnie, podczas gdy druga nie.

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
 59
Author: Paul Kuliniewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-31 23:45:34

Standardowym odniesieniem do testowania kodu monadycznego jest "testowanie kodu Monadycznego za pomocą QuickCheck" . Pokazuje różne sposoby testowania w kontekście monady, takiej jak IO.

Ale naprawdę powinieneś rozważyć zamieszczenie bardziej konkretnego pytania o to, co chciałbyś przetestować.

 7
Author: svenningsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 12:21:23