2010-02-14 10 views

Respuesta

55

El módulo Test.QuickCheck.Monadic le permite probar el código monádico, incluso las cosas que se ejecutan en IO.

Una prueba monádica propiedad es de tipo PropertyM m a, donde m es la mónada la prueba se ejecuta en a y en última instancia, se ignora. En el caso de PropertyM IO a, convierta la prueba monádica a Property utilizando monadicIO; para todas las otras mónadas, usa monadic (que toma una función para ejecutar la mónada, algo que IO no tiene).

En una prueba monádica, se ignora el valor return ed de la mónada. Para verificar una expresión, use assert; assert si un valor falso fallará la prueba. Use run para ejecutar el código en la mónada que se está probando.

Existen otras acciones monádicas a su disposición. Por ejemplo, pick generará nuevas entradas de prueba a partir de un Gen a, y pre comprobará las condiciones previas de la prueba. Estos son útiles si las entradas de prueba o las condiciones previas dependen de los valores calculados a través de la mónada que se está probando, en cuyo caso la forma normal de generar entradas o verificar las precondiciones no funcionará.

Aquí hay un ejemplo de prueba de algún código IO: comprobamos que después de escribir algo en un archivo temporal, podemos leer la misma información de nuevo. Para fines de demostración, impondremos la condición previa de que escribamos al menos un byte en el archivo. Las dos propiedades de prueba hacen lo mismo; uno usa pick y pre innecesariamente mientras que el otro no.

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

La referencia estándar para probar el código monádico es "Testing Monadic Code with QuickCheck". Muestra varias formas de prueba en el contexto de una mónada, como IO.

Pero realmente deberías considerar publicar una pregunta más concreta sobre qué es lo que te gustaría probar.

+0

El enlace está caído hoy en día. –

+0

Koen aparentemente está reorganizando su página de inicio. Pruebe la siguiente URL en su lugar: [www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps](http://www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps) – svenningsson

Cuestiones relacionadas