¿TDD / prueba demasiado una carga de gastos generales / mantenimiento?

24

Entonces lo has escuchado muchas veces de aquellos que realmente no entienden los valores de las pruebas. Solo para comenzar, soy un seguidor de Agile and Testing ...

Recientemente tuve una discusión sobre la realización de TDD en una reescritura de producto donde el equipo actual no practica pruebas unitarias en ningún nivel, y probablemente nunca he oído hablar de la técnica de inyección de dependencia o patrones / diseño de prueba, etc. (ni siquiera obtendremos para limpiar el código).

Ahora, soy totalmente responsable de la reescritura de este producto y me dicen que intentarlo de la manera de TDD, simplemente lo convertirá en una pesadilla de mantenimiento e imposible de mantener para el equipo. Además, como es una aplicación front-end (no basada en la web), agregar pruebas no tiene sentido, ya que la unidad de negocio cambia (por cambios significan mejoras, por supuesto), las pruebas quedarán desactualizadas, otros desarrolladores que llegan a el proyecto en el futuro no los mantendrá y será más una carga para que lo arreglen, etc.

Puedo entender que TDD en un equipo que actualmente no tiene ninguna experiencia de prueba no suena bien, pero mi argumento en este caso es que puedo enseñar mi práctica a quienes me rodean, pero aún más, sé que TDD hace MEJOR software. Incluso si tuviera que producir el software usando TDD, y descartar todas las pruebas al entregarlo a un equipo de mantenimiento, ¿seguramente sería un mejor enfoque que no usar TDD desde el principio?

Me han derribado como mencioné haciendo TDD en la mayoría de los proyectos para un equipo que nunca había oído hablar de él. La idea de "interfaces" y constructores DI de aspecto extraño los asusta ...

¿Alguien puede ayudarme en lo que normalmente es una conversación muy corta de tratar de vender TDD y mi acercamiento a las personas? Por lo general, tengo una ventana de discusión muy corta antes de caer de rodillas ante la empresa / equipo.

Martin Blore
fuente
3
¡CORRER! ¡HUIR! Cualquier persona que no pueda comprender por qué las pruebas automáticas les facilitarán la vida a largo plazo debe eliminar su (s) cabeza (s) de usted sabe dónde.
MattC
66
@MattC TDD! = Pruebas automatizadas
Nemanja Trifunovic
@Nemanja Trifunovic: Uhh ... ¿quién practica TDD usando pruebas manuales? "¿Comencé la aplicación pero no hay ningún botón para hacer clic?" "Sí; ¡ese es el rojo en rojo, verde, refactor!"
Steven Evers
2
@SnOrfus: Hay pruebas automatizadas sin TDD. Algunos ejemplos: pruebas de integración automatizadas, pruebas de regresión, pruebas de estrés.
Nemanja Trifunovic
2
@ Martin, me interesaría un comentario de seguimiento (o publicación de blog) que discuta lo que terminaste haciendo y qué tan bien (o no) funcionó para ti a largo plazo.
StevenV

Respuestas:

36

intentarlo al estilo de TDD, simplemente lo convertirá en una pesadilla de mantenimiento e imposible de mantener para el equipo.

No puedes ganar ese argumento. Están inventando esto. Lamentablemente, tampoco tienes hechos reales. Cualquier ejemplo que proporcione puede ser disputado.

La única forma de llegar a este punto es tener un código que sea más económico de mantener.

Además, como es una aplicación front-end (no basada en la web), agregar pruebas no tiene sentido,

Todos dicen esto. Puede ser parcialmente cierto, también. Si la aplicación está razonablemente bien diseñada, el front-end hace muy poco.

Sin embargo, si la aplicación está mal diseñada, el front-end hace demasiado y es difícil de probar. Este es un problema de diseño, no un problema de prueba.

