2009-02-05 9 views
10

A la pregunta Am I unit testing or integration testing? He respondido, un poco provocativo: Do your test and let other people spend time with taxonomy.Prueba: unidad vs. integración vs. otros, ¿cuál es la necesidad de separación?

Para mí, la distinción entre varios niveles de prueba es técnicamente inútil: a menudo se usan las mismas herramientas, se necesitan las mismas habilidades, se debe alcanzar el mismo objetivo: eliminar fallas de software. Al mismo tiempo, puedo entender que los flujos de trabajo tradicionales, que la mayoría de los desarrolladores usan, necesitan esta distinción. Simplemente no me siento a gusto con los flujos de trabajo tradicionales.

Pensé que mi respuesta sería fuertemente negativa o altamente votada. De hecho ambos ocurrieron, con cinco upvotes y cuatro downvotes. Incluso el primer comentario fue un poco vacilante (¡gracias por tu voto positivo por cierto!).

Por lo tanto, mi pregunta tiene como objetivo comprender mejor lo que me parece una controversia y reunir varios puntos de vista sobre si esta separación entre los diferentes niveles de prueba es relevante o no.

¿Mi opinión es incorrecta? ¿Existen otros flujos de trabajo que no enfatizan en esta separación (tal vez métodos ágiles)? ¿Cuál es su experiencia sobre el tema?

Precisión: Estoy perfectamente al tanto de las definiciones (para los que no, vea this question). Creo que no necesito una lección sobre pruebas de software. Pero no dude en proporcionar algunos antecedentes si su respuesta lo requiere.

Respuesta

13

El rendimiento suele ser la razón por la que segrego las pruebas de "unidad" de las pruebas "funcionales".

Las pruebas de grupos de unidades deben ejecutarse lo más rápido posible y poder ejecutarse después de cada compilación.

Los grupos de pruebas funcionales pueden tardar unos minutos en ejecutarse y ejecutarse antes de registrarse, tal vez todos los días o cada dos días dependiendo de la función que se implemente.

Si todas las pruebas se agrupan juntas, nunca realizaría ninguna prueba hasta justo antes del checkin, lo que ralentizaría mi ritmo general de desarrollo.

+0

Si entiendo correctamente, construyes tus grupos de prueba de acuerdo a qué tan rápido son y cuantas veces los ejecutas. Creo que este es un buen punto, gracias. – mouviciel

+0

+1 Mientras más tiempo se ejecuten las pruebas, es menos probable que un desarrollador ejecute el conjunto de pruebas. –

+0

Interesante. Así que tal vez no queremos diferenciar entre 'unidad/integración/funcional', sino más bien entre 'rápido' y 'lento' independientemente del nivel de abstracción percibido de la prueba. Podría ser un paradigma más poderoso ya que algunas aplicaciones simples (cli) podrían no tener pruebas lentas y la diferenciación entre las pruebas de bajo nivel (unidad) y las pruebas de alto nivel (integración/funcional) en ellas sería un ejercicio de taxonomía inútil. – PSkocik

1

Definiciones de mi mundo:

prueba de unidad - a prueba los caminos obvios del código y que producen los resultados esperados.

Prueba de funcionamiento: examinar a fondo las definiciones del software y probar cada ruta definida, a través de todos los rangos permitidos. Un buen momento para escribir pruebas de regresión.

Prueba del sistema: prueba el software en su entorno de sistema, en relación con él. Genere todos los procesos que pueda, explore cada combinación interna, ejecútelo un millón de veces durante la noche, vea qué se cae.

Prueba de integración: ejecútela en una configuración de sistema típica y vea si otro software causa un conflicto con el probado.

8

Tendría que estar de acuerdo con @Alex B en que necesita diferenciar entre pruebas unitarias y pruebas de integración al escribir sus pruebas para hacer que sus pruebas unitarias se ejecuten lo más rápido posible y no tener más dependencias que las requeridas para probar el código bajo prueba. Desea que las pruebas unitarias se ejecuten con mucha frecuencia y, cuanto más "integradas" sean, menos se ejecutarán.

Para facilitar esto, las pruebas unitarias generalmente (o deberían) implican burlas o falsas dependencias externas. Las pruebas de integración dejan intencionalmente estas dependencias porque ese es el punto de la prueba de integración. ¿Necesitas burlar/fingir cada dependencia externa? Yo diría que no necesariamente si el costo de burlarse/fingir es alto y el valor devuelto es bajo, es decir, el uso de la dependencia no aumenta significativamente el tiempo o la complejidad de la (s) prueba (s).

Aunque, sobre todo, diría que es mejor ser pragmático en lugar de dogmático al respecto, pero reconozca las diferencias y evite entremezclas si sus pruebas de integración hacen que sea demasiado caro ejecutar sus pruebas con frecuencia.

+0

¿Entonces una separación pragmática sería entre las pruebas rápidas frecuentes y las pruebas lentas o complejas poco frecuentes? Ya me he encontrado con pruebas unitarias que necesitaban hardware pesado para ejecutarse (una secuencia de apagado observada con un analizador lógico conectado al bus de la CPU, por ejemplo). – mouviciel

+1

@mouviciel En general, sí. Las pruebas unitarias * por lo general * entran directamente en la categoría de "prueba rápida", mientras que las pruebas de integración normalmente * tomarían más tiempo ya que prueban mucho más código. Sin embargo, como ya sabrá, no todos los programas son iguales y algunos fragmentos de código que normalmente se considerarían una unidad pueden tardar mucho tiempo en ejecutarse. Sin embargo, sospecho que para * la mayoría * de los programas escritos allí que funciona la diferenciación de prueba rápida - unidad/prueba lenta - integración. El punto es que debe tener un conjunto de pruebas que se ejecutan rápidamente para mostrarle la estabilidad de los cambios que acaban de hacerse. –

Cuestiones relacionadas