Nous construisons un clone de Google Photos, et les tests sont sacrément difficiles !
Comment testons-nous que notre application Java génère les bons processus ImageMagick ou que les vignettes résultantes ont la bonne taille et bien des vignettes, pas seulement des images aléatoires de chats ? Comment testons-nous différentes versions et systèmes d’exploitation d’ImageMagick ?
Qu’y a-t-il dans la vidéo
00:00 Introduction
Nous commençons la vidéo avec un aperçu général de ce qui rend le test de notre clone Google Photos si délicat. Comme dans le dernier épisode, nous avons commencé à extraire les vignettes des images, mais nous avons maintenant besoin d’un moyen de tester cela. Comme cela se fait via un processus ImageMagick externe, nous allons faire un tour.
01:05 Configuration de JUnit et écriture des premières méthodes de test
Tout d’abord, nous allons configurer JUnit 5. Comme nous n’utilisons pas un framework comme Spring Boot, c’est un excellent exercice pour ajouter l’ensemble minimal de bibliothèques et de configuration qui nous permet d’être opérationnel avec JUnit. De plus, nous écrirons des squelettes de méthodes de test, tout en réfléchissant à la manière dont nous aborderions le test de notre code existant et en prenant soin de nommer les méthodes de test, etc.
04:19 Mise en œuvre de la détection de version d’ImageMagick
Dans le dernier épisode, nous avons remarqué que l’exécution de notre application Java sur différents systèmes entraînait des résultats inattendus ou tout simplement des erreurs. En effet, différentes versions d’ImageMagick offrent un ensemble différent d’API que nous devons appeler. Par conséquent, nous devons ajuster notre code pour détecter la version d’ImageMagick installée et également ajouter une méthode de test qui vérifie qu’ImageMagick est bien installé, avant exécuter des tests.
10:32 Tester les compromis
Comme il ressort de la détection des versions d’ImageMagick, le vrai problème est que pour atteindre une couverture de test de 100 % avec une variété de systèmes d’exploitation et de versions d’ImageMagick installées, vous auriez besoin d’une configuration CI/CD assez élaborée, que nous n’avons pas dans la portée de ce projet. Nous discutons donc des avantages et des inconvénients de notre approche.
12:00 Implémentation de @EnabledIfImageMagickIsInstalled
Ce que nous pouvons faire, cependant, c’est nous assurer que le reste de notre suite de tests ne s’exécute que si ImageMagick est installé. Ainsi, nous allons écrire une annotation JUnit 5 personnalisée appelée EnabledIfImageMagickIsInstalled
que vous pouvez ajouter à n’importe quelle méthode de test ou même à des classes entières pour activer ledit comportement. Si ImageMagick n’est pas installé, les tests ne fonctionneront tout simplement pas au lieu d’afficher un vilain message d’erreur.
16:05 Tester la création réussie de miniatures
Le plus gros problème à résoudre est : comment affirmer correctement que les vignettes ont été créées correctement ? Nous aborderons cette question en testant le code de sortie d’ImageMagick, en estimant la taille des fichiers, en chargeant également l’image et en nous assurant qu’elle contient la bonne quantité de pixels. Tout cela avec l’aide d’AssertJ et de ses SoftAssertions pour combiner facilement plusieurs assertions en une seule.
23:59 Ne fonctionne toujours que sur ma machine
Même après avoir testé l’ensemble de notre flux de travail, nous devons toujours nous assurer d’appeler une API ImageMagick différente pour différentes versions. Nous pouvons rapidement ajouter ce comportement pour prendre en charge IM6 ainsi que IM7, et nous avons terminé.
25:53 Déploiement
Il est temps de déployer l’application sur mon NAS. Et cette fois-ci, tout fonctionne comme prévu !
26:20 Réflexions finales sur les tests
Nous avons fait pas mal de tests dans cet épisode. Résumons tous les défis et stratégies de tests pragmatiques que nous avons appris.
27:31 Quelle est la suite
Nous terminerons l’épisode en examinant la suite : les problèmes de multithreading !
Rendez-vous au prochain épisode.