java - create - Has usado Quickcheck en un proyecto real
setlayout jpanel (11)
AFAIK XMonad se prueba ampliamente con QuickCheck
Quickcheck y sus variantes (incluso hay una en Java ), parece ser interesante. Sin embargo, aparte del interés académico, ¿es realmente útil en una prueba de aplicación real (por ejemplo, una aplicación GUI o Cliente / Servidor o incluso tomar StackOverflow)? Se agradece cualquier experiencia que haya tenido con generadores de prueba similares.
He hecho un verdadero problema de Haskell que involucró una simulación de evento discreto. Así que escribí una biblioteca DES basada en la mónada de continuación, junto con los equivalentes a MVars y canales. Necesitaba comprobar que funcionaba correctamente, así que escribí un montón de propiedades QuickCheck para demostrar que, por ejemplo, dos flujos de datos simultáneos escritos en un canal se fusionarían correctamente sin descartar nada.
También utilicé QuickCheck para documentar y verificar las propiedades en mis conjuntos a distancia y bibliotecas Decimal .
En mi experiencia, QuickCheck a veces es genial. Si puede resumir una propiedad importante de una manera concisa, aunque el algoritmo que entrega esa propiedad es peludo, entonces QuickCheck es una gran victoria. Por otro lado, a menudo encuentro que el algoritmo es equivalente a la propiedad que quiero verificar. En ese caso, busco propiedades más simples. Por ejemplo, supongamos que se supone que la función "foo" no es estrictamente monótona. Entonces puedes escribir
prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)
Lo he usado bastante, principalmente de manera directa, principalmente para probar implementaciones de protocolos y analizadores.
Sin embargo, aquí hay algo menos trivial de mi experiencia personal: http://www.haskell.org/haskellwiki/QuickCheck_as_a_test_set_generator
No es mi proyecto, pero el paquete de containers
usa QuickCheck bastante extensamente. Personalmente, traté de usarlo para comparar un pequeño tamiz primo tonto que le escribí a uno en arithmoi
, lo que me llevó a descubrir que uno en arithmoi
veces segfaults.
Si bien. En realidad no, pero estudié con el hombre que originalmente desarrolló QuickCheck y es un tipo realmente interesante.
En 2004, nos vimos obligados a utilizar QuickCheck para probar nuestros programas Haskell y fue una combinación de buenos y malos. Principalmente malo porque Haskell era un poco desalentador, pero no por eso menos maravilloso cuando lo conseguiste trabajando.
John ha perfeccionado desde entonces lo que escribió años atrás y ayudó a Ericssion a probar su hardware de telecomunicaciones complejo, y encontró errores en 20 millones de líneas de código, reduciendo eso a solo tres pasos en su enfoque. Es un gran orador, por lo que siempre es una alegría escucharlo presentar lo que hace tan bien, pero en general, lo que hizo con QuickCheck era nuevo para mí. Entonces le pregunté cuál era su interés en llevar esto al mercado. Estaba abierto a la idea, pero en ese momento su negocio (basado en QuickCheck) era relativamente nuevo, por lo que había otras áreas en las que se centraría. Esto es ahora 2007. Mi punto es que podrías aprender de QuickCheck aunque no termines usándolo.
Pero, ¿qué es QuickCheck? Es un marco de prueba combinatoria y una forma interesante de probar programas. La gente de Microsoft Research ha creado Pex que es similar. Pex genera pruebas automáticamente al examinar tu IL. Sin embargo, John escribiría un generador para las posibles propiedades de entrada y prueba de una función. Una propiedad es algo que se puede probar fácilmente y es mucho más formal. por ejemplo, revertir una lista? Bueno, invertir una lista es lo mismo que dividir una lista en dos mitades, revirtiéndolas individualmente y luego concatenar las dos mitades invertidas en orden inverso.
1,2,3,4 // original
1,2 3,4 // split into A and B
2,1 4,3 // reverse A and B
4,3,2,1 // concat B and A
Esta es una gran propiedad para probar con QuickCheck llamada especificación y el resultado es bastante sorprendente.
Pex es agradable, pero no tan genial como QuickCheck, Pex simplifica las cosas, QuickCheck lo hace, pero requiere un gran esfuerzo escribir una buena especificación.
El poder de QuickCheck es que cuando se encuentre con una falla, reducirá la entrada que causó la falla de la prueba, en la forma más pequeña posible. Le dejo una descripción detallada de la progresión del estado que provocó la falla de la prueba. En comparación con otros marcos de prueba que simplemente tratarán de romper su código de una manera de fuerza bruta.
Esto es posible debido a la forma en que escribe su especificación de prueba. QuickCheck se basa en la pseudoaleatoriedad para inventar entradas y, debido a esto, es capaz de retroceder y encontrar entradas realmente pequeñas que no pasan la prueba.
Es mucho más trabajo escribir propiedades QuickCheck, pero el resultado final es una mejor prueba. Como dijo el propio John, el 70% de los errores se detectan mediante pruebas unitarias, pero es ese otro 30% lo que hace que su programa falle. QuickCheck está probando esos últimos 30%.
Solo he usado Haskell en un entorno de producción para el desarrollo de pequeñas herramientas auxiliares. Principalmente porque soy el único desarrollador que conozco que dice Haskell. Sin embargo, utilicé QuickCheck extensivamente, y realmente me molestó que algo similar no esté disponible en C #. Así que decidí intentar y escribir yo mismo . Miré a Pex también, pero descubrí que las técnicas de exploración del programa que se usan para encontrar una entrada mínima son menos interesantes que la forma en que lo hace QuickCheck.
Usamos FsCheck para verificar que nuestras traducciones de OCaml a F # son correctas, y que nuestras versiones optimizadas funcionan igual que las versiones no optimizadas. También planeo usarlo para probar el analizador y analizador ya que el proyecto NHol usa un combinador parser .
También tenemos funciones de ayuda que nos permiten ejecutar la prueba dentro de NUnit (XUnit para .Net). Ver assertProp .
Uso QuickCheck para muchas cosas personales. En los últimos seis meses:
Ran QuickCheck para probar transformaciones de color y transformaciones discretas de coseno en un compresor de imagen.
Ran QuickCheck para probar un módulo de diferenciación simbólica que impulsé para una optimización numérica.
Ran QuickCheck para probar un árbol de búsqueda ternaria al estilo de Bentley y Sedgewick.
QuickCheck rara vez cumple con todas mis necesidades de pruebas de unidades, pero es una excelente manera de comenzar, y las leyes QuickCheck constituyen una buena documentación.
Uso QuickCheck para probar el comportamiento de los programas de línea de comandos escritos en cualquier idioma.
Es especialmente útil encontrar entradas en las que fallan programas de bajo nivel o de tipo dinámico.
Para mayor comodidad, escribí http://hackage.haskell.org/package/proctest , que incluye algunos ejemplos de QuickCheck que se usa junto con hspec y HUnit para probar los programas de línea de comandos de esta manera.
Utilicé QuickCheck para probar el codificador y decodificador SMS PDU en la plataforma LG Linux Mobile. Una versión (antigua) de una pieza de software que desarrollé en ese momento está disponible para su descarga en http://hackage.haskell.org/package/GenSmsPdu-0.1
ScalaCheck (un QuickCheck para Scala) se utiliza para probar Functional Java , una biblioteca que, entre otras cosas, implementa un QuickCheck para Java .