Vous avez besoin de tester la génération d'images, de graphiques, de code, ou d'autres résultats difficiles à vérifier? Essayez les tests d'approbation…

Les tests d'approbation

Les tests d'approbation (approval testing) sont une technique de test automatisé qui consiste à vérifier que le code produit les résultats attendus en comparant ces résultats à une chaîne de référence préalablement approuvée, appelée "golden master". Ils sont conçus pour garantir la qualité du code en détectant les modifications apportées celui-ci et qui peuvent affecter les résultats de manière inattendue.

Les tests d'approbation sont souvent utilisés pour les cas où les résultats sont difficiles à vérifier automatiquement, comme les résultats d'un rendu graphique ou d'une sortie de texte, ou, au lieu de tester chaque entrée et chaque sortie individuellement, les tests d'approbation permettent de vérifier l'intégralité de résultats sérialisé en une seule étape.

La librairie ApprovalTests

ApprovalTests est une bibliothèque open source pour la vérification de tests d'approbation. Elle existe dans différents langages (.Net, Java, Python, Go, ...). Elle facilite la création et l'exécution de ces tests en fournissant des outils pour comparer les résultats des tests avec les chaînes de référence et en gérant les fichiers de référence de manière transparente.

Afin de montrer comment la librairie fonctionne, nous allons utiliser sa version .Net dans les exemples à venir. Très bien intégrée à l'écosystème .Net, la librairie utilise l'infrastructure de test de la plateforme.

Installation

Pour installer la bibliothèque ApprovalTests dans Visual Studio, vous pouvez utiliser NuGet via le Package Manager. Dans la console, tapez la commande suivante pour installer la dernière version :

Install-Package ApprovalTests

Utilisation

Voici un exemple d'utilisation de cette librairie qui est extrait d'un projet personnel d'implémentation d'exemples d'utilisation de la librairie ANTLR4 en C#:

[UseReporter(typeof(VisualStudioReporter))]
public class Examples {

    [Fact]
    public void SomeTest() {
        // Setup
        AntlrInputStream inputStream = AntlrInputStreamReader.Read("{1,{2,3},4}");
        GRun             grun        = GRun.Read(inputStream);
        // Exercise
        string mermaidStyleTree = grun.ToMermaidStyleTree();
        // Verify
        Approvals.Verify(mermaidStyleTree);
    }

DiffToolReporter

Dans cet exemple, la première ligne indique quel DiffToolReporter la librairie va utiliser.

Un reporter est un composant qui est utilisé pour afficher la sortie des tests d'approbation dans un format spécifique. Il peut prendre en charge différents types de fichiers, comme des fichiers texte, des images, des fichiers HTML, etc. Les reporters peuvent également prendre en charge différents types de comparaisons, comme la comparaison de fichiers à l'aide de diff standard ou via un outil de comparaison visuelle.

Il existe des reporters par défaut dans ApprovalTests qui peuvent être utilisés pour afficher la sortie dans le terminal ou dans une fenêtre de navigateur. Il est également possible de créer des reporters personnalisés en implémentant l'interface IApprovalFailureReporter, pour ainsi ajouter des fonctionnalités spécifiques pour votre usage.

En utilisant des reporters vous pouvez définir comment sera affiché la comparaison des valeurs attendues et des valeurs obtenues pour chaque test d'approbation. Cela permet d'adapter l'affichage de ces comparaisons selon les besoins de votre projet.

Approvals

Les lignes 7 à 10 préparent et exécute le test, ici la génération d'un arbre syntaxique au format Mermaid. La sortie de l'exécution est la variable mermaidStyleTree qui contient la chaîne de caractères suivante:

graph TD
	1["init"] --> 2["{"]
	1 --> 3["value"]
	3 --> 4["1"]
	1 --> 5[","]
	1 --> 6["value"]
	6 --> 7["init"]
	7 --> 8["{"]
	7 --> 9["value"]
	9 --> 10["2"]
	7 --> 11[","]
	7 --> 12["value"]
	12 --> 13["3"]
	7 --> 14["}"]
	1 --> 15[","]
	1 --> 16["value"]
	16 --> 17["4"]
	1 --> 18["}"]

fichier qui produira le graphique suivant une fois interprété:

On voit qu'une comparaison "traditionnelle" avec les assertions est compliquée.

Nous utilisons dans ce cas la méthode Approvals.Verify() qui va faire la magie.

Lors de la première exécution du test celui-ci va échouer indiquant que le fichier {NomClasseTestee.NomMethodeTestee.approved.txt} n'a pas été trouvé ;

un fichier nommé {NomDeLaClasseTestee.NomDeLaMethodeTestee.received.txt} a été généré et ajouté à la solution ainsi que le fichier nommé {NomClasseTestee.NomMethodeTestee.approved.txt} -- qui est créé après que le test ai échoué ;

le reporter sélectionné, ici dans l'exemple le VisualStudioReporter, apparaît et affiche le diff.

Résultat de test d'approbation non approuvé

Si le résultat attendu est connu, il suffit de le copier / coller dans la fenêtre de droite, de contrôler les différences pour analyse puis enregistrer. Ce fichier de droite est le fameux {NomClasseTestee.NomMethodeTestee.approved.txt} qui manquait et faisait échoué le test.

Fichiers d'approbations générés

Si le résultat de l'exécution du test correspond à ce que vous venez d'enregistrer, alors lorsque vous allez ré-exécuter ce test, celui-ci passera au vert.

Test d'approbation validé

Si par la suite une modification de code venait à casser le test vous obtiendriez une exception de type ApprovalMismatchException:

Un écart entre les données approuvées et le résultat de l'exécution du test a été détecté

En quelques lignes de code seulement nous avons pu tester facilement la génération du graphique.

Conclusion

Grâce aux tests d'approbation, en utilisant par exemple la librairie ApprovalTests en C#, les développeurs peuvent être plus efficaces car cette technique facilite la vérification de la conformité des fonctionnalités du système avec les exigences spécifiées pour des cas complexes comme avec la comparaison de fichiers, de chaînes de caractères ou d'objets sérialisés.

Références