Las pruebas unitarias es uno de los métodos con el que puedes mejorar la calidad de tus sistemas de software.
En un sistema de calidad de software (o
Quality Assurance), existen principalmente dos tipos de pruebas:
- Pruebas unitarias (o de aceptación): comprobaciones que hacemos a las unidades lógicas de nuestro programa. Se verifica que una unidad funciona correctamente por sí misma, sin tener en cuenta las relaciones que pueda tener con otras partes del sistema.
- Pruebas funcionales (o pruebas de sistema o integración): comprobamos el sistema globalmente, haciendo énfasis en las colaboraciones entre unidades. Se prueba cada una de las opciones (o casos de uso) que ofrece el sistema, pudiendo ser procesos automáticos, acciones sobre el interfaz gráfico, etc.
Vamos a hablar sobre las pruebas unitarias, y cómo podemos aplicarlas a nuestros proyectos en C/C++, a través del marco de pruebas CPPUnit.
En la definición que acabamos de dar, hemos hablado de
unidades lógicas, aunque este concepto puede ser un poco ambiguo. Para ir entendiéndolo, diremos que las
unidades lógicas de un programa son aquellas partes en que lo hemos dividido para entenderlo mejor. Pueden ser los módulos, paquetes, clases, subsistemas, funciones o cualquier otro mecanismo que nos ofrezca el lenguaje de programación que estamos utilizando. Nosotros, para simplificar, utilizaremos las clases como unidades lógicas.
Las pruebas unitarias tienen un único requisito muy básico: que el programa que queremos probar tenga unidades lógicas. Aunque pueda parece obvio, pero no lo es tanto. He podido ver muchos, muchísimos programas en los que no existe ningún tipo de unidad lógica, especialmente en entornos RAD como Delphi, C++Builder, Visual Basic, etc. Lo único que existe es una ventana y mucho código en sus eventos, y a lo sumo alguna función de propósito general para estructurar el sistema. Como os podréis imaginar, en este escenario es imposible comprobar si un módulo cumple con su cometido, porque su funcionalidad está entremezclada, y no hay manera de aislar cada una de sus partes para verificar su funcionamiento.
Para aprender a separar un programa en unidades lógicas, es imprescindible aprender análisis y diseño, apoyándonos en técnicas y metodologías como UML, uso de patrones de diseño, Yourdon, Merisse, etc.