2009-05-27 12 views
7

Permítanme salir del armario. Soy un creyente TDD. Intento practicar el desarrollo impulsado por pruebas tanto como pueda.¿Cuál es el mejor argumento para convencer a los desarrolladores para que aprendan TDD?

Algunos desarrolladores en mi trabajo se niegan incluso a intentarlo. Yo mismo comencé a TDD tratando de demostrarle a uno de mis compañeros que Test Driven Development es una mala idea. Los argumentos son:

  • ¿Por qué? Fui desarrollador bastante exitoso hasta ahora.
  • Me va a retrasar.

¿Cuál es el mejor argumento pro TDD que oí o usé?


Consulte también:What is the best reason for unit testing?

+0

es posible que desee utilizar la frase completa 'desarrollo impulsado por pruebas' en algún lugar de su pregunta. – Jherico

+1

o, de hecho, diseño impulsado por prueba ... –

+3

Es importante señalar que la pregunta es sobre desarrollo/diseño impulsado por prueba, no simplemente pruebas unitarias. Las respuestas que simplemente abordan las pruebas unitarias están perdiendo sentido, creo. Mucha gente (probablemente la mayoría) que prueba la unidad no compra en TDD. – Chuck

Respuesta

15

TDD es una compensación "pagueme ahora o pague después". Si solo cuenta el tiempo desde el inicio de la codificación hasta el registro de su código, TDD generalmente toma más tiempo, especialmente cuando primero aprende TDD. El pago viene más tarde durante la fase de prueba, y también en futuras rondas de codificación.

Para la fase de pruebas, descubrí que con TDD:

  1. que tenía substancialmente menos errores. Mi último código TDD tuve errores solo debido a malentendidos (o cambios) de los requisitos o en las áreas donde no pude poner el código bajo prueba (código PHP en ese caso).
  2. Los errores que tenía eran generalmente más fáciles de reproducir bajo prueba, porque ya había probado el sistema.
  3. La solución de los errores fue más rápida, y con las pruebas podría tener una mayor creencia de que no introduje nuevos errores.

El código en sí tenía las siguientes propiedades:

  1. Como empecé a pensar como un cliente del código, el código tendían a ser más fácil de usar. (Este es uno de los beneficios de escribir pruebas primero).

  2. El código es más fácil de probar.

  3. Escribir pruebas de unidad es más fácil (y en muchos casos más divertido) justo antes que después, por lo que se escriben más pruebas.

  4. El código es más fácil de refactorizar y limpiar. Esto fue particularmente cierto con Python, donde las herramientas de refactorización automáticas tienen más dificultades.

Debido a eso, cuando llegó el momento de volver a examinar el código, era más fácil de entender y fácil de cambiar, y además teníamos al menos algunas pruebas de regresión ya en su lugar.

Lo que esto significa es que la amortización del tiempo TDD puede ser meses posterior. Además, iniciar TDD con código heredado es particularmente difícil. Luego, se necesita tiempo para aprender a escribir buenas pruebas (un conjunto de pruebas incorrecto puede ser insuficiente o peor, ser frágil y dificultar, no hacer las refactorizaciones) y cómo probar un sistema complejo.

Tengo que admitir que no he sido capaz de conseguir que muchas otras personas cambien a TDD.Creo que cambié en gran medida porque quería una forma más sencilla de prueba y también tuve la oportunidad de aprender cómo con una pequeña base de código y un proyecto personal.

+0

Me gustan las "cuatro propiedades" que ha mencionado. Son más o menos lo que he visto ... especialmente el hecho de que el código resultante resultó ser más fácil de usar. – StudioEvoque

+0

He manejado el aspecto del código heredado escribiendo código de prueba que también se puede vincular con el ejecutable. La desventaja es que debe "asumir" que el resto del sistema está funcionando correctamente, y luego solo usa TDD para su "nuevo código". –

1

Los argumentos que se enumeran no son argumentos racionales y lógicos. No tienen razonamiento detrás de ellos (a menos que usted haya resumido argumentos reales mucho más largos)

Como tal, no creo que pueda convencer a nadie que haga esas afirmaciones con argumentos racionales propios . La mejor manera será apelar a la fuente de sus argumentos; experiencia. O haz que usen TDD por un tiempo de manera provisional para ver qué piensan de él, o si no, hazlo tú mismo, que es claramente un trabajo muy bueno, y preséntalo como un ejemplo para ellos.

