¿Cómo critican las pruebas de integración al diseño?

38

Estoy leyendo en el blog de JB Rainsberger sobre pruebas integradas y me pregunto de qué manera una prueba de integración es más dura con nuestro diseño.

Escribimos más pruebas integradas, que son más grandes y no critican nuestro diseño con tanta dureza como lo hacen los microtests.

Alex.U
fuente
3
La pregunta es confusa. "de qué manera una prueba de integración es más dura" ... "pruebas integradas, que son más grandes y no critican nuestro diseño tan duramente", ¿y ahora qué?
AnoE
"prueba de integración"! = "prueba integrada". Lo sé. A mí tampoco me gusta, pero eso es lo que significan esas palabras. "pruebas de integración" = "pruebas que verifican los puntos de integración (sin integrar cosas)", mientras que "pruebas integradas" = "pruebas (más grandes) que integran cosas y verifican el todo integrado como una sola cosa". De esta manera, estos términos se convierten en opuestos entre sí.
JB Rainsberger

Respuestas:

46

Las microtestas pueden ayudar a llevar a un buen diseño . Al escribir buenas pruebas pequeñas, está probando deliberadamente una pequeña cantidad de código y rellenando sus huecos con objetos simulados . Esto conduce a un bajo acoplamiento (las cosas no dependen unas de otras) y una alta cohesión (las cosas que pertenecen juntas permanecen juntas). De esa manera, cuando regresa y hace cambios, es fácil encontrar qué es responsable de lo que está buscando y es menos probable que rompa las cosas al hacer el cambio. Esto no resolverá todo su diseño, pero puede ayudar.

En este contexto, JB Rainsberger señala que si tiene dificultades para escribir una prueba unitaria, es probable que tenga un problema con su diseño que esté causando la dificultad y, por lo tanto, las pruebas están criticando el diseño implícitamente. Él postula que esto es algo bueno, porque sin las pequeñas pruebas ayudan a mantener su arquitectura en línea, es fácil alejarse de los buenos patrones de diseño, que las pruebas integradas no capturarán.

Actualización : como señala Rainsberger a continuación, no tenía la intención de que los microtests fueran sinónimos de pruebas unitarias. También proporcionó una respuesta detallada que puede darle una visión más profunda de exactamente lo que estaba comunicando.

Thorin Jacobs
fuente
2
Estoy de acuerdo con su respuesta en principio, pero no con la forma en que la está articulando. Es poco probable que alguien que hace esta pregunta en particular sepa lo que significan los términos "burla", "acoplamiento" y "cohesión", y usted no ha definido esos términos en su respuesta.
Robert Harvey
3
Eso es mejor, pero le estás dando más crédito a las pruebas unitarias de lo que creo que realmente se deben. Las pruebas unitarias informan principalmente la capacidad de prueba de su código. Está menos claro si hacer que su código sea verificable automáticamente confiere mejores características de cohesión y acoplamiento, aunque ciertamente es una influencia positiva. Además, creo que se confundió la "alta cohesión" con el "principio de responsabilidad única"; cohesión significa "cosas que van juntas" (ver el artículo de Wikipedia ).
Robert Harvey
10
Finalmente, "micro-pruebas" no es el término preferido. Me encanta cuando los bloggers inventan sus propios términos técnicos.
Robert Harvey
2
@RubberDuck: microtests (unos 16.900 resultados) frente a pruebas unitarias (unos 193.000.000 resultados) . Ni siquiera cerca. Incluso si combina la unidad y las pruebas juntas , obtendrá 14 millones de resultados.
Robert Harvey
55
No iguale "microtest" y "test de unidad" (vea mi respuesta para obtener más detalles); de lo contrario, siento que entendiste lo que intenté describir.
JB Rainsberger
28

La versión extremadamente corta: las pruebas más pequeñas, debido a que ejecutan partes más pequeñas del sistema, limitan naturalmente lo que los programadores pueden escribir, por lo que esto crea una oportunidad para comentarios más precisos (más fáciles de notar / más difíciles de ignorar). Permítanme agregar que esto no necesariamente conduce a un mejor diseño, sino que crea la oportunidad de notar los riesgos de diseño antes.

