Contenido

Cutre-framework de pruebas en Ansi C

En este caso vamos a demostrar que no hay excusa para no hacer pruebas, ya que podemos montarnos un framework en un momento en cualquier lenguaje.

El framework no va a ser una maravilla, pero lo vamos a hacer muy rápido.

Ansi C

¿Qué es lo que queremos?

Realmente sólo necesitamos que nos facilite comprobaciones y que nos muestre un resultado al final. Como es algo sencillito, asumiremos que no vamos aprobar nada concurrente.

Contando

Por eso comenzaremos con un par de variables globales. Estoy en contra de las variables globales, pero esto no va a llegar a producción, ni se va a generalizar. Tan solo es un ejemplo. Veamos…

1
2
int errors = 0;
int tests = 0;

Y ya tenemos una variable para contar errores y otra para contar pruebas.

Hagamos una función que incremente el número de tests:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
static void increase_tests ()
{
     tests ++;
     if (tests % 10)
           printf (".");
     else
           printf("+");
     if (tests % 100 == 0)
           printf("%d\n", tests);
}

Hemos dicho que va a ser sencillito, no que vaya a ser feo. Cada prueba pintaremos un punto; cada 10 pruebas, un símbolo “+” y cada 100 pruebas lo indicaremos y saltaremos a otra línea.

Imprimiendo el resultado

Ahora vamos a imprimir el resultado:

1
2
3
4
5
6
7
8
static int print_report () {
     printf ("\n");
     printf ("Total Tests: %d\n", tests );
     printf ("Tests Passed: %d\n", tests - errors);
     printf ("Errors Found: %d\n", errors );
     if (errors == 0 )
           printf ("Congratulations, no error was found !!\n");
}

Nada de otro mundo: el número total de pruebas, los que han pasado y los que no.

Comprobaciones

Ahora es el turno de comprobar que las cosas funcionan como deben. Vamos a crearnos nuestros assert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
static void assert_equals ( int a, int b, char* message ) {
    increase_tests ();
    if (a == b)
        return;
    errors ++;
    printf ("\n*** ASSERTION ERROR *** %d != %d : %s\n", a, b, message);
}

static void assert_not_equals ( int a, int b, char* message ) {
    increase_tests ();
    if (a != b)
        return;
    errors ++;
    printf ("\n*** ASSERTION ERROR *** %d == %d : %s\n", a, b, message);
}

Programa principal

Ahora vamos con el programa principal, que lo único que hará será ejecutar una cosa debajo de otra:

1
2
3
4
5
6
7
int main(int argc, char *argv[])
{
    execute_tests();

    print_report();
    return errors;
}

Y sólo nos queda implementar los tests propiamente dichos. La función execute_tests será una lista de llamadas a tests y éstos se parecerán a lo que sigue:

1
2
3
4
static void test1() {
    assert_equals(1, 1, "Deberían ser iguales, pero no lo son");
    assert_not_equals(1,0, "Deberían ser distintos, pero no lo son");
}

Y ya tenemos nuestro propio framework de pruebas:D