¿Cómo convence a la gerencia de "invertir" en pruebas unitarias?

46

¿Cómo convenció a su gerente para que le permitiera probar la unidad?

Por "uso", me refiero a que se me permita desarrollar, registrar el control de origen y mantener las pruebas unitarias a lo largo del tiempo, etc.

Las objeciones de gestión típicas son:

  1. El cliente no pagó por las pruebas unitarias.
  2. El proyecto no permite tiempo para pruebas unitarias.
  3. ¿Deuda técnica? ¿Qué deuda técnica?

¿Conoces otras objeciones? ¿Cuáles fueron tus respuestas?

¡Gracias por adelantado!

louisgab
fuente
66
Hay un capítulo completo en artofunittesting.com sobre este mismo tema.
StuperUser
66
No mezcle pruebas y TDD, ¡ POR FAVOR ! ¡Hace que las personas piensen que no necesitan pruebas a menos que hagan TDD!
P Shved
1
Las personas que necesitan convencer son más que convincentes. Considere su escenario como una causa perdida.
Mark Canlas
@Pavel, al principio pensé que estabas molestando, pero tienes razón. Quiero tener el "permiso" para la prueba unitaria, punto. TDD es lo mío.
louisgab 05 de
66
¿Por qué siente la necesidad de obtener permiso para verificar que su código funcione como se espera?
Jaap

Respuestas:

25

Me encontré con este problema recientemente cuando un cliente estaba a bordo con nuestra metodología, pero la alta gerencia se enteró de que los desarrolladores pasaban su tiempo probando en lugar de desarrollar y estaban preocupados por esto, después de todo, ¡tenían personas de control de calidad para hacer las pruebas! Blogueé sobre cómo lo traté aquí:

http://practicalagility.com/show-them-the-numbers-its-results-that-matter/

Para resumir, comparé nuestras horas estimadas con las horas reales del proyecto y luego comparé nuestra tasa de defectos con la tasa de defectos de otros equipos. En nuestro caso, estos números se compararon favorablemente y no hubo más preocupaciones.

Mi conclusión basada en esta experiencia es:

... la mejor manera de convencer a cualquiera de que su enfoque para hacer algo es práctico y pragmático, es hacerlo y compararlo con otros enfoques. A la gente no le importa el dogma, o por qué crees que algo debería ser la mejor manera. Solo mostrando a las personas los números y midiendo la efectividad de su enfoque puede realmente demostrar que sus prácticas son efectivas.

En otros proyectos, hemos trabajado junto a desarrolladores de clientes que no crearon pruebas unitarias ni hicieron TDD y tuvimos que mantener pruebas que no funcionaban. Sin embargo, es muy fácil vender el enfoque TDD a esos desarrolladores de clientes cuando puedes decirles lo que han roto en el código antes de que lo sepan.

Entonces, en su caso, lo haría sigilosamente si fuera necesario (tal vez hay un área pequeña del código que puede comenzar a probar que cambia con frecuencia o de la que es responsable), pero realice un seguimiento de sus números : ¿cuál es el esfuerzo para crear tus pruebas? ¿Cuál es la tasa de defectos? ¿Cómo se compara esto con otros proyectos / miembros del equipo?

En mi opinión, nadie debería pedir permiso o disculparse por querer hacer su trabajo correctamente y cualquier desarrollador profesional debería intentar probar su código con pruebas automatizadas siempre que sea posible y práctico. Esperemos que sean ambas cosas en su caso. ¡Buena suerte!

Paddyslacker
fuente
Gracias por la respuesta. Intenté el enlace pero parece roto. Creo que me gustaría leerlo si estuviera disponible.
Joe J
Joe, perdón por el vínculo muerto. Volví a publicar esto en mi blog personal, por lo que el enlace debería funcionar ahora.
Paddyslacker
2
Esta es una buena respuesta, pero no todos pueden comparar fácilmente lo que están haciendo con algún otro proyecto. No recuerdo dónde lo leí, pero el argumento más convincente para una persona de negocios que he visto fue comparar las pruebas unitarias con la contabilidad de doble entrada. Ingenuamente, hacer los números dos veces es una pérdida de tiempo. Pero cualquiera que sepa algo de contabilidad consideraría hacer solo un lado de los libros una negligencia imperdonable e irresponsable de sus deberes. Las pruebas unitarias son el desarrollo análogo a la contabilidad de doble entrada.
JimmyJames
@JimmyJames, estoy de acuerdo en que no siempre se puede comparar con otro proyecto, y estoy de acuerdo con su analogía sobre la contabilidad de doble entrada. Creo que si está comenzando a usar pruebas unitarias en una base de código existente sin pruebas, puede comparar la tasa de defectos de la base del código y otras métricas entre la parte cubierta por las pruebas unitarias y el código descubierto, para que tenga algunos datos reales para respaldar Tu enfoque también.
Paddyslacker
@ Paddy'slacker No estoy en desacuerdo. Sin embargo, es algo de pollo y huevo. Si necesita permiso para comenzar a escribir pruebas unitarias, es difícil usarlas para demostrar que se debe otorgar permiso. No es tampoco o. La comparación con datos reales es un argumento mucho, mucho más fuerte. Este argumento alternativo es más débil pero más fácil de montar.
JimmyJames
20

Mostrar el retorno de la inversión (ROI)

Escribir pruebas automatizadas lleva tiempo. Una vez. Ejecutar pruebas automatizadas lleva cero tiempo, porque puede hacer otra cosa mientras se ejecutan.

Ejemplo: Probar manualmente la función X lleva 30 minutos. Escribir una prueba automatizada para ello llevaría 1 hora. Incluso si no tenemos errores, tendremos que probar la característica X diez veces durante el curso del proyecto a medida que se modifiquen sus capas y componentes dependientes. Entonces, automatizar la prueba de la función X nos ahorrará 4 horas durante la vida del proyecto.

En realidad, es cuando tiene un error que las pruebas automatizadas realmente dan sus frutos: primero, encuentran errores de manera temprana y económica, lo que ahorra tiempo y vergüenza. En segundo lugar, si tiene un error difícil y pasa por muchos ciclos de prueba de compilación de código para resolverlo, el tiempo ahorrado durante las pruebas manuales se suma extraordinariamente rápido.

Las empresas entienden ahorrar tiempo y dinero. Así es como venderlo.

Steven A. Lowe
fuente
3
Además, una vez que se implementa la aplicación y alguien solicita un cambio, es mucho más fácil ver si está rompiendo algo con sus cambios.
m4tt1mus
44
@mattimus: absolutamente: un conjunto de pruebas automatizadas vale la pena como una anualidad; es, de hecho, un seguro
Steven A. Lowe
15

Si ya los ha confrontado y no están de acuerdo con eso, pero no se siente cómodo escribiendo código sin ellos ... entonces no vuelva a preguntar. Solo escríbelos y no los registres.

La gerencia no va a contar líneas de código, pero verán que todos sus registros tienen tasas de aprobación más altas de QA (o clientes) y eventualmente preguntarán por qué ... entonces puede ser todo como "BAM! TDD ! "

No estás jugando con el proyecto, el proceso o la fuente ... así que no veo una razón negativa. Honestamente, no veo una razón por la cual sea diferente en el tiempo que ejecutar todas sus pruebas de resultados de ejecución manual + entrada + verificación.

Steven Evers
fuente
44
+1: Tienes que probar de todos modos. Simplemente escriba pruebas unitarias en lugar de objetar sobre cómo se deben hacer las pruebas.
S.Lott
1
Solo tenerlos localmente no funciona bien en un entorno de equipo con una base de código compartida, otras personas seguirán rompiendo sus pruebas con sus cambios.
Alb
3
@Alb: Ese es el precio que paga cuando la gerencia no se incorpora, mejor que sin pruebas.
Steven Evers
3
Bravo. Cualquier prueba es mejor que ninguna prueba. Si una prueba se rompe debido al cambio de otra persona, es una buena razón para preguntar por qué la API cambió sin ningún anuncio.
S.Lott
"La administración no va a contar líneas de código", eso es muy cierto. ¡Gracias por la respuesta!
louisgab 05 de
7

