Prueba de analizadores Parsec generando entradas con QuickCheck
Frecuentes
Visto 1,696 veces
9
Me gustaría escribir pruebas para un conjunto de analizadores Parsec. Aquí hay un ejemplo simple de un analizador que quiero probar con QuickCheck:
identifier = do
c <- letter
cs <- many (alphaNum <|> oneOf identSymbols)
skipSpaces
return $ Ident $ c:cs
Entonces, idealmente, me gustaría que QuickCheck genere identificadores válidos y me asegure de obtener los resultados correctos, además de generar identificadores no válidos y asegurarme de que regresen ParseError
. ¿Hay alguna utilidad que facilite este tipo de cosas? ¿Hay alguna forma en que pueda "ejecutar mi analizador a la inversa", por así decirlo, para generar tales entradas?
En general, ¿cómo sería un buen conjunto de pruebas QuickCheck para este analizador? Hasta cierto punto, parece que básicamente tendría que duplicar la lógica del analizador en QuickCheck para lograr una prueba exhaustiva. ¿Es realmente una buena idea, o quizás esta sea una situación en la que una herramienta más tradicional como HUnit es más adecuada que QuickCheck?
1 Respuestas
13
En general, el reverso de un analizador es una bonita impresora, y el reverso de una entrada aleatoria a un analizador, es una bonita impresión aleatoria de un AST.
Entonces, sigue el enfoque habitual y defina una instancia arbitraria para su AST, que impulsa fragmentos de sintaxis aleatorios bien formados. Mezcle algunos caracteres erróneos como un envoltorio para probar el manejo de errores.
Ver también:
- Pruebas automatizadas de analizadores de gramática Java ABNF con QuickCheck
- Pruebas automáticas de funciones de orden superior - Pruebas de analizador en Clean with QC.
Respondido el 12 de junio de 12 a las 17:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas testing haskell parsec quickcheck or haz tu propia pregunta.
Una propiedad particular que me gusta usar es que parse = parse . bonito . analizar gramaticalmente. Esto sirve como una forma decente de modelar el cociente de la información por parte del analizador, hay un buen complemento para conducirlo desde una perspectiva teórica, y captura el hecho de que bastante. parse es idempotente, si no la función de identidad. (Por lo general, el análisis descarta algo de información) - edward kmett
los ultimos dos enlaces estan caidos - alex hirzel
@AlexHirzel ¡Arreglado! (aprobación pendiente) - EmmanuelMess