A medida que la unidad de negocio cambia (por cambios significan mejoras, por supuesto), las pruebas quedarán desactualizadas, otros desarrolladores que ingresen al proyecto en el futuro no las mantendrán y se convertirán en una carga para que las arreglen, etc.

Este es el mismo argumento que el anterior.


No puedes ganar la discusión. Entonces no discutas.

"Soy totalmente responsable de la reescritura de este producto"

En ese caso,

  1. Añadir pruebas de todos modos. Pero agregue pruebas a medida que avanza, de forma gradual. No pases mucho tiempo haciendo pruebas escritas primero. Convierte un poco. Prueba un poco. Convierte un poco más. Prueba un poco más.

  2. Use esas pruebas hasta que alguien descubra que las pruebas están funcionando y pregunte por qué las cosas van tan bien.

Tuve el mismo argumento en una reescritura (de C ++ a Java) y simplemente usé las pruebas a pesar de que me dijeron que no lo hiciera.

Me estaba desarrollando muy rápido. Pedí ejemplos concretos de resultados correctos, que enviaron en hojas de cálculo. Convertí las hojas de cálculo en unittest.TestCase (sin decirles) y las uso para probar.

Cuando estábamos en la prueba de aceptación del usuario, y se encontraron errores, solo pedí que se revisaran, corrigieran y ampliaran las hojas de cálculo con los ejemplos para cubrir los problemas encontrados durante la prueba de aceptación. Convertí las hojas de cálculo corregidas en unittest.TestCase (sin decirles) y las utilizo para probar.

Nadie necesita saber en detalle por qué tiene éxito.

Solo ten éxito.

S.Lott
fuente
Respuesta muy inspiradora allí S.Lott :). Fue desalentador para mí que un arquitecto de la compañía me dijera que estaría "creando gastos generales innecesarios". No se podía ver que retrasara el proyecto con ninguna incógnita para ellos, que en última instancia, si el proyecto llegaba tarde, simplemente podrían señalar con el dedo las pruebas que realicé y finalizar el contrato. Como usted dice, es probable que la manera correcta sea infiltrarlos en una prueba posterior de cómo ayudó. Tiene toda la razón desde el punto de vista de la discusión, no tengo motivos, y ellos tampoco.
Martin Blore
¿Por qué el front-end tiene demasiado problema de diseño? Hoy en día, muchas tecnologías como AJAX hacen mucho en front-end.
卢 声 远 Shengyuan Lu
@ 卢 声 远 Shengyuan Lu: Es difícil probar la "apariencia" de la GUI. Puede probar fuentes y colores. Sin embargo, las peculiaridades del navegador hacen que sea muy difícil probar la ubicación y el tamaño exactos con las pruebas automáticas.
S.Lott
@ Martin Blore: "ellos tampoco". Precisamente. Cualquiera que diga que las pruebas de alguna manera agregarán riesgo mágico es una locura. Tienes que probar de todos modos, es inevitable. Puede realizar una buena prueba (usando TDD) o puede realizar una prueba deficiente y al azar. Planear pruebas pobres y al azar me parece más riesgoso. Pero no hay discusión de base hasta que los "no dicen" tengan experiencia práctica.
S.Lott
5

Solo puede convencer a esas personas (si es que lo hace) desde el punto de vista práctico, demostrando el valor de TDD en la vida real. Por ejemplo, tomando un error reciente como ejemplo y mostrando cómo construir una prueba unitaria que asegure al 100% que este error nunca vuelva a aparecer. Y luego, por supuesto, escriba una docena de pruebas unitarias más para evitar que aparezca toda la clase de errores similares (y quién sabe, tal vez en el camino incluso descubriendo algunos errores más latentes en el código).

Si esto no funciona a corto plazo, debe trabajar en esto por más tiempo, simplemente haciendo TDD y escribiendo pruebas de unidad diligentemente en sus propias tareas. Luego, compile algunas estadísticas simples después de medio año más o menos (si es posible en su entorno) para comparar las tasas de errores en el código / tareas realizadas por diferentes desarrolladores (anonimizados para evitar alienar a sus compañeros de equipo). Si puede señalar que se encontraron significativamente menos errores en su código que en otros, es posible que tenga un punto fuerte para vender tanto a la administración como a otros desarrolladores.

