Quelqu'un peut-il me donner un bref exemple de test OI actions à l'aide de Monadique QuickCheck?
Réponses
Trop de publicités?Le Test De.QuickCheck.Monadique module vous permet de tester monadique du code, même les choses que l'exécution en IO
.
Un monadique de test de propriété est de type PropertyM m a
où m
est la monade, le test s'exécute en et a
est finalement ignoré. Dans le cas d' PropertyM IO a
,- vous convertir le monadique de test à un Property
par l'aide d' monadicIO
; pour toutes les autres monades, vous utilisez monadic
à la place (qui prend une fonction à exécuter la monade, quelque chose d' IO
n'a pas).
Dans un monadique de test, la valeur return
ed de la monade est ignoré. Pour vérifier une expression, utilisez assert
; assert
ing une valeur false va échouer le test. Utiliser run
pour exécuter le code dans la monade d'être testé.
Il y a d'autres monadique actions à votre disposition. Par exemple, pick
permettra de générer de nouveaux test des entrées d'un Gen a
, et pre
sera test de vérification des conditions préalables. Ils sont utiles si le test des entrées ou des conditions dépendent elles-mêmes des valeurs calculées par la monade testé, auquel cas la façon normale de produire des intrants ou la vérification de l'precontions ne fonctionne pas.
Voici un exemple de l'essai de quelques IO
code: nous avons vérifier que, après avoir écrit quelque chose dans un fichier temporaire, nous pouvons lire que même des données en retour. Pour les besoins de la démonstration, nous allons imposer la condition préalable que nous écrivons au moins un octet dans le fichier. Le test de deux propriétés font la même chose; on utilise pick
et pre
inutilement, tandis que l'autre ne l'est pas.
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
La norme de référence pour le test monadique de code est "Test Monadique Code avec QuickCheck". Il montre les différentes façons de les tester dans le cadre d'une monade comme IO.
Mais vous devriez vraiment envisager de poster une question plus concrète sur ce que c'est que vous souhaitez tester.