Colega no dispuesto a usar pruebas unitarias "ya que es más para codificar"

25

Un colega no está dispuesto a utilizar pruebas unitarias y, en su lugar, opta por una prueba rápida, se la pasa a los usuarios y, si todo está bien, se publica en vivo. No hace falta decir que algunos errores sí pasan.

Mencioné que deberíamos pensar en usar pruebas unitarias, pero ella estaba en contra una vez que se dio cuenta de que tendría que escribirse más código. Esto me deja en la posición de modificar algo y no estar seguro de que el resultado sea el mismo, especialmente porque su código es spaghetti y trato de refactorizarlo cuando tengo la oportunidad.

Entonces, ¿cuál es el mejor camino para mí?

billy.bob
fuente
3
La aversión a escribir pruebas unitarias quizás tenga menos que ver con su colega que con la sobrecarga sistémica de las implementaciones comunes de pruebas unitarias.
mario
2
@james: Vea mi respuesta a @ m.edmondson.
doppelgreener
¡¡Bueno!! ¡Menos competencia para ti!
@ Jonathan - bastante justo, estoy corregido
ozz
@ m.Edmondson - nuevo trabajo ... fue una pequeña lengua en la mejilla esa parte de mi comentario, pero suena como un lugar desagradable para trabajar, viejos técnicos, desarrolladores que no están dispuestos a usar una práctica de desarrollo sensata.
ozz

Respuestas:

23

Ella no conoce los beneficios de las pruebas unitarias y eso es lo que necesita cambiar:

  • Su conciencia

Tendrás que demostrarle que mejorará su trabajo, no solo el tuyo. Eso será difícil, probablemente tratará de concentrarse en cada aspecto negativo que pueda encontrar si tiene miedo al cambio.

Puede tratar de discutir con ella sobre todos los beneficios y escuchar todos sus argumentos en contra. Espere hasta que termine de hablar antes de comenzar a hablar usted mismo.

Para prepararse, debe buscar en P.SE o Google todo lo relacionado con la gestión o los desarrolladores están preocupados por las pruebas unitarias y compilar las respuestas que utilizará durante sus conversaciones con su colega.

Solo escucharla y proporcionarle pruebas de que mejorará su trabajo lo ayudará mucho. Usted demuestra que le preocupa su opinión y le proporciona todos los datos que necesita para analizar la situación y, finalmente, cambiar de opinión.


fuente
20
Me encanta la lista de un artículo. +1
Armand
1
Esta respuesta hubiera sido perfecta si te hubieras detenido justo después de la lista. +1 :)
Tim Post
¡Hola, Tim, felicitaciones por tu 2º puesto en las elecciones SO!
66
Sentí que esa lista merecía su propio gráfico circular.
Tomás
Es posible que también deba cambiar su disposición a enviar errores. La evitación de algunos defectos podría hacer que las mejores pruebas sean más importantes.
stonemetal
15

Escribe una prueba unitaria (no se lo digas)

Espere hasta que la cosa se rompa, deje que haga pruebas manuales durante dos días, luego saque las pruebas de su unidad y encuentre el error en tres segundos.

Ponerse a cubierto...

Thorsten Müller
fuente
1
+1 Por indicar que los errores son inevitables y ponerse a cubierto.
Neil
+1 Escribir un conjunto completo de pruebas unitarias para una parte particular del código puede exponer suficientes problemas con el código que demuestran los beneficios de todos modos. Recuerdo ver una presentación sobre cómo las pruebas unitarias se pueden utilizar para mantener la interfaz / especificaciones API / comportamientos a través de un código completo re-escritura ...
JBRWilkinson
3
@JBRWilkinson: Merb (antiguo marco de aplicación web Ruby) hizo exactamente eso. Sin embargo, no con pruebas unitarias, sino con pruebas funcionales. La arquitectura había crecido "orgánicamente", y aunque el marco era agradable de usar , no era agradable mantenerlo y ampliarlo . Y dado que la capacidad de mantenimiento y la extensibilidad eran en realidad dos de los principales puntos de venta sobre su competidor Ruby on Rails, obviamente tenían que hacer algo al respecto. Y lo que hicieron fue literalmente a rm -rflos directorios de prueba de fuente y unidad, manteniendo solo las pruebas funcionales, y simplemente haciendo que pasen nuevamente una por una.
Jörg W Mittag
11

La automatización, de lo contrario, las tareas manuales deberían ser atractivas para cualquier programador.

