TP10 - Les Tests

Inès de Courchelle - Peio Loubiere

Durée : 3h

Objectifs :

  • Utiliser des directives préprocesseurs
  • Manipuler des arguments d’entrées
  • Réaliser des tests unitaires
  • Anticiper les bugs d’un programme

Exercice 1 : Directives microprocesseurs

Nous considérons le programme suivant :

PROGRAMME ClassementATP
VARIABLES
    nbJoueurs : entier
    tabJoueurs : tableau de joueur
DEBUT
    ECRIRE("Combien de joueur voulez vous créer ?")
    LIRE (nbJoueurs);
    POUR i allant de 0 à nbJoueurs FAIRE
        ECRIRE ("nom :")
        LIRE (tabJoueur[i].nom)
        ECRIRE ("prenom :")
        LIRE (tabJoueur[i].prenom)
        ECRIRE ("Annee de naissance :")
        LIRE (tabJoueur[i].anneeNaissance)
        ECRIRE ("PointsATP :")
        LIRE (tabJoueur[i].ptsATP)
    FIN POUR
FIN

Attention :

  • Si vous faites des tableaux dynamiques (conseillé) pour stoker le nom et le prénom d’un joueur, Alors n’oubliez pas de faire un malloc
  • Si vous faites un tableau dynamique (conseillé) pour stocker les différents joueurs (tabJoueur), Alors n’oubliez pas de faire un malloc du tabJoueur

Travail à réaliser

  1. Codez l’algorithme ClassementATP. NB : Pour cet exercice :
  • vous pouvez coder dans un seul et unique fichier (pas de compilation séparée).
  • vous devez coder la structure joueur (nom, prenom, anneeNaissance, nbPoints).
  • Pour la structure joueur, n’oublier pas de créer des pointeurs de char et de les allouer
  1. Définir une macro permettant de connaître l’age d’un joueur
  2. Ajouter une directive de compilation conditionnelle permettant d’afficher le tableau de joueurs.

Exercice 2 : Les arguments

Nous considérons un artiste comme suit :

nom;prenom;nbDisques;anneeN
Nous considérons les deux algorithmes suivant :
EN ALGO : ECRIRE("Mon nom : "+nom+" c'est moi ")
EN C : printf("Mon nom : %s c'est moi",nom);

DU COUP :

EN ALGO : ECRIREFICHIER(lefichier,"Mon nom : "+nom+" c'est moi ")
EN C : fprintf(lefichier,"Mon nom : %s c'est moi",nom);

EN ALGO : lefichier <- ouvertureFichier("nomDuFichier.csv",a)
EN C :  lefichier = fopen("mesArtistes.csv", "a");
PROGRAMME GestionArtiste
VARIABLES
 a : Artiste
DEBUT
 SI (argc <> 5) ALORS
    ECRIRE("Il n'y a pas le bon nombres d'arguments")
 SINON
    a.nom <- argv[1]
    a.prenom <- argv[2]
    a.nbDisques <- CONVERT(argv[3])
    a.anneeN <- CONVERT(argv[4])
    ajouterArtiste(a)
  FIN SI
FIN
  • attention :
EN ALGO : ECRIRE("Mon nom : "+nom+" c'est moi ")
EN C : printf("Mon nom : %s c'est moi",nom);

DU COUP :

EN ALGO : ECRIREFICHIER(lefichier,"Mon nom : "+nom+" c'est moi ")
EN C : fprintf(lefichier,"Mon nom : %s c'est moi",nom);

EN ALGO : lefichier <- ouvertureFichier("nomDuFichier.csv",a)
EN C :  lefichier = fopen("mesArtistes.csv", "a");
PROCEDURE ajouterArtiste(a : Artiste)
VARIABLES
   fichier : pointeur de fichier
DEBUT
  fichier <- NULL
  fichier <- ouvertureFichier("mesArtistes.csv", "a")
  SI (fichier <> NULL) ALORS
    ECRIREFICHIER(fichier,a.nom,a.prenom,a.nbDisques,a.anneeN)
    ECRIREFICHIER(fichier, "\n")
    FERMETUREFICHIER(fichier);
  FIN SI
