On aborde à présent la création d'une classe de test et comment créer un ensemble de tests unitaires permettant de contrôler le comportement de la classe Counter
définie précédemment.
Dans le même package MyCounter
, on définit une nouvelle classe CounterTest
qui hérite de la classe TestCase
.
TestCase subclass: #CounterTest instanceVariableNames: '' classVariableNames: '' package: 'MyCounter'
Une fois le code sauvegardé, une nouvelle classe apparaît dans le package, elle est préfixée par un bouton gris. Si on clique sur le bouton on voit s'afficher le message “CounterTest No tests ran”, c'est normal aucun test n'est encore définit. Pour créer un test, on va définir une méthode d'instance
testCreateCounterSetAndRead "Create a Counter instance, set counter value and verify counter value" | aCounter | aCounter := Counter new setCounter: 33. self assert: aCounter getCounter equals: 33.
Si maintenant on clique à nouveau sur le bouton gris en entête de la classe CounterTest
, un message indique qu'un test à été exécuté. Il a réussi, le bouton est coloré en vert.
Le Test-Driven Development (TDD), ou développement piloté par les tests, est une méthode de développement logiciel qui consiste à concevoir un logiciel par petites étapes, de façon progressive, en écrivant avant chaque partie du code source propre au logiciel les tests correspondants et en remaniant le code du logiciel continuellement jusqu'à ce qu'il satisfasse les tests pré-établis.
Ce mode de développement peut facilement être mis en œuvre dans l'environnement Pharo. Pour l'exemple on va ajouter une fonctionnalité à notre classe Counter
, par exemple une méthode incrémentant le compteur.
Comme on souhaite appliquer le TDD1), on va commencer par écrire le test qui va vérifier qu'après l'appel de la méthode Counter»Increment la valeur du compteur est bien augmentée d'une unité.
Pour définir un nouveau test, sélectionner la classe TestCounter
puis une méthode préexistante, (ici testCreateCounterSetAndRead
). L'action de renommer la méthode en TestIncrement
et d'enregistrer les modifications conduira à la création d'une nouvelle méthode:
" TestCounter >> TestIncrement"
testIncrement
"Create a Counter instance, incrment counter value and verify counter value"
| aCounter |
aCounter := Counter new setCounter: 10.
aCounter increment.
self assert: aCounter getCounter equals: 11.
Si on lance le test immédiatement, on obtient une erreur (“Instance of Counter did not understand #increment”), c'est normal: pour le moment la méthode Counter » increment
n'existe pas, on va la définir de la même manière que pour la méthode de test précédente, on sélectionne la classe Counter
, on modifie le nom et le comportement d'une méthode existante puis on enregistre.
"Counter >> increment" increment "add unit at counter value" count := 1 + count
A présent si on relance le test, il réussit: la méthode est testée et se comporte comme prévu.
Comme on a pu le montrer ici, l'EDI Pharo permet de facilement mettre en œuvre un TDD qui permet de penser au comportement que l'objet va avoir, décrire le test et ensuite implémenter la fonctionnalité, le comportement.