Pregunta

Comprobación rápida y sus variantes (incluso hay una en Java), parece interesante.Sin embargo, aparte del interés académico, ¿es realmente útil en una prueba de aplicación real (Ej.¿Una aplicación GUI o Cliente/Servidor o incluso tomar el propio StackOverflow)?Se agradece cualquier experiencia que haya tenido con generadores de pruebas similares.

¿Fue útil?

Solución

Sí, también. En realidad no, pero he estudiado bajo el hombre que desarrolló originalmente QuickCheck y él es un tipo muy interesante.

En el año 2004, que se vieron obligados a utilizar QuickCheck para probar nuestros programas Haskell y fue la combinación de buenos y malos. Sobre todo malo porque Haskell fue un poco complicado en sí pero nunca menos maravilloso cuando lo tienes trabajo.

John ha perfeccionado desde entonces que el que escribió años atrás y ayudado realmente a prueba su Ericssion de hardware de telecomunicaciones compleja, y se encontró errores en 20 millones o menos líneas de código reductores que a sólo tres pasos a través de su enfoque. Es un gran altavoz de modo que siempre es una alegría escuchar lo presentan lo que hace tan bien, pero en general, lo que hizo con QuickCheck era nuevo para mí. Así que le pregunté, lo que su interés era en traer esto al mercado. Que estaba abierto a la idea, pero en el momento de su negocio (en torno a QuickCheck) era relativamente nuevo y por lo que hubo otras áreas se centraría en. Esto es ahora 2007. Mi punto es, usted podría aprender de QuickCheck incluso si usted no las usamos.

Pero lo que es QuickCheck? Es un un marco de pruebas combinatoria y una interesante manera de probar los programas. Las personas de más de Microsoft Research ha construido Pex que es una especie de similar. Pex genera pruebas de forma automática mediante el examen de su IL. Sin embargo, John escribiría un generador para posibles propiedades de entrada y de prueba de una función. Una propiedad es algo que puede ser fácilmente probada y es mucho más formal. p.ej. revirtiendo una lista? Bueno, revirtiendo una lista, es lo mismo que dividir una lista en dos mitades, cada una inversión de ellos de forma individual y luego la concatenación de 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 llamado la especificación y el resultado es bastante sorprendente.

Pex es agradable, pero no tan fresco como QuickCheck, Pex simplifica las cosas, QuickCheck hace a pero se necesita mucho esfuerzo para escribir una buena especificación.

El poder de QuickCheck es que cuando se ejecuta en un fracaso que reducirá la entrada que causó el error de la prueba, a la forma más pequeña posible. dejándole con una descripción detallada de lo que la progresión del estado de la causa de su error de la prueba. En comparación con otras infraestructuras de prueba que se acaba de tratar de romper su código de manera fuerza bruta.

Esto es posible debido a la forma de escribir la especificación de la prueba. QuickCheck se basa en la pseudo-aleatoriedad de inventar de entrada y es debido a esto, su capacidad de dar marcha atrás y encontrar muy pequeño de entrada que no pasa la prueba.

Es mucho más trabajo para escribir las propiedades QuickCheck pero el resultado final es mejor prueba. Como dijo el propio Juan, el 70% de los insectos son capturados por la unidad de pruebas, pero es que otro 30% que hace que el programa se bloquee. QuickCheck está probando los últimos 30%.

Otros consejos

He hecho un verdadero problema Haskell que implicó una simulación de eventos discretos. Así que escribí una biblioteca DES basado en la mónada continuación, junto con los equivalentes a MVARs y Canales. Tenía que dejar que esto funcionaba correctamente, así que escribí un montón de propiedades QuickCheck para demostrar que, por ejemplo, dos flujos de datos simultáneos escritos a un canal sería correctamente fusionaron sin perder nada.

También he utilizado QuickCheck para documentar y verificar las propiedades de mi a distancia Sets y decimal bibliotecas.

En mi experiencia QuickCheck es a veces genial. Si se puede resumir una propiedad importante de una manera concisa, aunque el algoritmo que proporciona que la propiedad tiene vello, entonces QuickCheck es una gran victoria. Por otro lado a menudo encuentro que el algoritmo es equivalente a la propiedad que desea verificar. En ese caso, busco propiedades más simples. Por ejemplo, supongamos que la función "foo" se supone que es monótona no estrictamente. A continuación, puede escribir

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)

Yo uso QuickCheck para un montón de cosas personales. En los últimos seis meses:

  • Ran QuickCheck para probar transformaciones de color y coseno discreto transforma en un compresor de imagen.

  • Ran QuickCheck para probar un módulo simbólico-diferenciación Azoté para una optimización numérica.

  • Ran QuickCheck para probar un árbol ternario de búsqueda en el estilo de Bentley y Sedgewick.

QuickCheck rara vez se encuentra con todos mi unidad de pruebas de necesidades, pero es una gran manera de empezar --- y las leyes QuickCheck hacer una buena documentación.

Lo he utilizado mucho, sobre todo en forma lisa y llana, principalmente para pruebas de protocolo y analizador implementaciones.

Sin embargo, aquí es poco menos trivial de mi experiencia personal: http://www.haskell.org/ haskellwiki / QuickCheck_as_a_test_set_generator

ScalaCheck (a QuickCheck para Scala) se utiliza para probar Java funcional , una biblioteca que, entre otras cosas, implementos una QuickCheck para Java .

AFAIK xmonad se prueba extensamente con QuickCheck

Sólo 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 lee Haskell.Sin embargo, utilicé QuickCheck ampliamente y me molestó mucho que algo similar no estuviera disponible en C#.Así que decidí intentarlo y escribirlo yo mismo.También miré Pex, pero encontré que las técnicas de exploración de programas que se utilizan para encontrar entradas mínimas son menos interesantes que la forma en que QuickCheck lo hace.

Yo uso QuickCheck para probar el comportamiento de los programas de línea de comandos escritos en cualquier idioma.

Es especialmente útil para encontrar entradas en la que el nivel bajo o programas de tipos dinámicos accidente.

Para mayor comodidad, escribí http://hackage.haskell.org/package/proctest , que incluye algunos ejemplos de QuickCheck se utiliza junto con hspec y HUnit para probar programas de línea de comandos de esta manera.

fscheck para comprobar que nuestros OCaml a F # traducciones son correctas, y que nuestras versiones optimizadas funcionan de la mismas que las versiones de la ONU-optimizado. También planeo usarlo para probar el analizador léxico y analizador desde el NHol proyecto utiliza un parser combinador.

También tenemos funciones de ayuda que nos permiten ejecutar la prueba dentro NUnit (XUnit para .Net). Ver assertProp .

He utilizado QuickCheck para encoder PDU pruebas de SMS y decodificador en la plataforma Linux móvil LG. Un (antiguo) versión de una pieza de software que he desarrollado en ese momento se encuentra disponible para su descarga en http: / /hackage.haskell.org/package/GenSmsPdu-0.1

No es mi proyecto, pero el paquete containers utiliza QuickCheck bastante extensamente. En lo personal, he intentado usarlo para comparar un poco tonta primer tamiz que escribí a uno en arithmoi, lo que me llevó a descubrir que uno de cada arithmoi veces segfaults.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top