¿Siempre haces TDD?

Crecí sin TDD en absoluto, y solo en los últimos meses tuve que usarlo. Realmente no me gusta, aunque, me apresuro a agregar, veo la necesidad de alguna forma. Estoy de acuerdo con la automatización de pruebas en general: simplemente no me gustan las pruebas que “impulsan” el desarrollo al forzar ciertos patrones de desarrollo, como la inyección de dependencia, que considero pura maldad. Estoy abierto a la educación sobre esto, pero por lo que veo, realmente no me gusta. Entiendo los riesgos del (cierto tipo de) acoplamiento, pero creo que la cura DI es peor que la enfermedad en muchos casos.

Sé lo que es soportar bases de código complejas y grandes durante años a la vez, y el temor progresivo del cambio que ocurre a medida que los proyectos se hacen cada vez más grandes hasta el punto de ser demasiado difíciles de administrar: el cambio se vuelve demasiado arriesgado. Esta es la razón principal para tener una buena automatización de pruebas, de modo que las implementaciones sean “aburridas” y haya poca o ninguna posibilidad de regresión. Pero como digo, me parece que TDD agrega complejidad (en forma de inyección de dependencia) junto con cierto fervor dogmático al respecto. La complejidad y el dogmatismo son el enemigo, en lo que a mí respecta.

El otro gran problema con TDD, en mi opinión, es que es demasiado fácil escribir pruebas que siempre pasan, que realmente no cubren lo que crees que están cubriendo. Cuando pienso en lo que salió mal en mis cosas a lo largo de los años, el 96% del tiempo es directamente “algo que yo (y los BA con los que trabajo) nunca esperé”, algo extraño que un cliente hizo en sus datos. Siendo realistas, nunca podría haber escrito una prueba para anticiparlo. El 3% de las veces, tengo problemas con la fusión y promoción del código fuente entre sucursales. El 1% de las veces realmente me he olvidado de hacer algo, y es un huevo en mi cara. En pocas palabras, cuando miro errores y fallas de la manera más amplia, no veo cómo TDD habría ayudado la mayor parte del tiempo.

Lo que me gustaría ver en el mundo de la automatización de pruebas es más ayuda de los IDE que generan código de prueba, por ejemplo, inspección automática o aislamiento de SQL en línea. Me gustaría ver modelos económicos o abreviados de las interacciones del navegador del usuario final (es decir, Selenium). En otras palabras, proporcione una manera fácil de simular la interacción del usuario con páginas web en vivo. Hay herramientas para esto, por supuesto, pero no son convencionales (en mi experiencia), y aún requieren una gran inversión. No me gusta ver pruebas para las pruebas de sake que simplemente agregan “cobertura” sin modelar un escenario de falla realista.

El problema con TDD es que el énfasis está en escribir pruebas y luego pasar las pruebas. Entonces, lo que logrará es escribir exámenes y aprobar sus propios exámenes. Esto realmente no hace mucho, excepto enfatizar su capacidad para escribir exámenes y luego aprobarlos.

Es mucho más importante crear una arquitectura decente en la que colgar su código, mantener su código ajustado, modular y sin apretar, escribir código que se depure fácilmente. Si se hace correctamente, un módulo se puede refactorizar sin mucho efecto para el resto del sistema.

Cuando se concentra en crear y aprobar pruebas, su código crece orgánicamente con cada prueba aprobada, y la arquitectura se ignora con demasiada frecuencia. Entonces, terminas con un desorden espaguetizado. Eso pasa un montón de pruebas.

Las pruebas unitarias tienen sus usos, pero en mi experiencia, paso mucho más tiempo arreglando pruebas rotas que el tiempo ahorrado por la detección temprana de un defecto. No es un gran fan.

No, la mayoría de las veces hago software de escritorio, y los errores que tiendes a conseguir allí no son comprobables en el sentido de tener una función / método y poner entradas, obtener las salidas esperadas, y todos dan el visto bueno, muchos movimientos de manos y golpes de espalda.

En general, los errores serán una mezcla de muchos factores combinados, y a menudo serán cosas que simplemente no están del todo bien. No estoy hablando de la alineación de los iconos, estoy hablando más sobre el comportamiento y los comportamientos superpuestos.

Usted actualiza y obtiene un parpadeo, o tal vez se desvanece una cosa y otra, y la combinación se ve mal. Quizás llene una tabla de forma asincrónica, pero quedan datos antiguos, pero eso solo sucede en una conexión lenta, ese tipo de cosas.

Hice una cantidad muy pequeña de TDD antes de saber que tenía un nombre cuando estaba haciendo algunas cosas en el servidor y puedo crear / verificar claves HMAC o algo así.

En general, sin embargo, no hago TDD.

Cuando creo algo realmente nuevo, casi siempre trato de hacer TDD. Sin embargo, cuando trabajo con código heredado o cuando tengo que corregir un error crítico en el código de producción, puedo crear pruebas limitadas o no automatizadas.

El código heredado que se escribió sin buenas pruebas (o cualquier prueba) puede ser difícil o casi imposible de probar sin refactorizar. El gasto de hacer eso puede no ser justificable. Dependiendo de los cambios realizados, el nuevo código puede depender demasiado del código heredado.

En la situación crítica del error, simplemente puede que no haya tiempo suficiente para hacer otra cosa que arreglar el error y cualquier prueba que se solucione (con suerte pocos o ninguno).

¿Siempre? No. mayormente? Si.

Las raras veces que no lo hago es porque no planeo soportar el software. Tal vez sea un script único para analizar un registro para responder una pregunta muy específica. O tal vez solo estoy tratando de demostrar un punto “el jvm será más rápido en este caso”. Una vez que mi punto ha sido comprobado (o no), arrojaré una forma del ‘pico’ y lo construiré de verdad.

Para todo lo demás, escribir la prueba es cómo sé que lo que estoy escribiendo funciona y cómo documento su uso. He escrito suficiente software con y sin eso, estoy seguro de que el tiempo dedicado a escribir pruebas unitarias no es una pérdida de tiempo. Puede retrasar el desarrollo inicial, pero esto está más que compensado en las fases de diseño, mantenimiento y mejora.

No siempre puedes hacer TDD … pero en el poco tiempo que he estado en la industria aprendí que incluso los métodos que parecen los más simples a veces no funcionan debido a un pequeño error molesto …

¡Así que recomiendo escribir pruebas (usando TDD / BDD) tanto como sea posible!

Solía ​​hacerlo cuando me enteré de las pruebas y me estaba acostumbrando. Pero con el tiempo noté que hacer TDD había cambiado mi forma de pensar sobre mi código y cómo organizo las cosas.

Todavía escribo pruebas y hago control de calidad automatizado, sería estúpido no hacerlo. Pero descubrí que incluso cuando no me adhiero a TDD estricto, todavía termino con un código comprobable. La razón es que TDD me ayudó a aprender a pensar de una manera más comprobable y modular. Para mí, ese es el mayor beneficio de alguien que no está familiarizado con las pruebas que realizan TDD.

Depende del mercado en el que esté trabajando y de las fases del desarrollo del producto.

Muy raramente hago TDD en el negocio de desarrollo de videojuegos.

Estoy tan decepcionado en tdd! Tuve algunos proyectos donde el cliente dijo que es un requisito. Tomó el doble del tiempo habitual!