Inicio / Wikis / Tutoriales / Pruebas unitarias con CPPUnit - Programando los casos de pruebas

Pruebas unitarias con CPPUnit - Programando los casos de pruebas

(5 opiniones)
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
27 de Agosto de 2005
Programación estructurada

11 - Programando los casos de pruebas

Una vez que tenemos claro los que hay que probar, tenemos que ser capaces de programarlo. Para hacer esto vale todo. Lo más normal es lanzar métodos públicos de nuestro “fixture”, y comprobar que el retorno es el esperado, y que los atributos del objeto han quedado con los valores correctos. En otras ocasiones, nos tenemos que apoyar en ficheros o tablas auxiliares (que contienen los datos correctos), funciones y métodos auxiliares (que podemos definir en esta misma clase), librerías de terceros, etc. Como decía: vale todo.

La forma de verificar los valores es a través de unos métodos especiales que comprueban una condición y generan una excepción si no es verdadera. Estos métodos se llaman “aserciones” y existen de distintos tipos:

  • assert(bool): genera una excepción si la condición no se cumple.
  • assertEquals(esperado, obtenido): genera una excepción si ambos valores son distintos, mostrando el valor esperado y el obtenido. Se pueden pasar parámetros de tipo “long”, “double”, “std::string” o “char *”.
  • assertEquals(double esperado, double obtenido, double umbral): genera una excepción si la diferencia entre ambos valores es mayor al umbral, mostrando el valor esperado y el obtenido.
  • assertEqualFiles(char* nombreFichero, char* nombreFichero): genera una excepción si el contenido de ambos ficheros es distinto.
  • assertMessage(bool condición, char *mensaje): genera una excepción si la condición no se cumple, mostrando el mensaje indicado en el segundo parámetro.

Cada vez que una aserción no se cumple, se mostrará un error indicando que ese caso de prueba no se ha pasado, la línea, el fichero fuente, y la condición que no se ha cumplido en la aserción.

Hay dos razones por las que un caso se prueba no se da por válido:

  • Fallos: una o más aserciones no se han pasado porque la condición no es verdadera. Esto denota que el código no pasa una de las comprobaciones que hemos impuesto.
  • Errores: se ha generado algún tipo de excepción incontrolada en el código, como errores de acceso a memoria, errores de entrada/salida, excepciones del sistema operativo, etc. Esto significará que nuestro código contiene un error incontrolado.

En nuestro ejemplo, hemos codificado los dos casos de prueba del siguiente modo:

  • leer: tenemos un fichero auxiliar donde están almacenados los datos. Además conocemos sus valores y sabemos que están correctamente grabados (a este fichero le llamaremos “patrón”). Se leerán los datos y se verificarán que lo leído es lo que realmente está almacenado en el fichero. Las verificaciones se hacen a través de las funciones “assert” y “assertEquals”, para lanzarse la correspondiente excepción cuando la condición no se cumpla. La codificación de esto es la que muestra a continuación: Estos son los datos que sabemos que están correctamente guardados

en el fichero patrón.
#define FICHERO_PATRON "patron.dat"
#define NUMERO_PATRON 19
#define CADENA_PATRON "este es el texto de prueba del archivo patrón"

void DatosDiscoTest::testLeer()
{
se ejecuta la acción...
assert( fixture->leer(FICHERO_PATRON) );

...y se comprueban los resultados con aserciones
assertEquals( NUMERO_PATRON, fixture->getDato()->numero );
assert(
strcmp(CADENA_PATRON, fixture->getDato()->cadena) );
}

  • guardar: se guarda un nuevo archivo con los mismos valores que en el patrón. Después se leen ambos archivos y se comparan sus contenidos, a través de la aserción “assertEqualFiles”, tal y como vemos en el siguiente listado. Deben ser iguales para considerar que la clase guarda correctamente la información.

void DatosDiscoTest::testGuardar()
{
const char* FICHERO_TMP = "copia.tmp";

DATOS d;

d.numero = NUMERO_PATRON;
strcpy(d.cadena, CADENA_PATRON);

se ejecuta la acción...
fixture->setDato(&d);
fixture->guardar(FICHERO_TMP);

...y se comprueban los resultados
El contenido del temporal debe ser el mismo que el del patrón
Para ello utilizo la aserción “assertEqualFiles”
assertEqualFiles(FICHERO_TMP, FICHERO_PATRON);
}
Valora este capítulo: (5 opiniones)
Autor y licencia de 'Pruebas unitarias con CPPUnit - Programando los casos de pruebas'
Juan Manuel Extraído de: http://www.lawebdejm.com

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Opiniona sobre 'Pruebas unitarias con CPPUnit - Programando los casos de pruebas' (5)

Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.

Opina sobre este tutorial



* Valoración:
* Nombre:
* Correo electrónico:
* Título:
* Comentario:

Wikis relacionados con 'Pruebas unitarias con CPPUnit - Programando los casos de pruebas'

La realización de las pruebas de trabajo la hace habitualmente el futuro jefe de trabajo... Más »
Como es sabido, el concepto de función metalingüística y su ámbito de aplicación han quedado... Más »
La productividad esta asociada con el grado de producción que una empresa pueda alcanzar para... Más »
Este documento pretende ser una guía rápida de configuración y puesta en funcionamiento de procedimientos... Más »
El Linux Benchmarking CÓMO trata sobre algunos aspectos asociados con el benchmarking en los sistemas... Más »
¿Estás seguro de que deseas eliminar este capítulo?