2010-02-14 14 views

Odpowiedz

55

Moduł Test.QuickCheck.Monadic pozwala przetestować monadyczny kod, nawet rzeczy, które działają w IO.

Monadyczny test właściwości jest typu PropertyM m a, gdzie m jest monadą, w której test jest wykonywany, a a jest ostatecznie ignorowany. W przypadku PropertyM IO a zamieniasz monadyczny test na Property, używając monadicIO; dla wszystkich innych monad, zamiast tego używasz monadic (która ma funkcję uruchomienia monady, coś nie ma).

W monadycznym teście, wartość return wydana z monady jest ignorowana. Aby sprawdzić wyrażenie, użyj assert; assert Niewłaściwa wartość nie powiedzie się. Użyj run, aby wykonać kod w testowanej monadzie.

Do Twojej dyspozycji są inne monadyczne akcje. Na przykład pick wygeneruje nowe wejścia testowe z Gen a, a pre sprawdzi warunki testowe. Są one użyteczne, jeśli same wejścia testowe lub warunki wstępne zależą od wartości wyliczonych przez testowaną monadę, w którym to przypadku normalny sposób generowania danych wejściowych lub sprawdzania prekursorów nie zadziała.

Oto przykład przetestowania kodu IO: sprawdzamy, czy po zapisaniu czegoś w pliku tymczasowym możemy odczytać te same dane. Dla celów demonstracyjnych narzucimy warunek, że zapisujemy co najmniej jeden bajt do pliku. Dwie właściwości testowe robią to samo; jeden używa niepotrzebnie pick i pre, podczas gdy drugi 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 
7

Standardowym punktem odniesienia dla testowania kodu monadycznego jest "Testing Monadic Code with QuickCheck". Pokazuje różne sposoby testowania w kontekście monady, takiej jak IO.

Ale naprawdę powinieneś rozważyć umieszczenie bardziej konkretnego pytania na temat tego, co chciałbyś przetestować.

+0

Link jest obecnie niedostępny. –

+0

Koen najwyraźniej reorganizuje swoją stronę główną. Zamiast tego spróbuj wpisać następujący adres URL: [www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps](http://www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps) – svenningsson

Powiązane problemy