¿Alguien me puede dar un breve ejemplo de prueba de acciones de IO con Monadic QuickCheck?Prueba de acciones de E/S con Monadic QuickCheck
Respuesta
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
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.
El enlace está caído hoy en día. –
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
- 1. Prueba de analizadores Parsec generando entradas con QuickCheck
- 2. Monadic tipo confusión
- 3. Controlar cómo se generan los datos de prueba en QuickCheck
- 4. ¿Cómo se muestra un motivo de una propiedad de prueba fallida con quickcheck?
- 5. verboseCheck en QuickCheck 2?
- 6. ¿Usa las pruebas quickCheck con Cabal?
- 7. Configuración de acciones para varias carpetas de prueba en SBT
- 8. ¿Cómo puedo probar una función de orden superior con QuickCheck?
- 9. ¿Existe una versión monádica de Arbitrary para usar con QuickCheck?
- 10. rieles RSpec enrutamiento: Prueba de acciones en: excepto que no
- 11. Cómo utilizar modificadores con QUICKCHECK (positiva en mi caso)
- 12. Haskell: ¿Cómo probar un FSM (reactivo) con quickcheck?
- 13. ¿Qué hay de nuevo en QuickCheck 2?
- 14. ASP .Net MVC 3: Acciones del controlador de prueba unitaria
- 15. ¿Cómo obtengo buenas (pequeñas) contracciones de QuickCheck?
- 16. Estado de salida QuickCheck en fallas, y integración cabal
- 17. Enumeración de acciones de red con C#
- 18. Controladores de prueba con Minitest
- 19. ¿Cómo lidiar con acciones monstruosas de Struts?
- 20. Aprendizaje de refuerzo con acciones variables
- 21. ¿Es posible inyectar simulaciones con fines de prueba con AndroidAnnotations?
- 22. acciones no CRUD con brasa de datos
- 23. con mvc.net es posible compartir una visión entre múltiples acciones
- 24. Compatibilidad con la barra de acciones
- 25. Cómo utilizar 'oneof' en quickCheck (Haskell)
- 26. Combinar Estado con acciones IO
- 27. ¿Está probando propiedades QuickCheck contra varios tipos?
- 28. La prueba de integración de muelles es lenta con autoenvío
- 29. Generación de listas de una longitud específica con QuickCheck de Haskell
- 30. Funciones de presentación utilizadas en las propiedades QuickCheck
Dando un ejemplo de lo que le gustaría probar, haría la pregunta mejor. – Egon