TDD 2
TDD 2
Unica Responsabilidad
11
y demas
principios.
El propio Fowler escribio uno de los libros mas grandes de la literatura
tecnica moderna[7] en el que se describen las refactorizaciones mas comunes.
Cada una de ellas es como una receta de cocina. Dadas unas precondiciones,
se aplican unos determinados cambios que mejoran el dise no del softwa-
re mientras que su comportamiento sigue siendo el mismo. Mejora es una
palabra ciertamente subjetiva, por lo que empleamos la metrica del codigo
duplicado como parametro de calidad. Si no existe codigo duplicado, enton-
ces hemos conseguido uno de mas calidad que el que presentaba duplicidad.
Mas alla de la duplicidad, durante la refactorizacion podemos permitirnos
darle una vuelta de tuerca al codigo para hacerlo mas claro y facil de man-
tener. Eso ya depende del conocimiento y la experiencia de cada uno. Los
IDE como Eclipse, Netbeans o VisualStudio, son capaces de llevar a cabo
las refactorizaciones mas comunes. Basta con se nalar un bloque de codigo
y elegir la refactorizacion Extraer-Metodo, Extraer-Clase, Pull-up, Pull-down
o cualquiera de las muchas disponibles. El IDE modica el codigo por noso-
tros, asegurandonos que no se cometen errores en la transicion. Al margen de
estas refactorizaciones, existen otras mas complejas que tienen que ver con
la maestra del desarrollador y que a veces recuerdan al mago sacando un
conejo de la chistera. Algunas de ellas tienen nombre y estan catalogadas a
modo de patron y otras son anonimas pero igualmente eliminan la duplicidad.
Cualquier cambio en los adentros del codigo, que mantenga su API p ubli-
ca, es una refactorizacion. La clave de una buena refactorizacion es hacerlo
en pasitos muy peque nos. Se hace un cambio, se ejecutan todos los tests
10
http://www.refactoring.com/
11
Ver Captulo7 en la pagina 111
58
Captulo 2 2.1. El algoritmo TDD
y, si todo sigue funcionando, se hace otro peque no cambio. Cuando refac-
torizamos, pensamos en global, contemplamos la perspectiva general, pero
actuamos en local. Es el momento de detectar malos olores y eliminarlos. El
verbo refactorizar no existe como tal en la Real Academia Espa nola pero, tras
discutirlo en la red, nos resulta la mejor traduccion del termino refactoring.
La tarea de buscar y eliminar codigo duplicado despues de haber completado
los dos pasos anteriores, es la que mas tiende a olvidarse. Es com un entrar en
la dinamica de escribir el test, luego el SUT, y as sucesivamente olvidando
la refactorizacion. Si de las tres etapas que tiene el algoritmo TDD dejamos
atras una, logicamente no estamos practicando TDD sino otra cosa.
Otra forma de enumerar las tres fases del ciclo es:
Rojo
Verde
Refactorizar
Es una descripcion metaforica ya que los frameworks de tests suelen colorear
en rojo aquellas especicaciones que no se cumplen y en verde las que lo
hacen. As, cuando escribimos el test, el primer color es rojo porque todava
no existe codigo que implemente el requisito. Una vez implementado, se pasa
a verde.
Cuando hemos dado los tres pasos de la especicacion que nos ocupa,
tomamos la siguiente y volvemos a repetirlos. Parece demasiado simple, la
reaccion de los asistentes a mis cursos es mayoritariamente incredula y es
que el efecto TDD solo se percibe cuando se practica. Me gusta decir que
tiene una similitud con un buen vino; la primera vez que se prueba el vino en
la vida, no gusta a nadie, pero a fuerza de repetir se convierte en un placer
para los sentidos. Connotaciones alcoholicas a un lado, espero que se capte
el mensaje.
Y TDD sirve para proyectos grandes? Un proyecto grande no es sino la
agrupacion de peque nos subproyectos y es ahora cuando toca aplicar aquello
de divide y venceras. El tama no del proyecto no guarda relacion con la
aplicabilidad de TDD. La clave esta en saber dividir, en saber priorizar. De
ah la ayuda de Scrum para gestionar adecuadamente el backlog del producto.
Por eso tanta gente combina XP y Scrum. Todava no he encontrado ning un
proyecto en el que se desaconseje aplicar TDD.
En la segunda parte del libro se expondra el algoritmo TDD mediante
ejemplos practicos, donde iremos de menos a mas, iterando progresivamente.
No se preocupe si no lo ve del todo claro ahora.
59
2.2. Consideraciones y recomendaciones Captulo 2
2.2. Consideraciones y recomendaciones
2.2.1. Ventajas del desarrollador experto frente al junior
Existe la leyenda de que TDD unicamente es valido para personal alta-
mente cualicado y con muchsima experiencia. Dista de la realidad; TDD es
bueno para todos los individuos y en todos los proyectos. Eso s, hay algunos
matices. La diferencia entre el desarrollador experimentado que se sienta a
hacer TDD y el junior, es como enfocan los tests, es decir, que tests escriben;
mas alla del codigo que escriben. El experto en dise no orientado a objetos
buscara un test que fuerce al SUT a tener una estructura o una API que
sabe que le dara buenos resultados en terminos de legibilidad y reusabilidad.
Un experto es capaz de anticipar futuros casos de uso y futuros problemas
y sera mas cuidadoso dise nando la API test tras test, aplicando las buenas
practicas que conoce. El junior probablemente se siente a escribir lo que mejor
le parece, sin saber que la solucion que elige quizas le traiga quebraderos de
cabeza mas adelante. La ventaja es que, cuando se de cuenta de que su dise no
tiene puntos a mejorar y empiece a refactorizar, contara con un importantsi-
mo respaldo detras en forma de batera de tests. Por poco experimentado
que sea, se cuidara de no dise nar una API que le resulte casi imposible de
usar. Debe tenerse en cuenta que se supone que el principiante no esta so-
lo, sino que en un contexto XP, hay desarrolladores de mas experiencia que
supervisaran y habra momentos en los que se programe en parejas. La gura
de los lderes es importante en XP al igual que en otras metodologas, con la
gran diferencia de que el lder agil esta para responder preguntas y ayudar a
los demas y no para darles latigo. El lder debe intentar que las personas que
trabajan con el esten contentas de trabajar ah y quieran seguir haciendolo.
2.2.2. TDD con una tecnologa desconocida
La primera vez que usamos una determinada tecnologa o incluso una
nueva librera, es complicado que podamos escribir la especicacion antes
que el SUT, porque no sabemos las limitaciones y fortalezas que ofrece la
nueva herramienta. En estos casos, XP habla de spikes (disculpen que no lo
traduzca, no sabra como) .Un spike es un peque no programa que se escri-
be para indagar en la herramienta, explorando su funcionalidad. Es hacerse
alguna funcion o alguna aplicacion peque na que nos aporte el conocimiento
que no tenemos. Si el spike es peque no, y resulta que nos damos cuenta
que su propio codigo es valido tal cual, entonces escribiremos el test justo a
continuacion, en lugar de dejarlo sin test. Sin un conocimiento basico de la
API y las restricciones del sistema, no recomendara lanzarse a escribir espe-
cicaciones. Hay que respetar el tiempo de aprendizaje con la herramienta y
60
Captulo 2 2.2. Consideraciones y recomendaciones
avanzar una vez que tengamos conanza con ella. Intentar practicar TDD en
un entorno desconocido es, a mi parecer, un antipatron poco documentado.
Tampoco es que descartemos forzosamente TDD, sino que primero tendre-
mos que aprender a pilotar la maquina. Una vez sepamos si es de cambio
manual o automatico, donde se encienden las luces y donde se activa el lim-
pia parabrisas, podremos echar a rodar. Es solo cuestion de aplicar el sentido
com un, primero aprendemos a usar la herramienta y luego la usamos. Tene-
mos que evitar algo que pasa muy frecuentemente, minusvalorar el riesgo de
no dominar las herramientas (y frameworks y lenguajes...)
2.2.3. TDD en medio de un proyecto
En la segunda parte del libro, la de los ejemplos practicos, iniciamos el
desarrollo de una aplicacion desde cero. Igual que hacemos en los cursos que
imparto. La pregunta de los asistentes aparece antes o despues: no se puede
aplicar TDD en un proyecto que ya esta parcialmente implementado? Claro
que se puede, aunque con mas consideraciones en juego. Para los nuevos
requisitos de la aplicacion, es decir, aquello que todava falta por implemen-
tar, podremos aplicar eso de escribir el test primero y luego el codigo (y
despues refactorizar!). Es probable que el nuevo SUT colabore con partes
legadas que no permiten la inyeccion de dependencias y que no cumplen una
unica responsabilidad
12
; codigo legado que nos diculta su reutilizacion. El
libro mas recomendado por todos en los ultimos tiempos sobre este asun-
to es, Working Eectively with Legacy Code de Michael C. Feathers[6].
Tratar con codigo legado no es moco de pavo. En general, por c odigo le-
gado entendemos que se trata de aquel que no tiene tests de ning un tipo.
Mi recomendacion, antes de ponerse a reescribir partes de codigo legado, es
crear tests de sistema (y cuando el codigo lo permita, tests unitarios) que
minimicen los posibles efectos colaterales de la reescritura. Si es una web,
por ejemplo, agarrar Selenium o similar y grabar todos los posibles usos de
la interfaz graca para poderlos reproducir despues de las modicaciones y
comprobar que todo el sistema se sigue comportando de la misma manera.
Es un esfuerzo de usar y tirar porque estos tests son tremendamente fragiles,
pero es mucho mas seguro que lanzarse a reescribir alegremente. La siguiente
recomendacion es que la nueva API y la vieja convivan durante un tiempo,
en lugar de reescribir eliminando la version legada. Ademas de tener dos API
podemos sobrecargar metodos para intentar que el codigo legado y su nueva
version convivan, si es que la API antigua nos sigue sirviendo. Viene siendo
cuestion de aplicar el sentido com un y recordar la ley de Murphy; Si puede
salir mal, saldra mal. Otra alternativa para hacer TDD con c odigo nuevo
12
Ver Captulo 7 en la pagina 111
61
2.2. Consideraciones y recomendaciones Captulo 2
que colabora con codigo legado es abusar de los objetos mock
13
. Digamos
que los tests van a ser mas fragiles de lo que deberan pero es mejor usar
paracadas que saltar sin nada. Y por supuesto, si el nuevo codigo es mas
independiente, podemos seguir haciendo TDD sin ning un problema. Se lo
recomiendo encarecidamente.
13
Los veremos en el Captulo 6 en la pagina 95
62