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.
Respuestas:
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.
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.
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,
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.
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.
fuente
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.
fuente
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 :)
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente