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
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
A voir également:
- Test unitaire junit
- Test performance pc - Guide
- Test composant pc - Guide
- Redmi note 13 5g test - Accueil - Téléphones
- Test performance pc gratuit - Accueil - Utilitaires
- Test hdd - Télécharger - Informations & Diagnostic
2 réponses
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
Modifié le 16 oct. 2017 à 13:18
Modifié le 16 oct. 2017 à 13:18
Bonjour,
Quelle version de JUnit utilises-tu ?
Parce que
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 :
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
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
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
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.
— 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));
}
}
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
16 oct. 2017 à 23:16
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
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 :
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()); }
etbienwi
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018
>
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
17 oct. 2017 à 09:11
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:
Est ce que c'est bien comme cela que j’étais sensé le faire?
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?
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
>
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
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 :
Ici
De ton code ce que tu testes c'est
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.)
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.)
etbienwi
Messages postés
18
Date d'inscription
lundi 16 octobre 2017
Statut
Membre
Dernière intervention
22 mai 2018
>
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
17 oct. 2017 à 14:50
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:
je l'ai testé et il fonctionne.
— 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.
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
>
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
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 :
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);