Si bien estoy a favor de las pruebas unitarias, a veces me pregunto si esta forma de desarrollo de la primera prueba es realmente beneficiosa ...
Pruebas pequeñas y triviales como esta pueden ser el "canario en la mina de carbón" para su código base, alertando del peligro antes de que sea demasiado tarde. Es útil mantener las pruebas triviales porque te ayudan a lograr las interacciones correctas.
Por ejemplo, piense en una prueba trivial implementada para investigar cómo usar una API con la que no está familiarizado. Si esa prueba tiene alguna relevancia para lo que estás haciendo en el código que usa la API "de verdad", es útil mantener esa prueba. Cuando la API lanza una nueva versión y necesita actualizar. Ahora tiene sus suposiciones sobre cómo espera que se comporte la API registradas en un formato ejecutable que puede usar para detectar regresiones.
... [En] un proceso real, tiene 3-4 capas por encima de su código (Solicitud comercial, Documento de requisitos, Documento de arquitectura), donde la regla comercial definida real (Precio de descuento es Precio - Descuento) podría estar mal definida. Si esa es la situación, su prueba unitaria no significa nada para usted.
Si ha estado codificando durante años sin escribir pruebas, es posible que no le resulte obvio de inmediato que tiene algún valor. Pero si tiene la mentalidad de que la mejor manera de trabajar es "lanzar temprano, lanzar con frecuencia" o "ágil" en el sentido de que desea la capacidad de implementar de forma rápida / continua, entonces su prueba definitivamente significa algo. La única forma de hacerlo es legitimando cada cambio que realice en el código con una prueba. No importa cuán pequeña sea la prueba, una vez que tenga un conjunto de pruebas ecológico, en teoría, podrá implementarlo. Consulte también "producción continua" y "beta perpetua".
No tiene que ser "primero la prueba" para tener esta mentalidad, pero esa es generalmente la forma más eficiente de llegar allí. Cuando haces TDD, te encierras en un pequeño ciclo de refactorización rojo verde de dos a tres minutos. En ningún momento no podrá detenerse e irse y tener un lío completo en sus manos que llevará una hora depurar y volver a armar.
Además, su prueba unitaria es otro punto de falla ...
Una prueba exitosa es aquella que demuestra una falla en el sistema. Una prueba fallida le alertará sobre un error en la lógica de la prueba o en la lógica de su sistema. El objetivo de sus pruebas es descifrar su código o demostrar que un escenario funciona.
Si está escribiendo pruebas después del código, corre el riesgo de escribir una prueba que sea "mala" porque para ver que su prueba realmente funciona, necesita verla rota y funcionando. Cuando estás escribiendo pruebas después del código, esto significa que tienes que "lanzar la trampa" e introducir un error en el código para que la prueba falle. La mayoría de los desarrolladores no solo están inquietos por esto, sino que dirían que es una pérdida de tiempo.
¿Qué ganamos aquí?
Definitivamente hay un beneficio en hacer las cosas de esta manera. Michael Feathers define "código heredado" como "código no probado". Cuando adoptas este enfoque, legitimas cada cambio que realizas en tu base de código. Es más riguroso que no usar pruebas, pero cuando se trata de mantener una base de código grande, se paga solo.
Hablando de plumas, hay dos excelentes recursos que debe consultar con respecto a esto:
Ambos explican cómo trabajar este tipo de prácticas y disciplinas en proyectos que no son "Greenfield". Proporcionan técnicas para escribir pruebas en torno a componentes estrechamente acoplados, dependencias cableadas y cosas sobre las que no necesariamente tiene control. Se trata de encontrar "costuras" y probarlas.
[Si] si el precio de descuento es incorrecto, el equipo de prueba aún encontrará el problema, ¿cómo las pruebas unitarias ahorraron trabajo?
Hábitos como estos son como una inversión. Las devoluciones no son inmediatas; se acumulan con el tiempo. La alternativa a no probar es esencialmente asumir la deuda de no poder detectar regresiones, introducir código sin temor a errores de integración o impulsar decisiones de diseño. La belleza es que legitimas cada cambio introducido en tu código base.
¿Que me estoy perdiendo aqui? Por favor, enséñeme a amar TDD, ya que me está costando aceptarlo como útil hasta ahora. Yo también quiero, porque quiero ser progresista, pero no tiene sentido para mí.
Lo veo como una responsabilidad profesional. Es un ideal por el que luchar. Pero es muy difícil de seguir y tedioso. Si le importa y siente que no debe producir código que no esté probado, podrá encontrar la fuerza de voluntad para aprender buenos hábitos de prueba. Una cosa que hago mucho ahora (al igual que otros) es marcarme una hora para escribir código sin ninguna prueba, y luego tener la disciplina para tirarlo a la basura. Esto puede parecer un desperdicio, pero en realidad no lo es. No es que el ejercicio le cueste materiales físicos a una empresa. Me ayudó a comprender el problema y cómo escribir código de tal manera que sea de mayor calidad y comprobable.
Mi consejo sería en última instancia que si realmente no tienes el deseo de ser bueno en eso, no lo hagas en absoluto. Las pruebas deficientes que no se mantienen, no funcionan bien, etc. pueden ser peores que no tener ninguna prueba. Es difícil de aprender por tu cuenta, y probablemente no te encantará, pero será casi imposible de aprender si no tienes el deseo de hacerlo o no puedes ver el valor suficiente para garantizan la inversión de tiempo.
Un par de personas siguen mencionando que las pruebas ayudan a hacer cumplir la especificación. Según mi experiencia, la especificación también ha sido incorrecta, la mayoría de las veces ...
El teclado de un desarrollador es donde la goma se encuentra con el camino. Si la especificación es incorrecta y no levanta la bandera, entonces es muy probable que lo culpen por ello. O al menos su código lo hará. Es difícil cumplir con la disciplina y el rigor que implican las pruebas. No es nada fácil. Requiere práctica, mucho aprendizaje y muchos errores. Pero finalmente vale la pena. En un proyecto de ritmo rápido y que cambia rápidamente, es la única forma en que puede dormir por la noche, sin importar si lo ralentiza.
Otra cosa en la que pensar aquí es que las técnicas que son fundamentalmente iguales a las pruebas han demostrado funcionar en el pasado: "sala limpia" y "diseño por contrato" tienden a producir los mismos tipos de construcciones de "meta" código que las pruebas hacen, y las hacen cumplir en diferentes puntos. Ninguna de estas técnicas es una fórmula mágica y, en última instancia, el rigor le costará en el alcance de las funciones que puede ofrecer en términos de tiempo de comercialización. Pero no se trata de eso. Se trata de poder mantener lo que entregas. Y eso es muy importante para la mayoría de los proyectos.