Testing IO Aktionen mit Monadic Quick Check
-
20-09-2019 - |
Frage
Kann jemand geben Sie mir ein kurzes Beispiel für die Prüfung IO Aktionen mit Monadic Quick Check?
Lösung
Die Test.QuickCheck .Monadic Modul können Sie monadischen Code zu testen, auch Dinge, die laufen in IO
.
Ein monadische Eigenschaft Test ist vom Typ PropertyM m a
, wo m
die Monade ist die Testläufe in und a
letztlich ignoriert. Im Fall von PropertyM IO a
, konvertieren Sie den monadischen Test zu einem Property
von monadicIO
verwendet wird; für alle anderen Monaden, Sie monadic
verwenden stattdessen (die eine Funktion nimmt die Monade, etwas IO
nicht laufen müssen).
In einem monadischen Test return
ed der Wert aus der Monade ignoriert. Um einen Ausdruck zu überprüfen, verwenden assert
; einen falschen Wert assert
ing wird den Test nicht bestehen. Verwenden run
den Code in den Monade getesteten auszuführen.
Es gibt noch andere monadischen Aktionen zur Verfügung. Zum Beispiel wird pick
neue Testeingänge erzeugen aus einem Gen a
und pre
werden Test Voraussetzungen prüfen. Diese sind nützlich, wenn die Testeingänge oder Voraussetzungen, sich auf Werte hängen über die Monade berechnet getestet, wobei in diesem Fall die normale Art und Weise Eingänge zur Erzeugung oder precontions Überprüfung wird nicht funktionieren.
Hier ist ein Beispiel für die Prüfung einige IO
Code: wir prüfen, ob nach etwas in eine temporäre Datei zu schreiben, wir, dass die gleichen Daten wieder lesen kann. Zu Demonstrationszwecken werden wir die Voraussetzung vor, dass wir mindestens ein Byte in die Datei schreiben. Die beiden Testeigenschaften das gleiche tun; verwendet man pick
und pre
unnötig, während der andere nicht.
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
Andere Tipps
Das Standardwerk für monadischen Code testen, "Testing Monadic Code mit Quick Check „. Es zeigt verschiedene Möglichkeiten der Prüfung im Rahmen einer Monade wie IO.
Aber Sie sollten wirklich eine konkretere Frage prüfen, veröffentlichen, was es ist, dass Sie zu Test möchten.