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 qui ne passent pas


Sujet :

Tests et Performance Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Tests JUnit qui ne passent pas
    Bonjour,

    je tente de faire un test sur une classe, malheureusement lorsque je veux vérifier la couverture, tous mes tests échouent (dans le setUp si j'ai bien compris, en revanche je ne sais pas pourquoi...en espérant que vous puissiez m'indiquer).


    Le code de la classe à tester (que l'on m'a fourni donc je suppose qu'il n'y a pas d'erreur de ce coté là).

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    package geco;
     
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
     
     
    /**
     * Classe de service permettant la gestion des login
     */
    public class LoginService {
     
        private ArrayList<String> loginsExistants;
     
     
     
        /**
         * Construit un login service a partir de la liste des logins existants
         * @param testListe
         */
        public LoginService(String[] testListe) {
            this.loginsExistants = new ArrayList<String>((loginsExistants));
            Collections.sort(this.loginsExistants);
        }
     
        /**
         * Verifie si un login existe deja
         *
         * @param login le login a verifier
         * @return true si le login existe deja, false sinon
         */
        public boolean loginExists(String login) {
            return loginsExistants.contains(login);
        }
     
        /**
         * Ajoute un login a la liste des logins existants
         * @param login le login a ajouter
         */
        public void addLogin(String login) {
            loginsExistants.add(login);
        }
     
        /**
         * Recherche tous les logins commençant par un meme prefixe
         *
         * @param pref le prefixe
         * @return la liste des logins prefixes par <em>pref</em>
         */
        public List<String> findAllLoginsStartingWith(String pref) {
            ArrayList<String> loginsPrefixes = new ArrayList<String>();
            for (String login: loginsExistants) {
                if (login.startsWith(pref)) {
                    loginsPrefixes.add(login);
                }
            }
            return  loginsPrefixes;
        }
     
        /**
         * Recherche tous les logins
         *
         * @return la liste de tous les logins
         */
        public List<String> findAllLogins() {
            return  loginsExistants;
        }
    }

    Le code de la classe de test que j'ai fais et qui ne passe pas

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    package geco;
     
     
    import org.junit.Before;
    import org.junit.Test;
    import java.util.ArrayList;
    import static org.junit.Assert.assertEquals;
     
    public class LoginServiceTest  {
        LoginService l;
        @Before
        public void setUp() throws Exception {
            l = new LoginService(new String[] {"test"});
     
        }
     
        @Test
        public void testLoginExists() throws Exception {
            assertEquals(true,l.loginExists("test"));
        }
        @Test
        public void testAddLogin() throws Exception {
            l.addLogin("toto");
            assertEquals(true,l.loginExists("toto"));
     
     
        }
        @Test
        public void testFindAllLoginsStartingWith() throws Exception {
            l.addLogin("toto");
            l.addLogin("tonton");
            l.addLogin("titi");
            ArrayList<String> listeAttendu=new ArrayList<String>();
            listeAttendu.add("toto");
            listeAttendu.add("tata");
            assertEquals(true,listeAttendu==l.findAllLoginsStartingWith("to"));
        }
     
     
        @Test
        public void testFindAllLogins() throws Exception {
            ArrayList<String> listeAttendu=new ArrayList<String>();
            listeAttendu.add("test");
            assertEquals(true,listeAttendu==l.findAllLogins());
     
        }
     
    }
    Et si je vais voir dans le fichier les erreurs que j'obtiens sont reportées; je comprends qu'il y a un problème dans ma méthode setUp au niveau de l'array list, mais je ne vois pas où...

    -------------------------------------------------------------------------------
    Test set: geco.LoginServiceTest
    -------------------------------------------------------------------------------
    Tests run: 4, Failures: 0, Errors: 4, Skipped: 0, Time elapsed: 0.031 sec <<< FAILURE!
    testAddLogin(geco.LoginServiceTest) Time elapsed: 0 sec <<< ERROR!
    java.lang.NullPointerException
    at java.util.ArrayList.<init>(ArrayList.java:177)
    at geco.LoginService.<init>(LoginService.java:23)
    at geco.LoginServiceTest.setUp(LoginServiceTest.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

    Je n'ai mis qu'une erreur ici, mais j'ai le même speech pour toutes les méthodes testées !

    Merci pour votre aide !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Qui t'a founit la classe ? Parce que supposer qu'une classe qu'on te fourni est sans erreur est un peu trop optimiste... car justement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.loginsExistants = new ArrayList<String>((loginsExistants));
    loginsExistants est l'attribut de la classe, celui-là même que l'on créé dans cette ligne, et qui est donc null avant, d'où forcément une NullPointerException, test JUnit ou pas test JUnit !. En l'occurence, écrire ça, ne sert à rien : soit la liste existe déjà, et on en fait juste une copie qui la remplace, soit elle est null, et ça fait un NullPointerException
    Cela reviendrait à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ArrayList<String> l1=null;
    l1 = new ArrayList<>(l1);
    Vu que le constructeur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public LoginService(String[] testListe) {
            this.loginsExistants = new ArrayList<String>((loginsExistants));
            Collections.sort(this.loginsExistants);
        }
    En toute logique, on a voulu plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public LoginService(String[] testListe) {
            this.loginsExistants = new ArrayList<>(Arrays.asList(testListe));
            Collections.sort(this.loginsExistants);
        }
    ou ça (si on ne veut pas d'erreur si le paramètre est null)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public LoginService(String[] testListe) {
            if ( testListe==null ) {
                this.loginsExistants = new ArrayList<>();
            else {
               this.loginsExistants = new ArrayList<>(Arrays.asList(testListe));
               Collections.sort(this.loginsExistants);
            }
        }
    Ce qui ne veut pas dire qu'il n'y a pas de problèmes dans ton code (par exemple, rappel : on ne teste pas l'égalité de 2 instances d'objet par ==, mais par equals (aucun risque que new ArrayList<String>()==new ArrayList<String>() soit vrai !!! Et cela même si on ajoute les mêmes String dans les deux d'ailleurs)).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Merci je m'en vais tester de ce pas.

    La classe était fournie pour les besoins du tp par les profs...

    Enfin bref au moins si ça fonctionne après ça m'aura fait voir la différence entre une couverture à 0% et 100%^^

    ok pour le equals, effectivement, j'avais pas relu cette partie mais c'est évident !

  4. #4
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 444
    Points : 4 560
    Points
    4 560
    Par défaut
    Citation Envoyé par Amnael Voir le message
    La classe était fournie pour les besoins du tp par les profs...
    Eh ben, ça fait un peu peur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public List<String> findAllLogins() {
            return  loginsExistants;
        }
    On en a pendu pour moins que ça!

    Sans parler de la documentation incomplète(constructeur qui trie, la doc ne me mentionne pas), de la pertinence d'utiliser une list plutot qu'un set, de la gestion inexistante de null...

    Ca fait beaucoup pour une classe de 70 lignes.
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  5. #5
    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 yildiz-online Voir le message
    Eh ben, ça fait un peu peur...
    Pas si elle est fournie dans le cadre de unit tests, elle est probablement criblée d'erreurs pour forcer l'étudiant à les corriger en TDD

Discussions similaires

  1. [ODBC] Requêtes Access qui ne passent pas
    Par papaetoo dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/08/2008, 17h04
  2. Sessions multiples et variables qui ne passent pas
    Par franz.moraine dans le forum Langage
    Réponses: 6
    Dernier message: 20/03/2008, 21h48
  3. Un test if qui ne fonctionne pas correctement
    Par Shinjuku dans le forum Langage
    Réponses: 6
    Dernier message: 26/02/2008, 11h52
  4. variables de session qui ne passent pas
    Par cels dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 28/11/2006, 11h46
  5. [Mail] liens qui ne passent pas...
    Par tnntwister dans le forum Langage
    Réponses: 13
    Dernier message: 03/01/2006, 19h42

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