Test unitaire junit

Résolu
Bonjour,
je veux implémenter une classe qui simule un compte bancaire. j'ai une classe compte avec des opérations de base. Maintenant je dois effectuer des test unitaires avec Junit. J'ai généré la classe de test mais je ne sais pas comment effectuer les tests:
Voici mes deux classes:

package tete;

public class compte implements interfacebanque {
private int s;

public compte (int s) {
this.s=s;
}
@Override
public void creditint(int c) {
this.s = c + this.s;

}
@Override
public void virement(int v) {
this.s = v + this.s;

}
@Override
public int consultation() {
return s;

}
@Override
public void debiter(int d) {
this.s = this.s - d;

}

}

la partie test:

package tete;

import junit.framework.TestCase;

public class compteTest extends TestCase {

public void testCreditint() {

}

public void testVirement() {
fail("Not yet implemented");
}

public void testConsultation() {
compte cpt = new compte(0);
assertEquals(0, cpt.consultation() );

}

public void testDebiter() {

}
}

Merci d'avance.

2 réponses

  1. Modérateur
    Bonjour,

    Quelle version de JUnit utilises-tu ?
    Parce que
    junit.framework.*
    c'est du JUnit 3 (obsolète).

    Dans les dernières versions de JUnit (4 ou 5) pour qu'une méthode soit reconnue comme étant un test unitaire il faut rajouter l'annotation Test :

    // import org.junit.*; // JUnit 4
    // import org.junit.jupiter.api.*; // JUnit 5
    
    @Test
    public void testConsultation() {
        compte cpt = new compte(0);
        Assertions.assertEquals(0, cpt.consultation());
    }

    Quant à l'exécution des tests en eux mêmes, tu peux le faire via un IDE (Eclipse, IntelliJ, etc) ou un outil de build (Maven, Ant, etc).
    La confiance n'exclut pas le contrôle
    1. Merci pour la réponse. J'ai télécharger le fichier .jar et je peux maintenant lancer des tests, en respectant les critères suivants:
      — un compte n’est jamais à découvert,
      — seules des sommes positives peuvent être passées en paramètre des opérations,
      — l’invocation du débit ou du virement ne peut se faire qu’avec une somme inférieure au solde du compte concerné

      j'ai voulu faire un test qui vérifie qu'un élément entrée en paramètre pour un virement est positif mais cela ne marche pas.

      package testunitair;

      import org.junit.*;
      import static org.junit.Assert.*;

      public class test {

      @Test
      public void Consultation() {
      compte cpt = new compte(0);
      assertEquals(0, cpt.consultation());
      }

      @Test
      public void virement() {
      int v;
      compte cpt = new compte(0);
      assertThat(v>0, cpt.virement(v));

      }
      }
      1. Modérateur
        La méthode virement renvoie void, donc jamais, d'aucune manière que ce soit, tu ne pourras la passer en paramètre d'une autre méthode comme tu essayes de le faire avec
        assertThat(v>0, cpt.virement(v));


        L'utilisation de assertThat qui prends en paramètre un Matcher est relativement complexe (voir la documentation : Matchers and assertThat).
        Si tu débutes en tests unitaires je te conseilles de faire plus simple.

        Exemple :

        @Test
        public void testVirement() {
            int a = 17, b = 42;
            compte cpt = new compte(a);
            cpt.virement(b);
            assertEquals(a + b, cpt.consultation());
        }
      2. @KXJe vois, j'ai écris tous les tests en essayant de respecter les critères que l'on m'a donné
        J'obtiens cela:

        package testunitair;

        import org.junit.*;
        import static org.junit.Assert.*;

        public class test {

        @Test
        public void Consultation() {
        compte cpt = new compte(0);
        assertEquals(0, cpt.consultation());
        assertTrue(cpt.consultation()>=0);
        }
        @Test
        public void testVirement() {
        int a = 17, b = 12;
        compte cpt = new compte(a);
        cpt.virement(b);
        assertEquals(a + b, cpt.consultation());
        }
        @Test
        public void virement() {
        int b = 0;
        compte cpt = new compte(0);
        cpt.virement(b);
        assertTrue(b>= 0);
        assertTrue(b < cpt.consultation());
        }
        @Test
        public void debiter() {
        int b = 0;
        compte cpt = new compte(0);
        cpt.debiter(b);
        assertTrue(b>= 0);
        assertTrue(b < cpt.consultation());

        }

        @Test
        public void testcrediter() {
        int a = 10, b = 45;
        compte cpt = new compte(a);
        cpt.virement(b);
        assertEquals(a + b, cpt.consultation());

        }
        @Test
        public void crediter() {
        int b = 0;
        compte cpt = new compte(0);
        cpt.crediter(b);
        assertTrue(b>= 0);

        }
        }

        Est ce que c'est bien comme cela que j’étais sensé le faire?
      3. Modérateur
        @etbienwi"en essayant de respecter les critères que l'on m'a donné"
        De quel genre ?

        De ce que je vois :

        @Test
        public void virement() {
            int b = 0;
            compte cpt = new compte(0);
            cpt.virement(b);
            assertTrue(b>= 0);
            assertTrue(b < cpt.consultation());
        }

        Ici
        assertTrue(b>= 0);
        ne sert à rien, b vaut 0 donc b>=0 sera forcément true, et en plus ça ne testes rien de ton code (ça teste le test unitaire... inutile !)

        De ton code ce que tu testes c'est
        cpt.virement(b);
        mais sachant que b vaut 0, ça n'affecte pas vraiment l'état de ton compte, c'est même bizarre que l'on puisse autoriser un virement de valeur 0...

        assertTrue(b < cpt.consultation());
        je n'ai pas testé, mais a priori c'est incorrect, puisque ton compte vaut 0 et que tu fais un virement de 0, tu n'auras pas 0 < 0...

        De plus, dans les règles de l'art, un test unitaire ne devrait tester qu'une seule chose pour être vraiment unitaire, donc un seul assert par méthode.

        Remarque : il serait également bon de respecter les conventions de nommage Java (nom de classe avec une majuscule, camel case, etc.)
      4. @KXCe sont ces critères la:
        — un compte n’est jamais à découvert,
        — seules des sommes positives peuvent être passées en paramètre des opérations,
        — l’invocation du débit ou du virement ne peut se faire qu’avec une somme inférieure au solde du compte concerné

        Pour virement j'ai corrigé et cela me donne:

        @Test
        public void virement() {
        int b = 10;
        compte cpt = new compte(20);
        cpt.virement(b);
        assertTrue(b>= 0);
        assertTrue(b < cpt.consultation());
        }

        je l'ai testé et il fonctionne.
      5. Modérateur
        @etbienwiLe problème c'est que tu testes un cas particulier qui n'est pas pertinent.
        Sachant que de toute façon ton code est faux, donc avoir des tests qui fonctionnent sans changer ton code, ça veut dire que le test est faux aussi.
        Un bon test devrait t'indiquer que ton code est faux.

        Voici quelques cas dont il faudrait écrire les tests (et corriger le code) pour respecter tes critères d'exigences :

        compte cpt = new compte(20);
        cpt.debiter(50);

        compte cpt = new compte(20);
        cpt.virement(50);

        compte cpt = new compte(20);
        cpt.debiter(-50);

        compte cpt = new compte(20);
        cpt.virement(-50);