¿Cómo se han generado automáticamente las pruebas unitarias de guayaba?

31

La guayaba tiene casos de prueba unitarios generados automáticamente :

La guayaba tiene un número asombroso de pruebas unitarias: a partir de julio de 2012, el paquete de pruebas de guayaba incluye más de 286,000 casos de prueba individuales. La mayoría de estos se generan automáticamente , no están escritos a mano, pero la cobertura de prueba de Guava es extremadamente exhaustiva, especialmente para com.google.common.collect.

¿Cómo se generaron? ¿Qué técnicas y tecnologías se utilizaron para diseñarlas y generarlas?

dzieciou
fuente
Recuerdo haber visto una charla de un amigo de Google que tocó este tema. Sin embargo, no tengo idea del nombre, creo que se habló en una convención de Java
Zavior, el
3
El paquete com.google.common.collect.testing tiene muchas clases con "Generador" en sus nombres, lo que hace que parezca un marco para la generación de pruebas. También hay subpaquetes con clases documentadas como "esqueletos" o "clases base" para pruebas ...
mosquito
1
@gnat Sí, estaba seguro de haberlo visto en alguna parte. com.google.common.collect.testing.features, por ejemplo, muestra tfeatures / restricciones que una clase de colección debe satisfacer, y un caso de prueba es una combinación de ellas. De esta manera pueden parametrizar las pruebas
dzieciou
Es posible que tenga más suerte en Software Quality Assurance and Testing.SX
Reinstate Monica - M. Schröder el
La pregunta recibió mucha atención de la comunidad, pero hasta el momento no hubo una respuesta razonable, así que seguí la sugerencia de Martin y la puse aquí: sqa.stackexchange.com/questions/5214/… .
dzieciou

Respuestas:

8

Una gran parte de esta masa de pruebas es para las implementaciones de la colección Guava. Han escrito pruebas genéricas que prueban exhaustivamente las interfaces de recopilación, y esto genera un conjunto por implementación. Véase, por ejemplo, clases llamadas CollectionAddAllTester, ListIndexOfTester.

Todo esto está respaldado por una biblioteca llamada testlib, que se envía como parte de Guava. Esto es bastante genérico. Admite escribir pruebas genéricas para cualquier interfaz (no solo colecciones). Puede especificar Features de posibles implementaciones y probarlas (por ejemplo, si su conjunto no se puede modificar, espera un resultado diferente set.add()), y cuando ejecuta las pruebas, especifica qué características admite su implementación.

Se basa en JUnit 3, no en 4. Normalmente, tiene una clase que se extiende TestCasellena de métodos nombrados testSomething(), y JUnit los ejecuta reflexivamente. La biblioteca testlib se conecta a la ejecución de estas pruebas para que el ciclo de vida se vea así:

  • Para cada implementación que desee probar
  • Para cada método de prueba (aplicable)
  • Crea la TestCaseinstancia
  • Inicialice TestSubjectGenerator: esta es la interfaz testlib que extiende donde realmente crea el sujeto de prueba
  • Ejecute reflexivamente el método de prueba. Durante este método, getSubjectGenerator()da acceso al sujeto de prueba

El bit clave es el paso de inicialización adicional que les permite inyectar un sujeto de prueba específico en el caso de prueba genérico.

Yo escribí un post sobre cómo escribir TestLib suites de generación de sus propias interfaces.

(También publicado en la misma pregunta en el sitio sqa ).

Joe Kearney
fuente
6

Hay generadores de prueba unitaria. Por ejemplo, en el mundo .NET, algo como Microsoft Pex podría hacer esto.

Por ejemplo, Microsoft Pex intenta, basándose en el análisis de código, todos los valores posibles como argumentos para un método. Se espera que algunos argumentos permitan que el método arroje una excepción. Tales cosas pueden crear automáticamente pruebas para. Los valores estáticos como una cadena vacía que se devuelve en ciertos casos también se pueden probar automáticamente.

Sebazzz
fuente
2
Esa es una prueba aleatoria útil solo para pruebas de ruta negativa (excepciones, entrada no válida, bloqueos, tiempo de espera). Creo que también generaron pruebas para el camino feliz, y esto requiere más diseño, no solo el lanzamiento de una herramienta de análisis estático.
dzieciou
Y sé que hay formas y herramientas para generar una prueba para el camino feliz (por ejemplo, ver esta respuesta ), pero estoy interesado en cómo se hizo esto en el caso particular de la guayaba
dzieciou