Tests fonctionnels
On souhaite vérifier que les trois réalisations correspondent bien aux axiomes du TAD à l’aide d’un unique jeu de test indépendant de la réalisation du TAD. Pour cela, il est nécessaire d’écrire des tests fonctionnels qui manipulent les struct set
uniquement via les fonctions définies dans le fichier set/set.h
.
Les tests ne permettent pas de valider les fonctions pour toute instance de struct set
. On va donc tester chaque fonction pour quelques instances significatives qu’il faut sélectionenr soigneusement, notamment en se basant sur les axiomes du TAD.
Voici un exemple de test fonctionnel pour la création d’un ensemble.
#include <assert.h>
#include <stdio.h>
#include "set.h"
static void test_create_set(void) {
printf("%s", __func__);
struct set * st = set__empty();
assert(set__is_empty(st));
assert(set__size(st) == 0);
assert(! set__find(st, 11));
assert(set__remove(st, 78) != 0);
set__free(st);
printf("\tOK\n");
}
int main(void) {
printf("%s\n", __FILE__);
test_create_set();
return 0;
}
- Écrire ce test fonctionnel dans le fichier
set/test_set_func.c
. - Donner les commandes de compilation pour générer les exécutables du test fonctionnel pour les trois réalisations, puis modifier le fichier
Makefile
en conséquence (voir annexe) - Sur ce modèle, écrire le test fonctionnel des cas suivants:
- ajouter des élèments différents à un ensemble;
- ajouter le même élément à un ensemble non vide.
- Exécuter ces tests fonctionnels pour les trois réalisations et vérifier qu’ils sont validés.
- Que conclure sur l’utilisation des tests fonctionnels et structurels?
- Quel problème auriez-vous rencontré si vous aviez dû écrire des tests fonctionnels avec l’ancien prototype de
set__empty
:struct set set__empty();
?
Annexe
Modifications à apporter à votre Makefile
(attention aux tabulations!) pour la compilation des tests fonctionnels et leur lien à la mise en œuvre sentinel
(à vous d’ajouter les règles pour dynamic
et link
).
test_set_func.o: ${SET_DIR}/test_set_func.c ${SET_DIR}/set.h
${CC} ${CPPFLAGS} ${CFLAGS} ${SET_DIR}/test_set_func.c -c -o $@
sentinel_func: test_set_func.o set_sentinel.o
${CC} test_set_func.o set_sentinel.o -o $@ ${LDFLAGS}