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

Tests et Performance Java Discussion :

Tests Junit avec exceptions [JUnit]


Sujet :

Tests et Performance Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Points : 51
    Points
    51
    Par défaut Tests Junit avec exceptions
    Bonjour, je voudrais quelques conseils concernant des tests Junit.

    Je dois tester un constructeur et une méthode toString() (qui a été réécrite). Voici la classe à tester.

    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
     
    public class Identite{
       private String nom;
       private String prenom;
     
       public Identite(String nom, String Prenom) throws MonException{
           if (nom.length()>20) 
              throw new MonException ("Le nom est trop long!");
           this.nom=nom;
           this.prenom=prenom;
       }
     
       public String toString(){
          return ("Le nom : " + nom + " ,le prénom : " + prenom);
       }
    }
    Pour les tests, voici ce que je pense faire, mais je ne sais pas trop quoi faire dans le cas d'une exception... Dois je faire des try and catch et est ce que les assertEquals du constructeurs doivent être dans les try ou en dehors?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class IdentiteTest extends TestCase{
       public void testConstructeur{...}
     
       public void testToString(){
          try{
            Identite monId = new Identite ("Louis","Jacques");
            assertEquals("Le nom :  Louis , le prénom : Jacques",monId.toString());
            }catch (MonException ex){
                System.out.println("Erreur du constructeur");            
            }
    }
    Merci d'avance!

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    A moins que tu ne veuille tester explicitement l'exception dans ton test, le plus facile est de laisser l'exception remonter au delà de ton test. Ainsi JUnit sais que le test est en erreur:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class IdentiteTest extends TestCase{
       public void testConstructeur{...}
     
       public void testToString() throws MonException{
     
            Identite monId = new Identite ("Louis","Jacques");
            assertEquals("Le nom :  Louis , le prénom : Jacques",monId.toString());
     
    }
    Au fait, normalemen, pour toString, tu ne devrais pas avoir de "MonEception", la signature de toString ne mentionnant pas cette exception.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Points : 51
    Points
    51
    Par défaut
    Merci pour la réponse. En effet le toString() ne procure pas d'exception, mais comme pour tester le toString() je dois créer un objet et que le constructeur procure une exception je dois la traiter dans le test du toString() (ou la laisser passer comme tu disais)... Je me trompe peut-être?

    Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si l'exception traverse toString(), c'est que c'est qu'elle descend de runtimeException. Tu n'a alors rien à faire de particulier pour qu'elle remonte automatiquement au delà de ton test, vers junit.

    Là où tu pourrais avoir du travail particulier à faire, c'est si tu veux tester que ta méthode envoie bien une exception dans des conditions particulière. Dans ces cas là, j'utilise toujours le schema suivant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {
       unObjet.methodeQuiDoitLancerMachinException();
       fail("Un exception était attendue!");
    } catch (MachinException e){
       // rien à faire, c'est normal.
    }

  5. #5
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Points : 51
    Points
    51
    Par défaut
    Merci

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Pour le test d'exception, l'appel à fail est la formule consacrée. Cependant, à force de le faire, on peut oublier de l'appeler. Et là... on ne teste plus rien. Personnellement je préfère définir un helper accessible depuis les tests JUnit. En plus, par la magie de la complétion d'Eclipse & co, il y a moins de code à saisir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public abstract class ExceptionTester extends TestCase {
      public abstract void runTestedAction() throws Throwable;
     
      public ExceptionTester(Class expectedClass) {
        try {
          runTestedAction();
        }
        catch (Throwable t) {
          assertEquals(expectedClass, t.getClass());
          return;
        }
        fail("Expected " + expectedClass + " but got no error");
      }
    }
    Puis, lorsqu'on a besoin de vérifier un lancement d'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void testFailingMethod() {
      new ExceptionTester(Exception.class) {
        @Override
        public void runTestedAction() throws Throwable {
          touchyMethod();
        }
      };
    }
    Bonne continuation,
    Philippe

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Cette méthode est bien gentille mais fortement limitée dans ses cas d'utilisation. En général, on a une instance x d'un objet, sur lequel on effectue différents test. Avec une classe anonyme comme présenté dans ce code, la classe anonyme n'a pas accès au contexte de la méthode de test, a moins de déclarer les variable locale à la méthode comme étant statique, ce qui pose tout un tas d'autres problème.

    quand a l'absence du fail, on le vois tout de suite car le test n'échoue pas lors du premier lancement (hors un bon test doit commencer par échouer, car il doit être fait avant que le code testé ne soit écrit)

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Cette méthode est bien gentille mais fortement limitée dans ses cas d'utilisation. En général, on a une instance x d'un objet, sur lequel on effectue différents test. Avec une classe anonyme comme présenté dans ce code, la classe anonyme n'a pas accès au contexte de la méthode de test, a moins de déclarer les variable locale à la méthode comme étant statique, ce qui pose tout un tas d'autres problème.
    Je ne suis pas sûr de comprendre. x doit être déclaré final, ce qui n'est pas toujours souhaitable en effet. Mais souvent c'est tout à fait acceptable.

    Citation Envoyé par tchize_ Voir le message
    quand a l'absence du fail, on le vois tout de suite car le test n'échoue pas lors du premier lancement (hors un bon test doit commencer par échouer, car il doit être fait avant que le code testé ne soit écrit)
    Tout à fait.

    Généralement je conduis prudemment. Ça ne m'empêche pas de mettre ma ceinture de sécurité.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par philippe.bernard Voir le message
    Je ne suis pas sûr de comprendre. x doit être déclaré final, ce qui n'est pas toujours souhaitable en effet. Mais souvent c'est tout à fait acceptable.
    Je vais prendre un exemple simple, x est une valeur changée régulièrement dans une boucle, un final ne fait pas l'affaire, mais le test en a besoin, on pourrait en faire un champ plutot qu'une variable locale, mais là tu risque fortement les effets de bords.

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

Discussions similaires

  1. Test Junit avec Struts2
    Par sakli dans le forum Struts 1
    Réponses: 1
    Dernier message: 26/09/2011, 17h53
  2. Lancement de tests JUnit avec Build Ant
    Par fedora8 dans le forum ANT
    Réponses: 0
    Dernier message: 22/03/2011, 16h09
  3. tests Junits d'une Action avec DispatchAction
    Par davman_63 dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/01/2008, 15h33
  4. problème avec test Junit
    Par Rayley dans le forum Maven
    Réponses: 6
    Dernier message: 15/11/2006, 16h15

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