Entonces no está "escribiendo más código", está haciendo menos manualmente.

Les
fuente
1
depende si tienes un equipo de prueba que hace todo eso por ti :)
gbjbaanb
11

(Uno de) los puntos de las pruebas automatizadas es la repetibilidad . Si hace una prueba rápida a mano, puede hacerlo más rápido que escribir lo mismo que una prueba unitaria (al menos para un principiante en pruebas unitarias, cualquier persona con experiencia en pruebas unitarias puede producir pruebas bastante rápido).

Pero, ¿qué pasa cuando mañana, o la próxima semana, se hace un pequeño (o gran ...) cambio en el código? ¿Repetiría con gusto su colega las mismas pruebas manuales una y otra vez después de cada cambio, para asegurarse de que no se rompa nada? ¿O preferiría ella "codificar y rezar"?

Cuanto más se cambie el código, más pagarán las pruebas unitarias su inversión inicial . No lleva mucho tiempo obtener el lado positivo, incluso sin que las pruebas realmente detecten errores. Pero también lo hacen regularmente: en este punto, se vuelven invaluables. Y una vez que alguien experimenta esa sensación de seguridad y confianza en el código que proporciona una prueba de unidad exitosa, generalmente no hay vuelta atrás.

Si está convencida, pero tiene miedo de aventurarse en la nueva área, ofrézcale una sesión de programación en pareja para escribir juntos sus primeras pruebas unitarias . Elija una clase que no sea demasiado difícil de probar pero lo suficientemente compleja como para que valga la pena probarla.

Sin embargo, si no está convencida, es posible que deba seguir recopilando datos concretos . Tales hechos pueden ser

  • tasas de defectos en el código escrito por usted frente al de ella
  • escribiendo un conjunto de pruebas unitarias contra su código y documentando los errores encontrados.

Recopile algunos de esos datos, luego muéstrele educadamente los resultados. Si todavía no son suficientes para convencerla, es posible que deba analizar el problema y compartir la evidencia recopilada con la gerencia. Ese solo debería ser su último recurso, pero a veces no hay otra manera.

Péter Török
fuente
Altamente improbable, aunque no es desconocido tener páginas de planes de prueba (documentos de Excel) de largo
billy.bob
@ m.edmondson, sí, esa fue solo una pregunta retórica :-)
Péter Török
+1 para repetibilidad. Soy un refactor agresivo (er), y me encanta el hecho de que puedo encontrar regresiones muy rápidamente cuando reescribo completamente una sección de código.
Michael K
3

Escriba una cobertura de prueba básica para los peores pedazos de su código, realice un repaso basado en esas pruebas, luego haga un caso con la administración de que las pruebas unitarias en compilaciones continuas mejorarán la productividad. Los cambios son más fáciles cuando lo ordena un empleador en lugar de ser evangelizados por un solo desarrollador.

No sé cómo expresar esto correctamente, pero: si estás refactorizando su código "cuando tienes la oportunidad" ... bueno, probablemente piense que eres un poco imbécil por involucrarte en "su negocio" , por lo que es menos probable que te escuche con la mente abierta. En mi experiencia, las personas se apegan a lo que han hecho, incluso cuando no es terriblemente bueno.

TZHX
fuente
Estamos en .NET 1 (una broma que sé): ¿se pueden implementar pruebas unitarias aquí?
billy.bob 03 de
1
@ m.edmondson: ¿Tal vez algo como NUnit? ( nunit.org )
Dr. Hannibal Lecter
@dr Hannibal Lecter - Sí, creo que tenemos una copia de eso en algún lugar, veré si puedo encontrarlo
billy.bob 03 de
44
las pruebas unitarias no necesitan usar un conjunto específico para ser efectivas. Los escribí solo en Python haciendo llamadas contra un programa c ++ y verificando los valores recibidos. un marco ayuda, ciertamente, pero no es una necesidad.
TZHX
3

Para jugar defensor de los demonios: ella tiene un punto. Por lo general lo pongo como:

Las pruebas automáticas resuelven los problemas de mucho código con aún más código.