Péter Török
fuente
Esa es una gran idea Peter, gracias por eso. Mi proyecto actual cuenta con un equipo de prueba, así que estoy seguro de que sería muy fácil de errores de captura que se encuentran en hito comunicados etc.
Martin Blore
3

Tiene que ser práctico sobre estas cosas, TDD es algo bueno en teoría, pero a menos que esté actualizando sus pruebas para todo lo que se agrega, no tiene sentido: nadie quiere ejecutar una prueba que informa que no funciona código cuando es la prueba que no se ha actualizado! Como resultado, puede ser demasiado costoso hacerlos, no serás el único desarrollador que trabaje en ese código.

El cliente tiene un equipo de prueba ... bueno, no hay ningún problema en trasladar la carga de la prueba del desarrollador a los probadores, para eso están allí después de todo, y si encuentran errores a través de sus pruebas (tal vez tengan muchos herramientas de prueba automatizadas), entonces no tiene mucho sentido escribir pruebas unitarias a su nivel. Tardará un poco más en encontrar los errores, pero encontrarán esos molestos errores de "integración" que sus pruebas no habrían ejercido.

Es probable que esta sea la razón por la que no se preocupan por las pruebas unitarias.

Por último, TDD es algo nuevo, cuando yo era un chico nunca tuvimos pruebas y escribimos código que funcionó. Las pruebas unitarias hacen que algunas personas se sientan cálidas y difusas, pero no es un requisito para el código correcto.

PD. Veo otra de sus preguntas donde critica las capas de abstracción, y aquí critica la falta de constructores DI. Manten tu pesamiento :)

gbjbaanb
fuente
2

Como todo cambia tan rápido como lo pones, explícales que se usará para las pruebas de regresión. Lo que ahorrará muchos dolores de cabeza cuando se introducen nuevos errores porque alguien rompió una línea de código que se escribió hace 10 años para resolver un problema que ocurre 1 de cada 10,000,000 ejecuciones de una función específica que solo se llama si el sistema se activa el cliente tiene una diferencia de más de 3 minutos que el reloj del sistema del servidor. Simplemente pregúnteles cuántos clientes pueden permitirse perder debido al software defectuoso.

Woot4Moo
fuente
2

Señale que encontrar un error durante el desarrollo cuesta X, durante la prueba 10X y después de la implementación 100X. Vea si al menos le permitirán realizar una prueba piloto en la que implemente TDD en un módulo específico, luego haga un seguimiento con comparaciones con otros módulos a medida que se desarrollan, prueban, implementan y admiten. Con datos adecuados, debería poder demostrar cómo se utilizó menos esfuerzo para producir código en el módulo TDD. Buena suerte.

SnoopDougieDoug
fuente
2

Sí, mantener las pruebas es una carga. Actualizándolos, actualizando sus datos de prueba: todo esto le quita el tiempo.

La alternativa: probar cosas manualmente, corregir errores que regresan, no poder decir en segundos que su código funciona, cuesta mucho más.

Frank Shearar
fuente
2
Creo que este es uno de los puntos más importantes para los que dicen en contra de quienes dicen que TDD es una pérdida de tiempo y una sobrecarga innecesaria. No es que TDD no cueste tiempo. Es el hecho de que es una inversión que previene costos futuros que son órdenes de magnitud mayores
sara
2

Bueno, la prueba es una carga, pero es una buena carga para llevar. Es mejor hacer un trabajo por adelantado que ahorraría una buena cantidad de tiempo cuando hay algún problema de producción o durante la migración. Siempre querré hacerme la prueba, aunque sea una carga pequeña, pero quiero llevar esa carga.

Rachel
fuente