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 : pointeur de joueur
DEBUT
    ECRIRE("Combien de joueur voulez vous créer ?")
    LIRE (nbJoueurs);
    ALLOUER(tabJoueur,nbJoueurs)
    POUR i allant de 0 à nbJoueurs FAIRE
        ECRIRE ("nom :")
        ALLOUER(nom,MAX_TAILLE);
        LIRE (tabJoueur[i].nom)
        ECRIRE ("prenom :")
        ALLOUER(prenom,MAX_TAILLE);
        LIRE (tabJoueur[i].prenom)
        ECRIRE ("Annee de naissance :")
        LIRE (tabJoueur[i].anneeNaissance)
        ECRIRE ("PointsATP :")
        LIRE (tabJoueur[i].ptsATP)
    FIN POUR
FIN

Attention : ALLOUER n’est pas une méthode que vous devez créer mais est la façon de représenter en algo la fonctionnalité malloc utilisée en C.

  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 le fichier mesArtistes.csv suivant :

nom;prenom;nbDisques;anneeN
Nous considérons les deux algorithmes suivant :
  • attention : ALLOUER n’est pas une méthode que vous devez créer mais est la façon de représenter en algo la fonctionnalité malloc utilisée en C. CONVERT n’est pas une métode que vous devez créer mais est la façon de représenter en algo la fonctionnalité atoi() utilisée en C.
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");

EN ALGO : SI (a <> 0)
EN C : if (a != 0)
PROGRAMME GestionArtiste
VARIABLES
 a : Artiste
DEBUT
 SI (argc <> 5) ALORS
    ECRIRE("Il n'y a pas le bon nombres d'arguments")
 SINON
    ALLOUER(a.nom,MAX_TAILLE)
    a.nom <- argv[1]
    ALLOUER(a.prenom,MAX_TAILLE)
    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");

EN ALGO : SI (a <> 0)
EN C : if (a != 0)
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
  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.