1) El cliente no pagó por las pruebas unitarias

El cliente (pensó que) pagó por una solución de trabajo. Dependiendo de los contratos, la reparación de defectos puede ser rentable para su empresa. Si hay suficiente bloqueo. Por lo tanto, volver a pagar por una solución que funcione. TDD debería ayudar a ese objetivo.

2) El proyecto no permite tiempo para TDD

TDD no lleva más tiempo. Debería reducir la cantidad de código extraño o superfluo y enfocar la base del código en lo que hace pasar las pruebas. Todas las pruebas aprobadas, sujetas a la calidad y adecuación de la prueba, significa que el código está listo.

3) Deuda técnica? ¿Qué deuda técnica?

Tengo la impresión de que podría estar discutiendo para agregar retrospectivamente pruebas al código existente. Esta es una pesadilla de venta en el mejor de los casos y no brinda los beneficios que podría esperar. Sin embargo, agregar pruebas a medida que corrige errores debería ser aceptable y ayudar a largo plazo.

No recomiendo escribir las pruebas de todos modos, como lo sugirió Snorfus. Suena bien en teoría, pero las pruebas unitarias puedo y hacer cambios en el tiempo. A medida que cambian los requisitos, se agregan nuevas funciones y las pruebas unitarias deben actualizarse. Si está trabajando como parte de un equipo, las pruebas de su unidad quedarán desactualizadas a medida que otros agreguen funciones / correcciones.

Me dirijo a los puntos específicos que mencionó en lugar de plantear otros nuevos porque hay margen de maniobra para avanzar o comprender por qué está bloqueado.

Ian
fuente
55
"No recomiendo escribir las pruebas de todos modos" - He estado en esta posición antes. Es difícil mantener las pruebas usted mismo. Si esa carga se vuelve demasiado pesada, simplemente abandone las pruebas. Al menos los tenía cuando trabajaba activamente en la base de código, lo que debería ayudar con el diseño / arreglo inicial, si no captura las regresiones. He encontrado un gran valor en las pruebas unitarias para fines de diseño, pero he encontrado muy pocas regresiones cuando las pruebas no se mantienen al mismo nivel que el código.
Steve Jackson
1
Quien agregó características / correcciones y no actualizó las pruebas unitarias no entendió el concepto de prueba unitaria.
Akira Yamamoto
De hecho, Akira, este es uno de los problemas más confusos que afectan la viabilidad de TDD o procesos relacionados. Tenga en cuenta que aparentemente escribí esto hace 7 años, mucho sigue siendo relevante. Escribir pruebas (buenas, objetivas, concisas) es difícil. Escribir pruebas para una base de código que no tiene ninguna es muy difícil. Hacer que la administración no técnica vea los beneficios es difícil (a menos que lean un artículo al respecto, en cuyo caso te "matricularán" hasta la muerte. Incluso el concepto de lo que es una unidad es difícil. Soy un clasicista, así que mi idea de una unidad no es la misma que la de un Mockist (como un ejemplo con 30 caracteres restantes).
Ian
4

Por cada cliente que enfrenta problemas de producción,

  1. Escriba una prueba de Unidad y envíe un correo electrónico al gerente diciendo que ha agregado una prueba de Unidad para cubrir el escenario.

  2. Y dígale que este problema no volverá a suceder en producción porque nuestra prueba de la unidad se ejecuta todas las noches y llegaremos a saber antes de que el código entre en producción observando el fallo de esta prueba de la unidad.

  3. Dígale que si ya hubiéramos implementado esta prueba de la Unidad antes de que el código pasara a producción, este problema de producción nunca habría sucedido.

Haga esto de manera consistente y persistente y pronto estará convencido. A los gerentes no les gusta que el cliente enfrente problemas de producción y él comprará la idea de prueba de la Unidad. Buena suerte.

java_mouse
fuente
Esto es bueno :-)
BVengerov