Razón fundamental:

  • estudio sobre la correlación de la tasa de fallas y las métricas de OO , resultado principal: "Después de controlar el tamaño [de la clase], ninguna de las métricas que estudiamos se asociaron con la propensión a fallas" . (El estudio analiza el tamaño de la clase. ¿Este efecto se extiende al tamaño de la base del código? Probablemente, en mi opinión )
  • Empíricamente, los proyectos grandes tienden a avanzar lentamente. "5K líneas durante la noche en un nuevo proyecto" vs. "10 líneas / día en uno grande". ¿Eso indica una "resistencia" al cambio que aumenta con el tamaño de la base del código?
  • Siempre proclamamos "no hay mejor lenguaje, depende del problema". Un requisito clave es modelar fácilmente entidades y operaciones problemáticas en el idioma de elección. ¿No sugiere eso que elegir un idioma en el que expresar su problema es más complejo es peor , y eso no se correlaciona nuevamente con el tamaño final de la base de código?

Ahora, hay algunos argumentos para disparar contra eso fácilmente. Permítanme abordar los que se me ocurren:

  • tamaño versus simplicidad: por supuesto, es posible acortar y empeorar el código. Sin embargo, eso es solo un problema cuando se comparan bases de código con diferentes relaciones de brevedad vs simplicidad, para la discusión se puede suponer que de alguna manera podríamos controlar este factor.

  • Las pruebas unitarias lo presionan para reducir las dependencias, y estoy de acuerdo empíricamente en que reducir las dependencias puede mitigar los problemas de tamaño del código (en el sentido de que en dos bases de código de tamaño similar, la que tiene más interdependencias es peor). Sin embargo , al tiempo que reduce las dependencias entre las unidades de código de producción, introduce el acoplamiento entre la prueba y la unidad misma.


TL; DR: No creo que las pruebas unitarias sean malas; Pregunto: ¿hay un punto de equilibrio en el que las pruebas duelen que esté correlacionado con la cantidad de código?

Peterchen
fuente
2

Creo que estás en una posición difícil. He estado en un equipo donde la gente no escribiría pruebas unitarias, o peor, horribles pruebas unitarias no mantenibles. Pero todos sabían que las pruebas unitarias son buenas.

Por lo tanto, lograr que el conjunto de pruebas unitarias del equipo fuera de buena calidad fue un camino largo y difícil. Siempre en busca de dónde se podrían mejorar las cosas, comunicando ideas, compartiendo experiencias.

Por otro lado, tiene un desarrollador que ni siquiera se ha dado cuenta del beneficio. Y luego también codifica el código de espagueti. Supongo que una de las razones más importantes en este caso particular es el hecho de que escribir buenas pruebas unitarias obliga a un diseño débilmente acoplado. Por lo tanto, conseguir que escriba la prueba podría mejorar a la larga el código "real".

Pero creo que al final, es una decisión del equipo (¿No sé cuántos son ustedes en el equipo?). Si el equipo puede llegar a un consenso de que debería haber un conjunto de pruebas de unidad que cubra bien, entonces todos deben conformarse, compartir experiencias y dejar que su equipo crezca fuerte juntos.

Sin embargo, si el equipo no puede llegar a un consenso de que debería estar escribiendo pruebas unitarias, entonces sugiero que encuentre un equipo de desarrollo diferente para trabajar;)

Pete
fuente
2

¿Es ella la jefa?

Si es así ... está un poco atrapado a menos que pueda convencerla de los beneficios que básicamente se encuentran en la línea de "una onza de prevención vale una libra de cura". Los errores pasan. TDD ayuda a mitigar eso mediante la creación de resultados consistentes.

¿No es ella la jefa?

¿Cuáles son los estándares de codificación donde trabaja? ¿Por qué se le permite escupir código de espagueti? Presente un caso de negocios al jefe diciendo "Pasaremos MUCHO menos tiempo en los errores si pasamos un poco más de tiempo en TDD" Convencer a alguien que pueda imponer el cambio con un caso de negocios.

Documente casos en los que TDD podría haber ahorrado tiempo y $$ DINERO $$.

Este error se presentó solo. Habría sido atrapado antes de irse a vivir. Pasar 2 horas de prevención nos habría ahorrado 10 horas de cura. Ha sucedido aquí y aquí y aquí. Esas 10 horas de trabajo que le habrían ahorrado a la compañía 30 horas hombre. Eso es tanto dinero.

WernerCD
fuente
1
Intentar imponer pruebas unitarias desde arriba es como obligar a su cónyuge a comer más verduras. En el mejor de los casos, cumplirán de mala gana y volverán a sus viejos hábitos cuando deje de mirar. Trate mejor a los desarrolladores como adultos responsables y hágales saber que las pruebas unitarias son útiles.
nikie
1

Esto me deja en la posición de modificar algo

¿Por qué?

Ellos crearon el problema. Deberían resolverlo.

