Los gurús de TDD nos dicen cada vez más que TDD no se trata de pruebas, sino de diseño . Así que conozco algunos desarrolladores que crean un diseño realmente excelente sin TDD. ¿Deberían practicar TDD entonces?
10
Los gurús de TDD nos dicen cada vez más que TDD no se trata de pruebas, sino de diseño . Así que conozco algunos desarrolladores que crean un diseño realmente excelente sin TDD. ¿Deberían practicar TDD entonces?
Respuestas:
TDD no solo me ayuda a llegar al mejor diseño final, sino que me ayuda a lograrlo en menos intentos.
Solía tener dos o tres puñaladas en un problema antes de decidir qué diseño creía que era mejor. Ahora, ese mismo tiempo lo paso escribiendo pruebas y enfocando mi mente en el diseño correcto. Y, como beneficio adicional, me deja con un conjunto de pruebas repetibles. ¡Ganar!
Dicho esto, inevitablemente habrá personas para quienes TDD no ofrece nada. Siempre que tengan pruebas automatizadas y repetibles al final, está bien.
fuente
forced
. No sé por qué las personas no se molestan con más frecuencia por la frecuencia de la palabra "forzado" como ocurre en las discusiones sobre TDD. Uno no debería necesitar ser forzado a diseñar algo correctamente; deben aprender cómo diseñar las cosas correctamente, y luego continuar a hacerlo sin ser obligado a hacerlo, sobre todo cuando ese acto de forzar es tan increíblemente mucho tiempo.Lo que este gurú de TDD en particular realmente está tratando de decir no es que TDD es un proceso de diseño (aunque desafortunadamente varias personas lo han interpretado de esa manera). El mensaje aquí es que el uso de un proceso como TDD, si lo hace bien , tenderá a mejorar su diseño general.
El concepto fundamental es mucho más antiguo que TDD; diseñando para la comprobabilidad . Si se adhiere rigurosamente a los principios SÓLIDOS , especialmente al Principio de responsabilidad única , encontrará que el código es muy fácil de probar. Por otro lado, si tiende a ser un poco más descuidado en su diseño, probablemente encontrará el proceso de escribir pruebas unitarias para obligarlo a hacer esto con más frecuencia, para evitar la frustración de (a) descubrir qué necesita ser probado y (b) pasar más tiempo configurando dependencias que escribiendo las pruebas reales.
Usted no tiene que seguir TDD para obtener los beneficios de esto, pero lo hace ayuda a escribir las pruebas principios - de preferencia muy pronto después de implementar una clase, si no antes o durante. Si espera demasiado, corre el riesgo de las pruebas de "híbrido sucio" de las que habla el autor, que no tienen mucho valor porque son frágiles y tienden a romperse durante la refactorización inofensiva, sin mencionar que se hacen más grandes -escala rediseña un proceso terriblemente difícil.
No puede saber si realmente está diseñando para la capacidad de prueba si no escribe pruebas, y las "pruebas de características" al azar con solo un 15% de cobertura de código no cuentan.
Por supuesto, puedes crear buenos diseños sin tener que escribir una sola prueba, pero ¿estás seguro de que son diseños geniales? ¿Cómo lo sabes, si no están claramente especificados por las pruebas? Las pruebas descubren muchos problemas y, si bien un proceso de control de calidad puede encontrar errores visibles, no descubrirán malas decisiones de diseño.
fuente
Respuesta simplista de alguien que se esfuerza por aprender TDD: no lo necesita , pero el principal beneficio que le brinda es, simplemente, confianza : confianza en que su aplicación funciona. Confianza en que los casos de uso están satisfechos. Confianza en que su lógica es sólida para el módulo "Foobar". Confianza en que su código está estructurado adecuadamente para ser mantenible y extensible seis meses más adelante cuando el CEO quiere agregar alguna nueva característica loca sobre la que leyó. Confianza en que, cuando su aplicación crezca, se han sentado las bases para que la arquitectura no se desmorone o requiera muchos trucos desordenados para armar nuevas funciones.
Me doy cuenta de que lo anterior sonaba un poco evangélico, pero así es como veo el beneficio de TDD. Incluso si puede crear diseños buenos, sólidos y bien diseñados utilizando TDD, obliga a su mano a hacer las cosas bien, y luego demuestra que las cosas se hacen bien, y lo más importante, proporciona una línea de base para mantener las cosas bien. Por lo poco que he incursionado en TDD, usarlo me obligó a limpiar el código y seguir los conceptos de ingeniería de software adecuados, donde de lo contrario haría lo "más rápido posible" que a menudo resultaba en un código "pirateo" desordenado.
fuente
Solo puedo hablar desde mi experiencia. Para mí, TDD trajo varias cosas que no tenía antes en mi caja de herramientas de hábitos de estilo de desarrollo. Sin embargo, vale la pena decir nuevamente que TDD no es la solución para todo. Siempre trato de separar la implementación de exploración y producción. TDD en la fase de exploración no es absolutamente necesario e incluso se está desacelerando. Por otro lado, para el código listo para producción, trae varios beneficios que a corto y largo plazo son muy valiosos para la salud mental de los desarrolladores y el karma del proyecto.
Hay una cosa que TDD no soluciona. Si no sabe cómo construir lo que está construyendo, entonces TDD no producirá una solución para usted. Debe tener un "diseño" general o una descripción general del problema y la solución. TDD hará que lo implemente de manera más elegante y fácil de mantener con el código de mayor calidad.
Por último, prefiero pensar en términos de BDD que se apoyan en las prácticas de TDD. BDD me obliga a implementar una solución utilizando el vocabulario del dominio y hacer que el software se adapte mejor al problema.
fuente
Puede haber muchas maneras de lograr un gran diseño, y hay indudablemente muchas interpretaciones diferentes de lo que constituye "excelente", o incluso "bueno". Sospecho que la mayoría de los TDDers no estarían de acuerdo con usted acerca de la definición: que si tuviéramos que ver el código que usted siente es excelente, lo consideraríamos menos que excelente. TDD nos lleva a algunas cualidades muy específicas, y estas cualidades rara vez se encuentran en el código no TDD.
La capacidad de prueba, obviamente, es una de esas cualidades, y la principal. Los métodos y clases extremadamente pequeños son quizás una subcaracterística, y esto lleva a una excelente nomenclatura. Quizás conoces a programadores que logran estas cualidades sin hacer TDD, pero yo no.
fuente