Un article récent sur Reddit a suscité un débat entre les partisans de JUnit et du framework de test Spock, basé sur un billet de blog par Jakub Dziworsk avec comme thème central "Quel est le problème avec JUnit ?". Il semble que chaque référentiel GitHub comprenne des tests unitaires JUnit, ce qui ne devrait suprendre personne puisque JUnit existe depuis plus de 15 ans. Pourtant, Spock continue à grignoter.
JUnit a été créé par Kent Beck, créateur d'eXtreme programming, et Erich Gamma, co-auteur de Design Patterns: Elements of Reusable Object-Oriented Software, et est rapidement devenu un standard de facto pour les tests unitaires avec des portages et des clones dans presque tous les langages de programmation couramment répandus. Cependant, les caractéristiques de JUnit ont été remises en question au cours des années en raison de nouveaux frameworks de tests unitaires, comme TestNG et Spock.
TestNG
TestNG a été créé en 2004 par Cédric Beust, co-auteur de Next Generation Java Testing: TestNG and Advanced Topics. Selon le site web de TestNG, "TestNG est un framework de test inspiré de JUnit et de NUnit, mais avec l'introduction de nouvelles fonctionnalités qui le rendent plus puissant et facile à utiliser ... ". Cédric maintient sur son site : "TestNG est né de la frustration de certaines déficiences de JUnit que j'ai documentées sur mon blog ici et là".
Spock
Dans son article, Dziworski remet en question l'utilisation de JUnit combinée à un framework de mock tiers. Il déclare : "Java en combinaison avec ces frameworks rend difficile à lire et écrire des tests dans des projets de taille moyenne et supérieure". Il poursuit en disant : "Si les tests sont difficiles à écrire, nous les voyons généralement comme quelque chose de pénible et commençons à les négliger. Éviter ou retarder l'écriture des tests conduit à la situation où l'on ne peut plus faire confiance à l'application. Nous avons alors peur d'effectuer des modifications parce qu'une autre partie de l'application pourrait boguer d'une manière étrange".
Lors d'une réunion récente du Groupe d'Utilisateurs Java de Grèce, Kostis Kapelonis, auteur de Java Testing with Spock, a fait une présentation dans laquelle il compare JUnit avec Spock.
Spock a été créé en 2008 par Peter Niederwieser, Ingénieur Principal à Gradleware. Bien qu'inspiré de JUnit, les fonctionnalités de Spock en font plus qu'une simple extension de JUnit :
- Les tests sont écrits en Groovy qui peut tester le code écrit en Java.
- Un framework de mock intégré élimine la nécessité d'importer des framework tiers.
- La capacité à fournir des noms personnalisés pour les tests.
- Des blocs prédéfinis de comportement (
given:
,when:
,then:
,expect:
, etc.) pour l'écriture des tests. - L'utilisation des tables de données élimine la nécessité d'utiliser des structures de données.
L'extrait de code suivant (comme indiqué dans le post Reddit) montre certaines de ces caractéristiques:
1 class Math extends Specification {
2 def "maximum of two numbers"(int a, int b, int c) {
3 expect:
4 Math.max(a, b) == c
5 where:
6 a | b | c
7 1 | 3 | 3 // passes
8 7 | 4 | 4 // fails
9 0 | 0 | 0 // passes
}
}
Ce simple exemple de test utilise deux blocs prédéfinis, _expect_:
(ligne 3) et where:
(ligne 5). Le bloc where:
est utilisé pour définir une table de données qui correspond aux résultats de la fonction Math.max
définie en ligne 4. La ligne 2 montre comment un nom personnalisé peut être défini pour un test.
Un projet entier contenant des exemples de code JUnit et Spock se trouve sur GitHub.
Dès 2008, InfoQ a mentionné des spéculations sur la chute de JUnit. Huit ans plus tard JUnit 5 est bien vivant et l'étape 1 est en cours de développement. Testez bien et prospérez !