thetalkingwalnut pregunta:
¿Cuáles son algunas buenas maneras de convencer a los escépticos desarrolladores del equipo del valor de Unit Testing?
Todos aquí se van a amontonar por muchas razones de la nada por las que las pruebas unitarias son buenas. Sin embargo, creo que a menudo la mejor manera de convencer a alguien de algo es escuchar su argumento y abordarlo punto por punto. Si los escucha y los ayuda a expresar sus inquietudes, puede abordar cada uno de ellos y quizás convertirlos a su punto de vista (o al menos, dejarlos sin una pierna para pararse). ¿Quién sabe? Quizás te convencerán de por qué las pruebas unitarias no son apropiadas para tu situación. No es probable, pero posible. Quizás si publica sus argumentos en contra de las pruebas unitarias, podemos ayudar a identificar los contraargumentos.
Es importante escuchar y comprender ambos lados del argumento. Si intentas adoptar pruebas unitarias demasiado celosamente sin tener en cuenta las preocupaciones de la gente, terminarás con una guerra religiosa (y probablemente pruebas unitarias realmente inútiles). Si lo adopta lentamente y comienza aplicándolo donde verá el mayor beneficio por el menor costo, podría demostrar el valor de las pruebas unitarias y tener una mejor oportunidad de convencer a las personas. Me doy cuenta de que esto no es tan fácil como parece: por lo general, requiere algo de tiempo y métricas cuidadosas para elaborar un argumento convincente.
Las pruebas unitarias son una herramienta, como cualquier otra, y deben aplicarse de tal manera que los beneficios (capturar errores) superen los costos (el esfuerzo de escribirlos). No los use si / donde no tienen sentido y recuerde que son solo parte de su arsenal de herramientas (por ejemplo, inspecciones, afirmaciones, analizadores de código, métodos formales, etc.). Lo que les digo a mis desarrolladores es esto:
Pueden omitir escribir una prueba para un método si tienen un buen argumento de por qué no es necesario (por ejemplo, demasiado simple para valerlo o demasiado difícil para valerlo) y cómo se verificará el método (por ejemplo, inspección, afirmaciones , métodos formales, pruebas interactivas / de integración). Deben tener en cuenta que algunas verificaciones, como las inspecciones y las pruebas formales, se realizan en un momento dado y luego deben repetirse cada vez que cambia el código de producción, mientras que las pruebas unitarias y las afirmaciones pueden usarse como pruebas de regresión (escritas una vez y ejecutadas repetidamente después) ) A veces estoy de acuerdo con ellos, pero con mayor frecuencia debatiré si un método es realmente demasiado simple o demasiado difícil de probar por unidad.
Si un desarrollador argumenta que un método parece demasiado simple para fallar, ¿no vale la pena tomarse los 60 segundos necesarios para escribir una prueba unitaria simple de 5 líneas? Estas 5 líneas de código se ejecutarán todas las noches (usted hace compilaciones nocturnas, ¿verdad?) Durante el próximo año o más y valdrá la pena el esfuerzo si incluso una vez que se detecta un problema que puede haber tardado 15 minutos o más en identificarse y depurar Además, escribir las pruebas unitarias fáciles aumenta el número de pruebas unitarias, lo que hace que el desarrollador se vea bien.
Por otro lado, si un desarrollador argumenta que un método parece demasiado difícil de probar (no vale la pena el esfuerzo significativo requerido), tal vez eso sea una buena indicación de que el método necesita ser dividido o refactorizado para probar las partes fáciles. Por lo general, estos son métodos que se basan en recursos inusuales como singletons, la hora actual o recursos externos como un conjunto de resultados de la base de datos. Por lo general, estos métodos deben refactorizarse en un método que obtenga el recurso (por ejemplo, llamadas getTime ()) y un método que tome el recurso como argumento (por ejemplo, tome la marca de tiempo como parámetro). Les dejo pasar la prueba del método que recupera el recurso y en su lugar escriben una prueba unitaria para el método que ahora toma el recurso como argumento. Por lo general, esto hace que escribir la prueba unitaria sea mucho más simple y, por lo tanto, vale la pena escribirlo.
El desarrollador necesita dibujar una "línea en la arena" en cuanto a cuán exhaustivas deberían ser sus pruebas unitarias. Más adelante en el desarrollo, cada vez que encontremos un error, deberían determinar si las pruebas unitarias más completas habrían detectado el problema. Si es así y si tales errores surgen repetidamente, deben mover la "línea" para escribir pruebas unitarias más completas en el futuro (comenzando con la adición o expansión de la prueba unitaria para el error actual). Necesitan encontrar el equilibrio correcto.
Es importante darse cuenta de las pruebas de unidad no son una panacea y no es una cosa tal como demasiada pruebas unitarias. En mi lugar de trabajo, cada vez que hacemos una lección aprendida, inevitablemente escucho "necesitamos escribir más pruebas unitarias". La gerencia asiente de acuerdo porque se les ha golpeado en la cabeza que "pruebas unitarias" == "bueno".
Sin embargo, debemos comprender el impacto de "más pruebas unitarias". Un desarrollador solo puede escribir ~ N líneas de código a la semana y debe averiguar qué porcentaje de ese código debe ser un código de prueba unitario versus un código de producción. Un lugar de trabajo laxo podría tener el 10% del código como pruebas unitarias y el 90% del código como código de producción, lo que da como resultado un producto con muchas características (aunque muy defectuosas) (piense en MS Word). Por otro lado, una tienda estricta con 90% de pruebas unitarias y 10% de código de producción tendrá un producto sólido como una roca con muy pocas características (piense en "vi"). Es posible que nunca escuche informes sobre la caída del último producto, pero es probable que tenga tanto que ver con que el producto no se venda tan bien como con la calidad del código.
Peor aún, quizás la única certeza en el desarrollo de software es que "el cambio es inevitable". Suponga que la tienda estricta (90% de pruebas unitarias / 10% de código de producción) crea un producto que tiene exactamente 2 características (suponiendo que el 5% del código de producción == 1 característica). Si el cliente aparece y cambia 1 de las características, entonces ese cambio desecha el 50% del código (45% de las pruebas unitarias y el 5% del código de producción). La tienda laxa (10% de pruebas unitarias / 90% de código de producción) tiene un producto con 18 características, ninguna de las cuales funciona muy bien. Su cliente renueva por completo los requisitos para 4 de sus características. Aunque el cambio es 4 veces mayor, solo la mitad de la base del código se destruye (~ 25% = ~ 4.4% pruebas unitarias + 20% del código de producción).
Mi punto es que tiene que comunicar que comprende el equilibrio entre muy poca y demasiada prueba de unidad, esencialmente que ha pensado en ambos lados del problema. Si puede convencer a sus pares y / o su gerencia de eso, gana credibilidad y quizás tenga una mejor oportunidad de ganárselos.