Pruebas Unitarias

Después de haber estado adentrándome en TDD, muy poco a poco, he visto que el primer paso para hacer más fácil esta doctrina, son las pruebas unitarias.

Las pruebas unitarias son pruebas que se realizan sobre unidades aisladas de código, generalmente objetos, para asegurar que, con unos ciertos valores de entrada, siempre se reciben los mismos valores de salida, o los valores de salida que se esperan.

Para implementar las pruebas, según el lenguaje que se use, existen las siguientes librerías o métodos:

  • Java: el proyecto junit podría considerarse el primero en tener este tipo de framework para realización de pruebas, es de los que más activo tienen su desarrollo, la última versión publicada es de hace unos meses.
  • C: el proyecto CUnit no se actualiza desde 2006, pero parece que el desarrollo quedó muy avanzado y es útil para realizar las pruebas.
  • PHP: el proyecto PHPUnit se sigue actualizando y sigue creciendo poco a poco, es bastante maduro y apto para su uso en proyectos de PHP, ya sean de la versión 4 ó 5.
  • Ruby: el nombre del proyecto para ruby, a diferencia del resto, es Test::Unit. En este caso se presenta como un módulo para la realización de pruebas unitarias. Esto es porque en Ruby, no solo están disponibles este tipo de pruebas, sino también pruebas funcionales y de integración… pero eso será otro tema ;-) . El uso del módulo resulta muy similar al resto de frameworks.
  • Python: el proyecto recibe el nombre de PyUnit. Este proyecto hace tiempo que no recibe actualizaciones, pero está en un estado maduro. En su página se dice que se usa para las pruebas de Zope, que es, posiblemente, la mayor pieza de código escrita en python.
  • Perl: en las instalaciones desde CPAN, para instalar módulos de Perl, siempre que se descarga el módulo se ejecutan las pruebas unitarias del mismo, para asegurarse de que se cumplen todas las dependencias y que el código, en ese entorno, reacciona como se espera. El proyecto es PerlUnit.

En la mayoría de casos, cada uno de los proyectos ha sido motivado por junit, con lo que el uso, la ideología y la forma de trabajar es muy similar.

Ahora, después de comentar los proyectos, vamos a comentar lo que realmente importa, las ventajas:

  • Pruebas exhaustivas: el desarrollo de pruebas unitarias tiene como ventaja principal que el código se prueba con datos planteados con detenimiento e intentando cubrir todos los casos posibles, por lo que, es muy útil para descubrir si nuestro software cumple con las especificaciones marcadas (requisitos).
  • Facilita el probar reiteradamente: es decir, si necesitamos realizar pruebas sobre un componente, y ese componente no reacciona como esperamos, en lugar de ir alimentando la entrada de datos cada vez que lo probemos, podemos realizar una batería de pruebas específicamente para él, e incluirlo en la batería de pruebas global.
  • Fase de Calidad: el agregar las pruebas unitarias y ejecutarlas al final, cuando ya se ha terminado de desarrollar el código, no indica que el código sea infalible, pero si las pruebas se han desarrollado cubriendo todos los casos de uso triviales y posibles fallos que se puedan suceder, asegura que el código funcionará como se espera.

Por tanto, el desarrollo de estas pruebas, ya sea a priori, como indica TDD, o a posteriori, como elemento de QA (quality asurance, garantía de calidad), o ambos, resulta una herramienta indispensable que nos puede ahorrar la mayor parte de incidencias que se abren una vez el proyecto está en producción o entregado al cliente.