TDD : Test Driven Development

Qu’est-ce qu’un test ?

Un test est simplement un moyen de nous rassurer : est-ce que cela marche ?

Structure d’un test : AAA

  • Arrange

  • Act

  • Assert

Un test sert à maîtriser la complexité : ainsi un test ne doit pas être trop long (à écrire, à lire, à exécuter), il ne doit pas être imprécis (pas de if, de boucle, de « ou »…). Un test ne doit pas être fragile (pas de faux positifs).

Test Driven Development

Le TDD est une méthode de conception basée sur les tests proposée par Kent Beck.

Parfois, le TDD est une pratique auréolée d’un certain respect, mystère ou, au contraire, qui est complètement dénigrée. En fait, le TDD est une façon particulière d’articuler les pratiques de conception logicielle et d’automatisation des tests.

Les étapes du TDD

  1. Écrire un test rouge

  2. Écrire le code le plus simple pour que le test soit vert

  3. Supprimer la duplication (code/test) et améliorer la lisibilité. C’est la phase du refactoring.

../_images/tdd-circle-of-life.png

Pour la phase 2, tous les coups sont permis. Le plus important est de faire passer le test au vert.

Plus généralement, le TDD est une approche avec laquelle on cherche à cadrer la production de code par petits incréments qui marchent (c’est-à-dire qui sont testés).

Qu’est-ce que concevoir ?

La conception logicielle est un domaine souvent envisagé comme autonome. Pour certains, elle relève d’une expertise particulière (architecture logicielle). Pour d’autres, elle relève de l’esthétique : beau code, application de patterns…

Les règles de la conception simple de Kent Beck :

  1. Ça marche (les tests sont verts)

  2. Il n’y a pas de duplication de code

  3. Le code est expressif

  4. Le code contient un nombre minimum de classes et de méthodes

Dans cette vision de la conception, le TDD est bien une pratique de conception pilotée par les tests. Cependant, la conception émerge vraiment à la dernière phase d’un cycle de test au moment du refactoring.

Exercices

Exercice à rendre - Le Kata calculette

Réalisez le Kata String calculator.

Astuce

N’essayez pas d’anticiper le développement. Implémentez les différents points les un après les autres. Le but est de réaliser une conception incrémentale en vous basant sur les tests.

Voici la feuille de route (non restrictive) pour ce Kata :

Créez une simple calculatrice avec une méthode :

int add(String numbers)

  1. Cette méthode prend en paramètre une chaîne de caractères qui représente 0, 1 ou 2 nombres. Elle retournera leur somme (pour une chaîne de caractères vide, elle retournera 0). Par exemple : "", "1" ou "1,2"

  2. Autoriser la méthode add à prendre en compte un nombre quelconque de nombres

  3. Autoriser la méthode add à prendre en compte les retours à la ligne en plus des virgules comme séparateur. Par exemple : "1\n2,3" donne 6

  4. Par contre "1,\n2" n’est pas ok (pas deux séparateurs à la suite)

  5. Autoriser la méthode add à prendre en compte des séparateurs de un caractère. Pour changer de séparateur, la chaînes de caractères peut commencer par la ligne : "//[séparateur]\n". La première ligne est optionnelle et tous les scénarios précédents restent valides. Par exemple : "//;\n1;2" vaut 3

  6. Les nombres supérieurs à 1000 sont ignorés. Par exemple "2,1001" vaut 2

  7. Appeler add avec un nombre négatif dans la chaîne entraîne une exception avec le message "negatives not allowed" suivi du nombre négatif passé dans la chaîne de caractères. S’il y a plusieurs nombre négatifs, il faut tous les ajouter dans le message de l’exception

  8. Le délimiteur peut avoir n’importe quelle longueur. Par exemple : "//:::\n1:::2:::3" vaut 6

  9. Autoriser plusieurs délimiteurs : "//*%\n1*2%3" vaut 6

Modèle de projet Maven

Vous devez télécharger le modèle de projet Maven :

Exercice de refactoring - Battlecode

Battlecode est un exemple de code Java pour un entraînement au refactoring.

Il va vous falloir faire évoluer le code d’une application. Malheureusement, le code n’est pas toujours aussi clair et propre que l’on aimerait.

Heureusement, la couverture de code par les tests est de 100% !

Le code principal tourne autour de la classe action.Fight et de sa méthode execute

Modèle de projet Maven

Vous pouvez récupérer le projet battlecode comme projet Maven :

Exercice à rendre - Jeu Attrape-moi si tu peux

Attrape-moi si tu peux est un jeu à deux joueurs. Les joueurs se déplacent sur une grille de taille 10 sur 10.

Les deux joueurs font une action chacun à leur tour. À son tour, un joueur peut faire une des actions suivantes :

  • pivoter à gauche de 90° (tourner à gauche)

  • pivoter à droite de 90° (tourner à droite)

  • avancer d’une ou deux cases

Si un joueur avance en dehors du plateau, son déplacement est annulé.

Une fois que les deux joueurs ont fait leur action, le jeu indique si un joueur voit un autre joueur et à quelle distance il se situe (le nombre de cases). Un joueur ne voit que ce qui se trouve sur la ligne ou la colonne sur laquelle il est orienté. Ensuite, une nouvelle phase de jeu commence et les joueurs peuvent à nouveau choisir une des trois actions.

Pour gagner, un joueur doit se déplacer sur la même case que l’autre joueur.

Essayez de réaliser ce jeu en TDD. Il ne faut pas intégrer des interfaces graphiques ou des sorties sur la console. Contentez-vous de coder le cœur du jeu : les classes qui permettent de gérer une partie et le déplacement des joueurs.

Modèle de projet Maven

Vous devez télécharger le modèle de projet Maven :