[WikiItic] [TitleIndex] [WordIndex

Exemples de test unitari amb CUnit

Exemple 1

Suposeu que teniu un mòdul amb algunes funcions molt senzilles. Diguem que aquest mòdul s'anomena modfun i que l'implementem seguint el patró habitual sobre dos fitxers: msdfun.h i modfun.c. Un i altre fitxer tenen aquest aspecte:

   1 #ifndef MODFUN_H
   2 #define MODFUN_H
   3 
   4 /* eleva una base a un exponent positiu */
   5 int pot(int base, int exp);
   6 
   7 /* calcula el valor absolut */
   8 int absolut(int v);
   9 #endif

   1 #include "modfun.h"
   2 
   3 /* eleva una base a un exponent positiu */
   4 int pot(int base, int exp) {
   5    int resultat=1;
   6 
   7    for (; exp >=0; exp--)
   8       resultat *= base;
   9    return resultat;
  10 }
  11 
  12 /* calcula el valor absolut */
  13 int absolut(int v) {
  14    if (v<0)
  15       return -v;
  16    else
  17       return v;
  18 }

Per construir un test unitari usant CUnit el més senzill possible cal implementar un programa principal que contingui els diferents tests. Un test unitari amb CUnit s'organitza en base a suites o bateries de test. Cada bateria de tests conté un nombre de tests que el mòdul ha de superar. Podem agrupar diverses bateries en un únic unit test que es passarà d'una sola atacada.

En el exemple que ens ocupa usarem dues bateries de test, una per a cada funció. El resultat serà el següent programa que emmagatzemarem en el fitxer test.c:

   1 #include <CUnit/CUnit.h>
   2 #include <CUnit/Basic.h>
   3 #include "modfun.h"
   4 
   5 /*
   6  * Bateria de test per a la funció `pot`
   7  */
   8 void bateria_pot(void) {
   9    CU_ASSERT_EQUAL(pot(0,4), 0);
  10    CU_ASSERT_EQUAL(pot(2,0), 1);
  11    CU_ASSERT_EQUAL(pot(2,2), 4);
  12    CU_ASSERT_EQUAL(pot(-2,2), 4);
  13    CU_ASSERT_EQUAL(pot(-2,3), -8);
  14 }
  15 
  16 /*
  17  * Bateria de test per a la funció `absolut`
  18  */
  19 void bateria_abs(void) {
  20    CU_ASSERT_EQUAL(absolut(0),  0);
  21    CU_ASSERT_EQUAL(absolut(-1), 1);
  22    CU_ASSERT_EQUAL(absolut(2),  2);
  23 }
  24 
  25 
  26 int main()
  27 {
  28    /* inicialitzem el registre de resultats del test */
  29    CU_initialize_registry();
  30 
  31    /* 
  32     * Creem una suite de tests. Cada suite té diverses bateries de test.
  33     */
  34    CU_pSuite pSuite = CU_add_suite("Suite_1", NULL, NULL);
  35 
  36    /* Afegim les dues bateries de test a la suite */
  37    CU_ADD_TEST(pSuite, bateria_pot);
  38    CU_ADD_TEST(pSuite, bateria_abs);
  39 
  40    /* 
  41     * Executem tots els tests i mostrem el resultat
  42     * en mode Bàsic.
  43     */
  44    CU_basic_set_mode(CU_BRM_VERBOSE);
  45    CU_basic_run_tests();
  46    CU_cleanup_registry();
  47 
  48    return CU_get_error();
  49 }

Els diferents tipus d'ASSERT disponibles per a comprovar resultats es poden consultar en el manual de CUnit.

En l'exemple anterior no hem comprovat el resultats de les diferents operacions de la llibreria CUnit deliberadament, per simplificar el codi. Si ara afegim aquestes comprovacions tindrem el programa de test definitiu:

   1 #include <CUnit/CUnit.h>
   2 #include <CUnit/Basic.h>
   3 #include "modfun.h"
   4 
   5 /*
   6  * Bateria de test per a la funció `pot`
   7  */
   8 void bateria_pot(void) {
   9    CU_ASSERT_EQUAL(pot(0,4), 1);
  10    CU_ASSERT_EQUAL(pot(2,0), 1);
  11    CU_ASSERT_EQUAL(pot(2,2), 4);
  12    CU_ASSERT_EQUAL(pot(-2,2), 4);
  13    CU_ASSERT_EQUAL(pot(-2,3), -8);
  14 }
  15 
  16 /*
  17  * Bateria de test per a la funció `absolut`
  18  */
  19 void bateria_abs(void) {
  20    CU_ASSERT_EQUAL(absolut(0),  0);
  21    CU_ASSERT_EQUAL(absolut(-1), 1);
  22    CU_ASSERT_EQUAL(absolut(2),  2);
  23 }
  24 
  25 
  26 int main()
  27 {
  28    /* inicialitzem el registre de resultats del test */
  29    if (CUE_SUCCESS != CU_initialize_registry())
  30       return CU_get_error();
  31 
  32    /* 
  33     * Creem una suite de tests. Cada suite té diverses bateries de test.
  34     */
  35    CU_pSuite pSuite = CU_add_suite("Suite_1", NULL, NULL);
  36    if (NULL == pSuite) {
  37       CU_cleanup_registry();
  38       return CU_get_error();
  39    }
  40 
  41    /* Afegim les dues bateries de test a la suite */
  42    CU_ADD_TEST(pSuite, bateria_pot);
  43    CU_ADD_TEST(pSuite, bateria_abs);
  44 
  45    /* 
  46     * Executem tots els tests i mostrem el resultat
  47     * en mode Bàsic.
  48     */
  49    CU_basic_set_mode(CU_BRM_VERBOSE);
  50    CU_basic_run_tests();
  51    CU_cleanup_registry();
  52 
  53    return CU_get_error();
  54 }

Per executar el test primer cal compilar i muntar els mòduls i després executar el test fent:

   1 $ gcc -std=c99 modfun.c test.c -lcunit -o test
   2 $ ./test

2023-07-03 11:46