Pruebas unitarias con CPPUnit - Programando los casos de pruebas

11 - Programando los casos de pruebas

[editar]
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
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);
}
[editar]

2 opiniones

Planeacion de pruebas.

El tema ni siquiera esta en pagima.
Mi proyecto de taller de proyectos.

Me parece muy importante el avance logrado hasta el momento.

Tutoriales relacionados con 'Pruebas unitarias con CPPUnit'

En los últimos años parece que las metodologías ágiles convencen más a los desarrolladores que... Más »

Autor y licencia de 'Pruebas unitarias con CPPUnit'


Tutorial de Juan Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
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.