Test unitaire junit [Résolu/Fermé]

Signaler
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018
-
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018
-
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

Messages postés
16366
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 juin 2021
2 848
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

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018

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));

}
}
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018
>
Messages postés
16366
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 juin 2021

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.
Messages postés
16366
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 juin 2021
2 848 >
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018

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);
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018
>
Messages postés
16366
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 juin 2021

J'ai repris le code et j'ai testé avec les exemples. il a l'air de fonctionner correctement(il y a sans doute trop de If):
voila mon code:

package comptebancaire;

public class Compte {
private int s;

public Compte (int c) {
this.s= c;
}

public int consultation() {
return s;

}
public void crediter(int c) {
if ( c<=0) {
System.out.println("l'opération est impossible");
}
this.s = c + this.s;

}

public void virement(int v) {
int c=0;
c= this.s ;
if ( v<=0) {
System.out.println("l'opération est impossible");
}
if (c<v) {
System.out.println("la somme est superieur au solde");

}
this.s = v + this.s;

}



public void debiter(int d) {
int c=0;
c= this.s ;
if ( d<=0) {
System.out.println("l'opération est impossible");
}

if (c<d) {
System.out.println("la somme est superieur au solde");
}
int e = c - d;
if (e<=0) {
System.out.println("impossible car le solde est insuffisant");
}
this.s = this.s - d;

}



public static void main(String[] args) {
Compte cpt = new Compte(20);
cpt.virement(-50);

}

}


Maintenant pour les tests je ne comprend pas trop. Comment je suis sensé faire sans traiter des cas particuliers?
Messages postés
16366
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 juin 2021
2 848 >
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018

Pour les tests tu fais autant de scénarios que nécessaire.

Exemple :

@Test
public void testDebitNormal() {
    compte cpt = new compte(50);
    cpt.debiter(20);
    Assertions.assertEquals(30, cpt.consultation());
}

@Test
public void testDebitAvecValeurNegative() {
    compte cpt = new compte(20);
    cpt.debiter(-50);
    Assertions.assertEquals(20, cpt.consultation());
}

@Test
public void testDebitAvecValeurSuperieureAuSolde() {
    compte cpt = new compte(20);
    cpt.debiter(50);
    Assertions.assertEquals(20, cpt.consultation());
}

Remarque : plutôt que des System.out.println il serait plus pertinent de faire de la levée d'exceptions ou de renvoyer un statut de succès/échec de l'opération afin de pouvoir récupérer cette anomalie (et la tester).

Exemple :

public boolean debiter(int valeur) {
    if (valeur <= 0)
        return false; // échec
    // ...
}

public void debiter(int valeur) {
    if (valeur <= 0)
        throw new IllegalArgumentException("Débit négatif : " + valeur);
    // ...
}

Remarque : c'est bizarre de manipuler des int pour des valeurs monétaires (où sont les centimes ?)
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018
>
Messages postés
16366
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 juin 2021

désolé pour le temps de réponse.
Je comprends mieux maintenant. Je vais faire plus d'exercices pour m'améliorer.
Pour les int je vais les modifier; et pour la levée d'exception je vais essayer d'en faire(c'est vrai que c'est plus net et c'est mieux de débuter avec de bons réflexes.)
Merci beaucoup.