(no soy un creyente TDD. Esta es una manera práctica que podría convencerme de que era una buena idea.)

20

Ninguna cantidad de argumento será convencer a nadie a utilizar TDD.

Tienes que MOSTRARlas y demostrar los beneficios. Es más fácil hacer que la luz de alguien se encienda mostrando más que diciendo.

+9

+1 a Mitch. Esto no es un ejercicio de filosofía, es desarrollo de software. Si no puede mostrar los beneficios, tal vez no existan. Y si puede, y sus consejos son ignorados, puede tener problemas mayores que convencer a la gente para que adopte TDD. – micahtan

+2

Aunque no estoy en el barco TDD, estoy totalmente de acuerdo con el valor del ejemplo personal. Mostrando los comentarios de un hilo de stackoverflow y pidiéndoles a tus compañeros de equipo que cambien a TDD en función de eso obtendrán el OP como una bien merecida bota :) –

+0

¡Esto debe ser cierto! porque no usamos TDD y personalmente todavía no estoy convencido. Todavía leo los hilos para ver si puedo obtener alguna información. Usamos mucho la generación de código, y descubrimos que gastar el tiempo manteniendo eso reduce mucho trabajo futuro y muchos errores, en algunos casos, soluciona muchos errores de una vez. ¿No estoy seguro de si vale la pena escribir el código de prueba generado? –

0

Como desarrollador profesional durante más de 10 años, el mejor argumento que puedo presentar es que incluso encontré mis errores antes de llegar a un punto de poder "ejecutar" la aplicación.

También encontré que el diseño de mi código era más robusto y fácil de cambiar, y me dio más confianza para refactorizar.

"Bastante exitoso" no es igual a "Muy exitoso".

La otra gran ventaja es que ya no tengo que escribir arneses de prueba ya que los correctores de pruebas unitarias se convierten en mi arnés de prueba.

+0

David, las razones que ha enumerado son definitivamente válidas. Sin embargo, estas son ventajas de las pruebas unitarias y no específicas de TDD. –

+0

La prueba unitaria es diferente de crear una prueba antes de escribir. Si bien dos de cada tres pruebas de unidades pueden ser posibles, el "DISEÑO DE MI CÓDIGO" no es el resultado de las Pruebas Unitarias, sino un enfoque más TDD para construir la prueba antes de escribir el código. –

0

Muéstreles esta presentación. Me vendió.

http://www.slideshare.net/sebastian_bergmann/testing-with-phpunit-and-selenium-156187

Cualquier programador que jamás se ha enfrentado a una tarea muy compleja con una gran cantidad de condiciones de borde debe ser capaz de ver el valor de TDD. Cuando se trata de algo así como asegurarse de que un motor de búsqueda coincida con ciertas cadenas, TDD es la única forma en que podrá mantenerse sano durante el mantenimiento: la única manera de asegurarse de haber solucionado un caso sin afectar a otros. es con pruebas automatizadas.

+1

Estoy de acuerdo en que las pruebas automatizadas son muy útiles cuando se diseñan sistemas complicados como ese con resultados que se pueden evaluar objetivamente (lo siento, no he visto su presentación, espero no estarme perdiendo contexto), pero eso no es realmente prueba el desarrollo impulsado, ¿verdad? Eso es solo prueba. El desarrollo basado en pruebas implicaría probar ambos sistemas y todos los más simples también. – mquander

+0

Estoy de acuerdo con mquander. En mi experiencia, he podido convencer a las personas que nunca han visto pruebas unitarias antes de que adopten pruebas unitarias en pocos días. Sin embargo, no he tenido suerte para convencerlos de que cambien a TDD. TDD es un cambio total en la forma en que enfocas la codificación. Además, muchos programadores consideran que el código de prueba es de ciudadanos de tercera clase. La idea de comenzar con las pruebas? Eso es demasiado loco :) –

3

Diferentes personas estarán convencidas (o no) de diferentes maneras, por lo que la única respuesta honesta es "depende".

Una de las formas en que he visto trabajar varias veces es sentarte con alguien después de que han estado luchando con un trozo de código, y recrearlo usando TDD. El código resultante suele ser más pequeño y más claro.

3

No practico TDD. Aunque veo que es bueno si tiene proyectos complejos en los que tiene muchos casos de prueba diferentes para probar, no veo un gran beneficio al usarlo, por ejemplo, en una aplicación web simple.