¿Qué gerente está permitiendo que esto suceda? ¿Por qué el código de error de otra persona es ahora tu problema?

Tienes un colega y un gerente que están haciendo que esto suceda. Y al limpiar su desorden, usted es un participante dispuesto y activo.

Nada cambiará si no sienten el dolor de la mala calidad.

S.Lott
fuente
> Crearon el problema => Deberían resolverlo. A veces las personas más cercanas al lienzo no pueden ver la imagen completa. Escribir una prueba unitaria estaría haciendo un poco de trabajo pero no necesariamente limpiando el trabajo de otros. Una oportunidad para liderar con el ejemplo.
JBRWilkinson
1
@JBRWilkinson: Si bien es cierto, y lo que hago a menudo, no afecta ningún cambio cultural. Si alguien se niega a hacer pruebas, existe una cultura que hace que esta negativa (a) sea posible y (b) se refuerce como buena conducta. Asumir silenciosamente la carga de arreglar el desorden de otra persona no solucionará las causas subyacentes.
S.Lott
Si bien estoy de acuerdo en que sería insostenible que los miembros del equipo simplemente produjeran códigos malos y cuenten con que otros se ocupen de su desorden, creo que es perjudicial adoptar una mentalidad de "si lo rompes, lo tienes". No desea que las personas tengan miedo de cambiar y mejorar el código. En cambio, concéntrese en difundir las buenas prácticas y cree un conjunto de pruebas de sonido. Entonces puede trabajar hacia una mentalidad más de "propiedad compartida". Es el código de todos. Todos lo arreglan, todos lo mejoran y se hacen responsables.
Sara
1

Ella tiene bastante razón, las pruebas unitarias son "más código".

Sin embargo, simplemente se debe escribir más código para asegurarse de que el programa funcione como debería (una y otra vez). No es tiempo perdido. Es tanto una parte del sistema como sus componentes principales.

Desafíala en:

  1. ¿Qué sucede si alguien que no está familiarizado con el código cambia algo?
  2. ¿Qué sucede si alguien que no tiene experiencia cambia algo?
  3. El costo de mantener un sistema no se mide en cuanto tiempo lleva crearlo. Es una propuesta a más largo plazo. Piensa en el costo total de propiedad.
  4. Su estimación (si fuera necesario antes de comenzar la codificación) debe incluir el requisito de escribir pruebas unitarias. Los empresarios no crean requisitos que requieran pruebas unitarias directamente, pero sí tienen un requisito implícito de calidad y requieren que los cambios futuros no estén plagados de errores o que el mismo programador cambie su fuente.
rupjones
fuente
No estoy seguro de comprar "es más código" así como así. Puede ser. Probablemente lo sea a menudo. Pero no tiene que ser así. Para empezar, un buen conjunto de pruebas les ayuda a ambos a escribir menos código (ya saben cuándo terminaron y pueden detenerse de inmediato) y les ayuda a refactorizar y minimizar el código con más frecuencia. Esto da como resultado muchas pruebas y no tanto código de producción, a diferencia de ninguna prueba y una gran cantidad de código de producción desordenado que nunca se limpiará.
Sara
1

Hablando como uno que actualmente hace código de producción, seguido de pruebas unitarias en lugar de TDD, lo que no parece encajar bien en mi lugar actual (he hecho TDD en algunos proyectos, pero lo veo como otra herramienta en la vieja bolsa, no una bala de plata) ...

Puede ser una venta difícil. Todavía no he podido vender a mis compañeros de trabajo en pruebas unitarias. Sé que tiendo a cometer muchos más errores en mi código de prueba de unidad que en mi código de producción. Por lo tanto, es un poco frustrante tener que pasar tanto tiempo arreglando el código de prueba de la unidad ... Sin embargo, es un buen seguro cuando se modifica el código. Gran manera de probar las condiciones de borde automáticamente.

Brian Knoblauch
fuente
1

Muéstrele cuánto ayudan las pruebas unitarias al crear pruebas unitarias usted mismo.

Como San Francisco dijo una vez: "Predica siempre. Cuando sea necesario, usa palabras".

Si ella ve que su código está usando pruebas unitarias, y que puede resolver errores más rápidamente con las pruebas unitarias, entonces puede cambiar de opinión. Pero, puede que no.

No importa el resultado, ella no te ve como empujándole algo que no estás dispuesto a hacer. Eso es lo que tienes que cambiar, la percepción de que no estás liderando con el ejemplo.

George Stocker
fuente