Primero, para aclarar, cuando digo "microtest" quiero decir "una pequeña prueba" y nada más. Uso este término porque no me refiero a "prueba unitaria": no quiero involucrarme en debates sobre lo que constituye una "unidad". No me importa (al menos no aquí / ahora). Dos personas probablemente estarán de acuerdo más fácilmente en "pequeño" que en "unidad", por lo que gradualmente decidí adoptar "microtest" como un término estándar emergente para esta idea.

Las pruebas más grandes, es decir, las pruebas que ejecutan partes más grandes del sistema en su parte de "acción", tienden a no criticar el diseño de manera tan clara ni tan completa como las pruebas más pequeñas. Imagine el conjunto de todas las bases de código que podrían pasar un grupo dado de pruebas, lo que significa que podría reorganizar el código y aún así pasaría esas pruebas. Para pruebas más grandes, este conjunto es más grande; para pruebas más pequeñas, este conjunto es más pequeño. Dicho de otra manera, las pruebas más pequeñas limitan más el diseño, por lo que menos diseños pueden hacer que pasen. De esta manera, los microtestas pueden criticar más el diseño.

Digo "con más dureza" para conjurar la imagen de un amigo que te dice directamente lo que no quieres escuchar, pero que necesitas escuchar, y que te grita para que expreses urgencia de una manera que otras personas puedan no sentirse cómodas. obra. Las pruebas integradas, por otro lado, permanecen silenciosas y solo sugieren problemas, principalmente cuando ya no tienes tiempo ni energía para abordarlos. Las pruebas integradas hacen que sea demasiado fácil barrer los problemas de diseño debajo de la alfombra.

Con pruebas más grandes (como las pruebas integradas), los programadores tienden a meterse en problemas por descuido: tienen suficiente libertad para escribir código enredado que de alguna manera pasa las pruebas, pero su comprensión del código se desvanece rápidamente en el momento en que pasan a la siguiente tarea. , y otros tienen dificultades innecesarias para leer el diseño enredado. Aquí radica el riesgo de depender de pruebas integradas. Con pruebas más pequeñas (como microtestas), los programadores tienden a meterse en problemas debido a una especificación excesiva: restringen las pruebas al agregar detalles irrelevantes, generalmente copiando / pegando de la prueba anterior, y al hacerlo se pintan relativamente rápido en una esquina Buenas noticias: Me resulta mucho más fácil y seguro eliminar detalles extraños de las pruebas varias horas o días después de escribirlos que encontrar el código de producción enredado meses o años después de escribirlo. A medida que avanzan los errores, la especificación excesiva hace que el daño sea cada vez más evidente y más rápido, y el programador de alertas ve antes que necesitan arreglar las cosas. Considero que esto es una fortaleza: noto problemas antes y los soluciono antes de que esos problemas estrangulen nuestra capacidad de agregar funciones.

JB Rainsberger
fuente
¿Qué hace con el problema de que las pruebas unitarias se basan más en sus simulaciones que en el código real, lo que lleva al problema de las pruebas que parecen pasar pero que en realidad no funcionan porque nadie mantuvo las simulaciones en línea con la realidad?
Zan Lynx
@ZanLynx He escrito sobre esto extensamente. Comience aquí: blog.thecodewhisperer.com/series#integrated-tests-are-a-scam
JB Rainsberger
9

Quiere decir que un buen diseño de software está mejor informado por pruebas unitarias que por pruebas de integración.

Este es el por qué. Escribir pruebas unitarias te obliga a escribir código que sea comprobable por unidades. El código de prueba unitaria tiende a ser un mejor diseño que el código que no tiene pruebas unitarias.

Las pruebas de integración no informan su código de la misma manera porque solo está probando la capa externa de su software, no las interfaces internas que conectan su software.

Robert Harvey
fuente