Introduction aux tests en Java
Maria Milusheva
Senior Software Engineer
Jusqu'ici, nous n'avons écrit des tests qu'après le code de production.
En TDD, on écrit les tests avant tout code de production
Pourquoi faire du TDD ?
1. Écrire un test en échec avant tout code de production
2. Écrire le test le plus court possible
3. Ne pas écrire plus de code de production que nécessaire pour faire passer le test
Appliquer ces étapes dans l'ordre = un cycle de TDD
Le développement progresse par cycles répétés de TDD
Supposons que nous voulions écrire une méthode qui vérifie si un entier est un palindrome
Exemples d'entiers palindromes : 12321, 0, 3333
@Test
public void isPalindrome_nonPalindromicInt_returnsFalse() {
int number = 1234;
assertFalse(isPalindrome(number)); // isPalindrome() n'est pas encore écrite
}
Un test est comme un mémo pour nos « nous » futurs, rappelant les exigences du projet.
public boolean isPalindrome(int num) {
return false; // Écrire le code minimal pour satisfaire le test.
}
Le test passe. On peut lancer le cycle de TDD suivant.
Nouveau test – nouvelle exigence pour la fonctionnalité :
@Test
public void isPalindrome_PalindromicInt_ReturnsTrue() {
int number = 1234321; // Écrire maintenant un cas de test plus complexe.
assertTrue(isPalindrome(number)); // À ce stade, isPalindrome() va échouer.
}
public boolean isPalindrome(int num) {
int inverted = 0;
while (num != 0) {
// À chaque itération, prendre le dernier chiffre avec % 10
// et l'ajouter à inverted * 10.
inverted = inverted * 10 + num % 10;
// Une fois le dernier chiffre traité, le supprimer avec / 10.
num = num / 10;
}
return inverted;
}
Le TDD est excellent pour corriger les bugs !
La méthode que nous venons d'écrire renvoie true pour number = -121. Ce n'est pas correct !
Nous écrivons un test unitaire pour illustrer le bug :
@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
int number = -121; // Pas un palindrome, car -121 n'est pas égal à 121-.
assertFalse(isPalindrome(number));
}
public boolean isPalindrome(int num) {
if (num < 0) {
return false; // Ajouter une clause pour renvoyer false pour les valeurs négatives.
}
int inverted = 0;
while (num != 0) {
inverted = inverted * 10 + num % 10;
num = num / 10;
}
return inverted;
}
Introduction aux tests en Java