Una forma en que alguien podría convencerme de usar TDD sería si tomamos el mismo proyecto y lo hicimos uno al lado del otro, vea quién ofrece mejores resultados y quién completa la tarea más rápido.

31

Quizás ellos sepan mejor.

Prueba de la unidad por los desarrolladores es una práctica extremadamente útil y no se puede exagerar sus beneficios, no sólo durante el desarrollo inicial, sino también durante la refactorización cuando las pruebas unitarias pueden coger temprano no sólo defectos de código ordinaria, sino también a la ruptura de las suposiciones hechas por desarrolladores que nunca fueron capturados en la documentación formal y, por lo tanto, es probable que se pierdan cuando se produce la refactorización.

Dicho esto, TDD no es polvo de hadas mágico:

  1. la 'acaba de escribir código suficiente para pasar la prueba' enfoque da falsos positivos. A menudo se conocen falacias y problemas que el enfoque "lo suficiente" no aborda. Los ejemplos rápidos que se me ocurren son distributed systems fallacies o problemas de rendimiento NUMA. Simplemente capturando esos requisitos en simplemente expresando esos casos de prueba para TDD se convertirían en un trabajo de tiempo completo en sí mismo.
  2. la explosión de moqs se sale de control para cualquier proyecto de tamaño serio. los simulacros son como cualquier otro código, deben mantenerse y simplemente no se escriben de la nada.
  3. TDD se usa a menudo como una excusa para eliminar las pruebas de control de calidad. 'nuestro desarrollador ya ha escrito la identificación de prueba, vamos a enviarlo' descuida por completo las pruebas orientadas a funciones de extremo a extremo QA debe cubrir
  4. No confío en el zorro que vigila la gallinero. Un algoritmo erróneo aún puede pasar el TDD con gran éxito si se cometen los mismos errores tanto en la prueba como en la implementación.
  5. Todas las metodologías al final intentan utilizar el proceso para sustituir el talento.

Mi pelea principal con TDD es que se presenta como una solución mágica para la mayoría de los problemas de desarrollo, pero su costo se mantiene debajo de la mesa por sus defensores. Duplicar o triplicar su base de código con moqs no es gratis. Prefiero ver algunas pruebas integrales de unidades escritas durante el desarrollo. El enfoque TDD de prueba primero, todavía no veo sus beneficios en un proyecto de tamaño real.

entiendo que estaré huevo de opinión a la muerte ahora para publicar esto, pero por qué no, a quién le importa ...

+1

De acuerdo. Las balas de plata no existen. –

+3

De acuerdo. Pero escribir primero una prueba lo obliga a usted (el desarrollador) a pensar cómo se consumirá su código/API/biblioteca/lo que sea. Deja de pensar en los detalles internos y comienza a pensar en cómo se usará. Esto conduce a interfaces más limpias y códigos más útiles. –

+1

Es cierto. Debes escribir pruebas para la interfaz de "puerta pública" de tu componente, y así podrás comer tu propia comida para perros en el proceso, y con suerte terminar con una interfaz que los humanos realmente puedan usar. ¿TDD es la única forma de lograr esto? ¿La adopción de TDD garantizará este resultado? –

2

par con ellos. No tiene que llamarlo "programación de pares", es aterrador para alguien que es reacio incluso a considerar técnicas "radicales" como TDD, pero si los dos se sientan en un escritorio y trabajan juntos en el mismo problema, es fácil demostrar el valor de TDD. Ese no puede ser el final de la conversación, pero es un gran comienzo. Le da credibilidad para el resto de la conversación y le brinda algo real como base para una discusión posterior.

0

Las pruebas exhaustivas de la unidad reducen las ocurrencias de errores, pero también reducen la recidiva o el alcance del daño causado por la recidiva.

2

El momento "aha" para mí fue leer el capítulo 2 de "Test-Driven Development en Microsoft.Net" por James Newkirk. (No es que el resto del libro no fuera importante ... dedica varios capítulos a crear una aplicación de varios niveles en TDD).

Construye una pila simple, pero se ve que el código "evoluciona" su complejidad en lugar de comenzar complejo.

Incluso entonces, todavía tendrá problemas para convencer a los que no lo hacen porque parece que TDD requiere mucho más trabajo que la programación tradicional. La mayoría de los desarrolladores anti-TDD, sin embargo, se olvidan de tener en cuenta el tiempo de desarrollo para las pruebas unitarias al final, al menos en mi experiencia.

Cuestiones relacionadas