2009-04-16 12 views
6

Uno de los problemas encontrados con mutation testing es que es lento, porque de manera predeterminada realiza una prueba completa (ya sea un archivo de prueba o un conjunto de archivos de prueba) para cada mutación generada.Haciendo que las pruebas unitarias fallen rápidamente para la prueba de mutación

Una forma de hacer que las pruebas de mutaciones sean más rápidas sería detener la ejecución de la prueba para un mutante dado una vez que se ha encontrado una sola falla (pero solo durante la prueba de la mutación). Aún mejor sería que el probador de la mutación recordara cuál fue la primera prueba para matar al último mutante y darlo primero al siguiente mutante. ¿Hay algo en Ruby que haga cualquiera de estas cosas, o es mi mejor opción para comenzar a parchear los monos?

(Sí, ya sé pruebas de unidad debe ser rápido. Y mostrando todas las pruebas fallidas está fuera útil de pruebas de mutación, ya que ayuda a que no se limitan a señalar que algo está mal, pero claramente donde va mal)

Editar: Actualmente estoy usando heckle con prueba/unidad. Si no es posible que la prueba/unidad recuerde qué pruebas fallan entre los rodajes, tal vez un heckle o algo que se ejecute podría recordarlo.

+0

y ejecuta estas pruebas ¿cómo ...? –

Respuesta

2

Lo mejor es consultar el heckle source de github, aplicar un parche y enviar el parche a los desarrolladores. Debería poder escribir un corredor de prueba personalizado para heckle.

Los parches de mono nunca son la respuesta para algo como esto. De hecho, el parche de mono casi nunca es la respuesta para nada.

1

Un enfoque que he comenzado a utilizar fue escribir pruebas unitarias para cada método, y ponerlos en archivos separados, organizados como rubyspecs. Ejecuto cada especificación de forma aislada, especificando el método exacto que deseo interrumpir. Tengo una tarea de rake que maneja todo esto e imprime un informe al final con mutaciones fallidas, en su caso.

Al final recibo cobertura completa de heckle de cada método, sin esperar los resultados para siempre. Además, es incluso mejor que el enfoque normal que todos usan, porque no obtengo ninguna cobertura incidental: las especificaciones de cada método deben cubrir todas las mutaciones de ese método.

1

Mi herramienta mutant utiliza la opción rspec2 --fail-fast para detener inmediatamente una vez que se encuentra un ejemplo de error. Junto con la estrategia --rspec-dm2 que solo ejecuta pruebas de unidades afectadas, obtenemos pruebas de cobertura de mutaciones muy rápidas. Vea esto asciicast para una demostración (de velocidad).

Cuestiones relacionadas