Soy un tipo raro, lo admito, en mi afán de disfrute decidí comprobar si mi nuevo dispositivo, bonito donde los hubiera, era sumergible, más aún, sumergible en salfumán, que uno nunca sabe qué líquidos pueden llegar a derramarse sobre tales aparatos. Para mi sorpresa, desde que hice la prueba, el móvil ya no se enciende, de hecho no tiene ni teclas, espero que lo ocurrido esté cubierto por la garantía...
De mi disgusto saco una conclusión: probar es normalmente mucho más fácil que fabricar. Debí haber comprado un modelo previamente probado y diseñado para resistir el salfumán. Y digo probado antes de diseñado pues imagino que esas cosas se deben hacer así, uno supone que lo que va a fabricar soporta las pruebas, así que diseña la prueba, la lanza sobre el primer intento y, casi con total seguridad: falla, modifica lo que tiene y vuelve a probar. De las pruebas exitosas sucesivas gradualmente emerge un diseño cuya calidad está avalada por las pruebas realizadas, mire usted qué cosas.
En general, podemos afirmar que en en la mayoría de casos:
Complejidad(Prueba) < Complejidad( Funcionalidad )
Gracias a que las pruebas son lo primero que se tiene en cuenta, el diseño se irá acomodando a superarlas, esto lo denominaremos diseño evolutivo. Pero un diseño que supera las pruebas puede no ser de buena calidad, eso complicará mucho los diseños y mantenimientos futuros. La solución a esta situación proviene de, una vez superada una prueba, mejorar la calidad lo máximo posible y volver a pasar la prueba, de forma que el diseño evolutivo se asiente en diseños previos de alta calidad. A esta etapa la denominaremos refactorización, tema en el que profundizaremos... tanto o más que mi móvil en salfumán.
Por ahora quedémonos con la síntesis de cómo se deben llevar a cabo las cosas al decidir trabajar con orientación a las pruebas:
Primero las pruebas, diseño evolutivo, automatización de tests, y refactorización sin piedad.
Lo de "sin piedad" suena a poderoso ¿verdad? Este tipo de frases es común en este tema que acontece: TDD.