Académique Documents
Professionnel Documents
Culture Documents
160
161
162
aserciones. Estos tests nos conducen al concepto de cobertura de
cdigo que ya se ha mencionado.
Qu nos aporta
Si pensamos en las ventajas de tener un cdigo con unit testing, surge
inmediatamente el concepto de cobertura de cdigo como ya se ha apuntado.
Un cdigo con cobertura del 100% significa que existe un test unitario
que provoca la ejecucin de esa lnea de cdigo; No obstante ,conseguir
una cobertura del 100% es complicado y muchas veces lleva ms tiempo
de lo que pudiramos obtener como beneficio.
Las partes ms sensibles del cdigo deberan estar cubiertas al
mximo, mientras que POJOs (objetos simples), cdigo generado
por plugins, etc., no es tan necesario que lo estn. Tener una lnea cubierta
no slo sirve para aumentar un nmero y cumplir con hitos o que el
Jenkins (herramienta de integracin continua) tenga un color verde;
significa que si alguna vez la ejecucin del programa pasa por esa lnea, no
nos encontraremos el tpico problema de ejecucin en live que provoque
un error no controlado. Si hacemos un refactor y muchos tests prueban
diferentes patrones de comportamiento de ese cdigo, estaremos seguros
de que el refactor ha sido exitoso.
Con una amplia cobertura de cdigo y con test unitarios, la seguridad
a la hora de hacer cambios o refactors es mucho mayor: tenemos la
seguridad de que nuestros tests probarn los cambios. Ms an, cuando el
nmero de lneas suben, existirn ms tests y casos que siempre se olvidan
quedarn cubiertos sin ms que ejecutando los tests antes de un
deploy (despliegue) local.
Aunque no es el objetivo fundamental, una persona nueva en el
proyecto puede entender mejor la lgica de la aplicacin viendo
los unit tests que hay escritos. Incluso pueden servir para hacer uso de una
aplicacin de manera eficiente; es una documentacin adicional a la que
existe a nivel de mtodo y de clase.
163
Si se piensa en desarrollo orientado a unit testing, las
implementaciones estarn ms desacopladas y existir menos dependencia
entre funciones; siempre se busca tener mtodos que acepten unos
parmetros y devuelvan otros, teniendo en la cabeza esta idea, los
mtodos oscuros que nos cambian las condiciones de las pruebas estarn
ms controlados y tendern a desaparecer. Un mtodo que captura la hora
del sistema internamente para hacer operaciones con ella en lugar de
aceptarla como parmetro es susceptible a muchos fallos; no podemos
controlar el comportamiento ante cambios de hora o antes ejecuciones
muy largas del programa (imaginemos que hay un salto de da en una
ejecucin de dos horas); es bastante probable que como parmetro de
entrada nos hubiramos planteado tests que probaran estas cosas.
164
165
En ambos casos, siempre es til tener una herramienta para
definir mocks y otra con la que realizar aserciones, contar nmero de
tests, medir la cobertura del cdigo, etc...
Ejemplos de cdigo
Veamos unos fragmentos en cdigo en Java y Python comprobando
que una third party recibir un objeto complejo con un campo definido a
un valor esperado:
Matcher<Map<String, List<String>>> matcher =
hasEntry(NeolaneParameters.USERNAME.getName(),
Arrays.asList("nickname"));
exactly(1).of(notificationServiceMock).notifyNeolane(with(matche
r));
166
return unicode(self).encode('utf-8')
__repr__ = __unicode__
167
nuestro sistema de alarmas ante posibles meteduras de pata en la
codificacin. Podra parecer un esfuerzo extra pero la tranquilidad y
calidad del cdigo con estos sistemas mejora considerablemente y hace
til todo el esfuerzo.
Mantener varias versiones de software sin una herramienta de
integracin continua es harto complicado. En cambio con tests unitarios
que prueban el cdigo en todas las versiones e incluso plataformas
diferentes nos garantizan una estabilidad del producto considerable. Es
bastante probable que un cambio en la versin 3.0 haga fallar la antigua,
pero los tests unitarios (incluidos los tests que prueban bugs detectados)
nos avisarn del problema y trabajaremos en la solucin antes de
desplegar nada.
Siempre que detectemos un problema en produccin, deberamos
estar seguros de tener un test unitario que lo cubre. Si no es as, es el
momento de aadirlo para que no vuelva a suceder. La experiencia
demuestra que a pesar de pensar en casos anmalos, siempre se pueden
producir ms; es muy sencillo aadir un test y garantizar que no ocurrir
ms.
Debemos pensar que la codificacin de los tests es tan importante
como la codificacin de la funcionalidad en s misma. A la larga el tiempo
de desarrollo ser menor, la calidad del cdigo mayor as como la
posibilidad de compartirlo con otros proyectos o publicarlo.
Conclusin
Las pruebas unitarias forman parte del desarrollo. Con esta
aseveracin resumimos todo lo aqu expuesto para remarcar la
importancia del test unitario. Un buen cdigo, menos susceptible a fallar
en produccin ser aquel que est cubierto con pruebas unitarias.
La madurez, estabilidad, elegancia del cdigo queda presente viendo
pruebas unitarias escritas.
168
En los sistemas modernos donde mucha gente toca el mismo cdigo
en momentos diferentes, las pruebas unitarias que se van escribiendo
sucesivamente facilitan los cambios y la adicin de nueva funcionalidad.
Eduardo Alonso Garca (Len, 1978) es Technical Leader
en Telefnica I+D. A lo largo de su andadura
profesional ha programado, diseado y analizado
diferentes proyectos implantados en produccin para
clientes tanto internos del grupo Telefnica como
externos. Es un gran entusiasta de la elegancia del
software y de las nuevas tecnologas.