IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Tester une fonction void


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut Tester une fonction void
    Bonjour,

    Dans le cadre de tests unitaires, j'aimerais connaitre de quelle manière je pourrais savoir si une fonction void a rencontré une erreur.

    Par exemple, pour une fonction qui met à jour une valeur dans un tableau, si elle reçoit en paramètres l'index à mettre à jour, et que celui-ci est négatif.

    Merci.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Je me suis peut-être mal exprimé ou pas assez clairement.
    Je rajouterai, que lorsqu'une fonction qui renvoie une valeur "se passe mal", elle peut retourner une valeur spécifique pour signaler qu'une erreur s'est produite. Mais avec une fonction du type void ce n'est pas le cas, pour l'instant je ne fais qu'un simple print de mon erreur. J'aimerais savoir s'il est possible qu'une fonction void indique à d'autres fonctions si elle s'est correctement exécutée ou pas.

  3. #3
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut
    Bonjour Ale-fonce


    Il existe trois solution pour qu'une fonction puisse communiquer avec d'autre fonctions

    • Retourner une valeur, ce qui n'est pas ton cas
    • Mettre à jour une variable globale
    • Appeler une autre fonction pour signaler le problème


    dans ton cas, on fait un printf pour signaler l'erreur, deux solutions:
    • Surveiller ton écran pour voir si le message apparait
    • plus difficile, remplacer le printf par une fonction bouchon qui permet de tracer l'erreur


    A+
    Page sur Developpez : http://pbriand.developpez.com

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Merci pour cette éclaircissement. Je vois qu'il n'y a pas de solution miracle... dommage.

  5. #5
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Ale-fonce Voir le message
    J'aimerais savoir s'il est possible qu'une fonction void indique à d'autres fonctions si elle s'est correctement exécutée ou pas.
    Pour une fonction, donner l'info par son paramètre de retour est la façon la plus naturelle, même si bpy1401 t'en as enuméré 3. Le C supporte qu'on utilise cette fonction sans exploiter la valeur de retour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #include <assert.h>
     
    int testedFunction(int a)
    {
        return a & 1;
    }
     
    int main(int argc, char** argv)
    {
        int retvalue;
        retvalue =  testedFunction(1);
        testedFunction(2);
        assert(testedFunction(3) == 1);
        /* raise an error */
        assert(testedFunction(4) == 1);
        return 0;
    }
    Par exemple la fonction testedFunction renvoie un paramètre mais on peut l'utiliser ou l'ignorer. La macro assert (qui a été écrite pour les test unitaires justement) sert a comparer le résultat de la fonction avec sa valeur prévisible. Si il n'y a pas égalité, une erreur est levée.

    On utilise souvent un int en retour de fonction pour remplacer une fonction void, c'est même il me semble le format que les compilos choisissent par défaut quand ils ne trouvent pas de prototype de la fonction.

    L'avantage, c'est que l'on est pas obligé d'assigner le résultat et donc on peut l'utiliser exactement comme une fonction void. Le jour où la fonction doit retourner un résultat, les modifications sont minimes.

    Maintenant si les tests unitaires ne doivent pas changer quoique ce soit dans la fonction, il faut examiner le résultat et le comparer à ce qui est attendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <assert.h>
     
    /* very dirty global variable */
    int gl_result;
     
    void testedFunction(int a, int*b)
    {
        *b = a & 1;
    }
     
    void testedFunction2(int a)
    {
        gl_result = a & 1;
    }
     
    int main(int argc, char** argv)
    {
        int result;
        testedFunction(3, &result);
        assert(result == 1);
        testedFunction2(3);
        assert(gl_result == 1);
        /* raise an error */
        testedFunction(4, &result);
        assert(result == 1);
        return 0;
    }
    A+,

    Pfeuh

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Merci pour vos réponses

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Dans le cadre de TU, pour vérifier qu'une fonction void s'est bien déroulée, il faut vérifier la valeur des variables qu'elle devrait avoir mis à jour et que leur valeur corresponde.

    J'aimerais savoir s'il est possible qu'une fonction void indique à d'autres fonctions si elle s'est correctement exécutée ou pas.
    Au sein de ta fonction, tu sais si elle se déroule bien ou non, et tu appelles les autres fonctions ou non. De ce fait, les autres fonctions ne seront appelées que si celle-ci s'est bien déroulée. Donc elle savent qu'elle s'est bien déroulée, sinon elles n'auraient pas été appelées.

    Sinon, une fonction void, comme son type de retour l'indique, ne retourne rien. Et donc encore moins de code d'erreur.
    Donc il est théoriquement impossible de savoir ou non si elle s'est bien déroulée..
    - la variagle globale, utilisée par beaucoup de lib avec les getLastError et consorts
    - le printf, quasiment indétectable dans le cas d'un TU
    - connaître la valeur que les membres doivent avoir en sortie et les vérifier
    - changer le type de retour

    Dans d'autres langages, C++ pour ne citer que lui, on a les exceptions.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Il existe une autre solution il me semble...

    Transmettre avec la fonction l'adresse d'une variable ( ou d'un pointeur). Pour faire très simple on peut avoir un entier qui peut faire office de booléen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void my_function (char *var1, int var2, int *error);
    error sera initialisé dans my_function(); en fonction de l'état de réussite de son éxécution. Ainsi on pourra en retour de cette fonction connaître son état de réussite.

    Exemple complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void
    my_function (char *var1, int var2, int *error)
    {
      *error = 1;
    }
     
    int
    main(int argc, char *argv[])
    {
      int error = 0;
      my_function (NULL, 0, &error);
      printf ("valeur de retour de my_function (); : %d\n", error);
     
      return EXIT_SUCCESS;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tester une fonction
    Par shaku dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/11/2008, 23h28
  2. tester une fonction
    Par k-eisti dans le forum SQL
    Réponses: 4
    Dernier message: 28/01/2008, 11h05
  3. [JUnit] Comment tester une fonction qui retourne un booléen
    Par Raiden1234 dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 15/12/2007, 19h29
  4. tester une fonction vba
    Par Maxence45 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/11/2007, 17h01
  5. utiliser une fonction VOID pour des blocs relationnels ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/09/2006, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo