Test unitaire junit

Résolu/Fermé
etbienwi Messages postés 18 Date d'inscription lundi 16 octobre 2017 Statut Membre Dernière intervention 22 mai 2018 - 16 oct. 2017 à 12:23
etbienwi Messages postés 18 Date d'inscription lundi 16 octobre 2017 Statut Membre Dernière intervention 22 mai 2018 - 23 oct. 2017 à 10:11
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

KX Messages postés 16635 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 27 novembre 2022 2 981
Modifié le 16 oct. 2017 à 13:18
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
etbienwi Messages postés 18 Date d'inscription lundi 16 octobre 2017 Statut Membre Dernière intervention 22 mai 2018
16 oct. 2017 à 22:30
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));

}
}
0
KX Messages postés 16635 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 27 novembre 2022 2 981
16 oct. 2017 à 23:16
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());
}
0
etbienwi Messages postés 18 Date d'inscription lundi 16 octobre 2017 Statut Membre Dernière intervention 22 mai 2018 > KX Messages postés 16635 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 27 novembre 2022
17 oct. 2017 à 09:11
Je 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?
0
KX Messages postés 16635 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 27 novembre 2022 2 981 > etbienwi Messages postés 18 Date d'inscription lundi 16 octobre 2017 Statut Membre Dernière intervention 22 mai 2018
17 oct. 2017 à 13:30
"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.)
0
etbienwi Messages postés 18 Date d'inscription lundi 16 octobre 2017 Statut Membre Dernière intervention 22 mai 2018 > KX Messages postés 16635 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 27 novembre 2022
17 oct. 2017 à 14:50
Ce 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.
0
KX Messages postés 16635 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 27 novembre 2022 2 981 > etbienwi Messages postés 18 Date d'inscription lundi 16 octobre 2017 Statut Membre Dernière intervention 22 mai 2018
17 oct. 2017 à 15:49
Le 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);
0