FIN

Attention

  • Si vous faites des tableaux dynamiques (conseillé) pour stoker des informations (char*, artiste*, …), Alors n’oubliez pas de faire un malloc
  • Pour convertir des chaînes de caractères en entier en C, vous pouvez utiliser la fonctionnalité atoi()

Travail à réaliser

  1. Coder l’algorithme GestionArtiste. NB : Pour cet exercice :
    • vous pouvez coder dans un seul et unique fichier (pas de compilation séparée).
    • vous devez coder la structure artiste(nom, prenom, nbDisques, anneeN).
    • Pour la structure artiste, n’oublier pas de créer des pointeurs de char et de les allouer
    • Un argument est une chaîne de caractères, n’oublier pas la fonctionnalité atoi(maChaine) qui permet de convertir des chaînes de caractères au format numérique.
  2. Utiliser les arguments pour ajouter des informations aux fichiers. Le fonctionnement du programme doit être similaire au fonctionnement de la vidéo :

Exercice 3 : Test Unitaire PiouPiou

Nous considérons le code ci-dessous :

#include <stdio.h>
#include <stdlib.h>

/* Auteur : ????? */
/* Date :  ????? */
/* Résumé : ????? */
/* Entrée(s) : ?????  */
/* Sortie(s) : ?????  */
int F1(int nb);

/* Auteur :  ????? */
/* Date :  ????? */
/* Résumé : ????? */
/* Entrée(s) : ?????  */
/* Sortie(s) : ?????  */
int F2(int nb, int acc);

int main(int argc, char* argv[]){
  printf("%d \n",F1(1));
  printf("%d \n",F2(1,0));
  printf("%d \n",F1(3));
  printf("%d \n",F2(3,0));
  printf("%d \n",F1(5));
  printf("%d \n",F2(5,0));
  printf("%d \n",F1(17));
  printf("%d \n",F2(17,0));
  return 0;
}

int F1(int nb){
  int  res=0;
  int  tmp=0;

  while(nb!=0){
    tmp = nb % 2;
    res = res * 10 + tmp;
    nb = nb / 2;
  }
  return res;
}

int F2(int nb,  int acc){
  if (nb == 0) {
    return acc;
  } else {
    return F2(nb/2,  acc*10 +(nb%2));
  }
}
  1. Que fait-il ?
  2. À votre avis que faut-il, faire pour la fonction F2 ?
  3. Nous considérons les assertions suivantes :
F1(1)=1
F1(25)=11001
F1(0)=0
F1(10)=1010
F2(1)=1
F2(0)=0
F2(25)=11001
F2(10)=1010
  1. Coder les procédures de tests dans les fichiers : testsUnitaires.h testsUnitaires.c.
  2. Vérifier que cela fonctionne
  3. Apporter les modifications au programme

Exercice 4 : Boite noire bi-colore

Lorsque l’on a accès au code, on parle de tests en boîte blanche. Il existe alors des méthodes mathématiques pour déterminer quels tests et le nombre de tests à réaliser. Cela sera l’objet d’un cours prochainement dans votre scolarité…. Nous allons alors considérer que l’on ne ”connaı̂t pas” le code à exécuter (utilisation d’une librairie compilée par exemple ; on parle alors de tests en boîte noire), nous connaissons ”seulement” les données en entrée et la réponse attendue. Par défaut nous testerons donc les cas limites sur ces paramètres et quelques cas classiques. Nous allons donc effectuer des tests en boîte noire, uniquement axés sur les fonctionnalités attendues, selon les données en entrée.

Vous trouverez ici une librairie compilée et le .h correspondant, fournissant en commentaire une description de données, ainsi que le résultat donné.

  1. Donnez des couples CT/Oracle, permettant de vérifier que cela fait bien ce qui est attendu.
  2. Selon vos CT fournis pour la question précédente, trouvez 2 CT pour lesquels le résultat obtenu ne correspond pas, concluez sur les deux bugs de programmation présents dans cette librairie.