codigo malicioso¿Qué es el código "testeable"? ¿Cómo saber si mi código es testable o no? En los equipos ágiles se habla mucho sobre asegurarse de construir código testable, pero ¿qué significa exactamente? John Boal nos ayuda a definir este concepto con más precisión.

Desarrollo guiado por pruebas (TDD)

Si estás usando TDD para escribir el código, el mismo resultará naturalmente testeable porque las pruebas llevaron a que exista ese código. Sin embargo, aún es posible que, con el tiempo, ocurran refactors que afecten la testeabilidad. Sin embargo no muy probable, porque todas las pruebas unitarias existentes deberían seguir pasando.

Dependencias

Si el código necesita de muchas dependencias externas que esencialmente necesitan ejecutar gran parte del sistema para probarlas, tenemos una clara señal de alerta para las pruebas. Tenemos que poder crear mocks de las dependencias y aislar nuestro código bajo test. Si no podemos hacer eso, el código no es testeable. Nuestras relaciones de dependencias deben ser razonables. Si algo huele mal acá, seguro que necesitamos trabajar para mejorar la testeabilidad.

Estados internos

Si existen muchos estados internos complejos sin interfaces para accederlos y manipularlos, entonces tenemos otro alerta indicando que el código no es testeable. Si existe mucha lógica interna y ocurren cosas basándose en estos estados, deberíamos poder crear pruebas unitarias de todo esto. Si no existe una prueba unitaria para cada cosa que ocurra internamente, entonces no es testeable. Nuevamente, si el código se escribe usando TDD esto no debería ser un problema.

Configuración

Si el código necesita gran cantidad de configuración para probarlo, otra vez tenemos un signo de alerta. Miremos el esfuerzo que nos lleva validar si una clase hace lo que tiene que hacer. Si el código de la prueba es más grande que el código principal, probablemente sea un signo que el código no es muy testeable. Las bases de datos suelen caer en este problema. Es probable que se tenga que escribir mucho código y datos que se necesitan para que la base de datos se encuentre en el estado correcto para ejercitar unos procedimientos. Esta es la clase de combinación de los conceptos de dependencias y estado interno, y creo que no es muy testeable.

La testeabilidad es una meta a alcanzar, nos ayuda a poder asegurar que el código funciona correctamente y es mantenible. Escribamos buenas pruebas unitarias. Verifiquemos la testeabilidad de las cosas pequeñas, y eso nos ayudará a mejorar la testabilidad del sistema general.

Traducido de Testable code, por John E. Boal.

Inspiración.

"Si tú tienes una manzana y yo tengo una manzana e intercambiamos las manzanas, entonces tanto tú como yo seguiremos teniendo una manzana cada uno. Pero si tú tienes una idea y yo tengo una idea, e intercambiamos las ideas, entonces ambos tendremos dos ideas"

Bernard Shaw