Bonjour,
Voilà un retour sur la 69e session qui s'est déroulé mardi dernier.
Bien que nous n'étions pas nombreux (3 où nous avons pu accueillir Victor qui venait pour la première fois), la séance a été assez intéressante de par le fait que nous avons essayé plusieurs stratégies. Par contre, nous n'avons pas pu profiter de visions diverses (peut-être que cela pourra être le cas dans une autre session).
Sous le repository
Dojo69-Filtering vous retrouverez différents tests (cf. les différentes branches avec leur README associé) :
-
ApprovalTests : c'est une librairie que j'ai découvert récemment en préparant notre atelier Développeurs Anonymes avec Johan. J'aurai sans doute l'occasion de vous en reparler. C'est un test orienté test d'intégration qui permet par exemple d'écrire rapidement un test sur un code legacy pour pouvoir le refactorer. L'intérêt de
ApprovalTests est de nous simplifier l'écriture de tels tests en peu de temps. Je l'ai écrit avant la session donc nous en avons discuté rapidement car l'objectif de la session était plus orienté test unitaire ;
-
FilteringTest-ArgumentsMockito : Nous avons écrit un test unitaire pour la classe
Filtering sans mocker la librairie externe
Maven Filtering. Nous avons utilisé mockito pour mocker la classe
Arguments du projet qui est en entrée de la méthode
filter(Arguments arguments). J'ai (je l'ai fait après la séance avant de pousser la branche sur github) utilisé cette fois la librairie
FEST-Assert 2.x afin de pallier aux
limitations de Approval Tests. Cf le
README de la branche pour plus d'explications. Cela fonctionne plutôt bien mais nous trouvons que l'utilisation de mockito ne facilite pas la lecture du test unitaire et que cela pouvait être amélioré (ce que nous avons essayé dans la branche
FilteringTest-DIP).
-
FilteringTest-DIP :
Afin d'améliorer la lecture du test unitaire de la classe Filtering (cf branche
FilteringTest-ArgumentsMockito) nous avons commencé par refactorer le test en l'écrivant de façon plus "naturel/lisible". Après discussion, nous nous sommes rendu compte qu'un problème est que la méthode
Filtering ne respecte pas le principe
DIP (Dependency Inversion Principle, que je vous conseille de lire/relire). Nous avons donc modifié le code source et le test en introduisant une interface IArguments et en fournissant une implantation simplifiée (
ArgumentsMock) pour le test. Nous avons été assez content de se refactoring qui a amélioré le code de notre point de vue.
Le
DIP améliore la réutilisation d'une méthode/classe. Bastien a fait une remarque judicieuse : ce principe s'applique bien aux tests car nous pouvons dire qu'un test unitaire est une des premières réutilisation d'une méthode/classe. Nous pouvons voir ici un lien directe avec le fait que le TDD améliore la conception d'une application. Je vous laisse lire la section
Discussions ;
Nous ensuite essayé de ré-écrire le test unitaire pour la classe
Filtering mais cette fois en mockant la librairie externe
Maven Filtering (Filtering utilise la classe
org.codehaus.plexus.util.FileUtil). En voulant écrire les parties mockito nous avons vite vu les difficultés du fait que la méthode
filter de la classe
Filtering utilise une méthode statique de la librairie externe (
FileUtils.copyFile(from, to, "UTF-8", wrappers)) et instancie les paramètres from, to et wrappers pour cette méthode statique. Cela demande d'utiliser
PowerMockito ou des
ArgumentCaptor de Mockito. Par expérience, cela n'est ni simple, ni très lisible et pose des problèmes de performances (si on utilise PowerMockito). Comme nous n'avions plus beaucoup de temps, nous souhaitions plutôt chercher une autre solution (j'essayerai néanmoins, si je trouve du temps, de rajouter des branches pour montrer ce que cela peut donner). Nous avons réfléchi pour utiliser de nouveau le DIP. Cela devient plus complexe car nous ne maîtrisons pas le code de la librairie externe pour modifier la signature de la méthode afin de rajouter des interfaces. C'est là que nous pouvons voir l'intérêt de la contrainte d'utiliser une librairie qui ne nous appartient pas. Nous avons vite pu voir que si nous devons intégrer une librairie qui n'est pas forcément bien conçu (ou au moins qui ne facilite pas l'écriture des tests) cela gangrène vite notre propre code. Nous n'avons pas eu le temps de terminer un premier draft, c'est pour cela que je n'ai pas ajouté de branche sur le repository pour cette partie. Néanmoins les discussions étaient très intéressantes et nous sommes sorties avec l'envie de continuer cette expérience. Il nous paraît intéressant de trouver une solution élégante à ce problème auquel nous sommes confrontés quotidiennement.
Note (pour ne pas oublier) : j'aimerai aussi rajouter un test unitaire avec l'utilisation de la librairie Zohhak dont je vous ai déjà parlé une fois afin de fournir un exemple avec cette librairie.
Merci à Victor qui a dû suivre au mieux le rythme de nos discussions et à Bastien pour ses idées et remarques qui nous poussent toujours à progresser.
PerspectivesJe vous propose cela :
- Vous pouvez faire des tests chez vous et me pousser vos branches (essayer de faire un README qui explique ce que vous faites et pourquoi) ;
- Nous continuons l'expérience lors d'une prochaine session. De mon côté, je suis partant car j'aimerai pouvoir trouver une solution élégante à notre dernier problème. Votre point de vue m'intéresse.
Rémy