web-dev-qa-db-fra.com

Tests basés sur les données avec jUnit

Qu'utilisez-vous pour écrire des tests pilotés par les données dans jUnit?

(Ma définition de) un test piloté par les données est un test qui lit les données d'une source externe (fichier, base de données, ...), exécute un test par ligne/fichier/quel que soit et affiche les résultats dans un programme d'exécution comme si vous aviez des tests séparés - le résultat de chaque analyse est affiché séparément, pas dans un seul gros agrégat.

29
ripper234

Dans JUnit4, vous pouvez utiliser le paramètre Parameterized testrunner pour effectuer des tests pilotés par les données.

Ce n'est pas très bien documenté, mais l'idée de base est de créer une méthode statique (annotée avec @Parameters) qui renvoie une collection de tableaux d'objets. Chacun de ces tableaux est utilisé comme argument du constructeur de la classe de test. Les méthodes de test habituelles peuvent ensuite être exécutées à l'aide de champs définis dans le constructeur.

Vous pouvez écrire du code pour lire et analyser un fichier texte externe avec la méthode @Parameters (ou obtenir des données provenant d'une autre source externe). Vous pourrez ensuite ajouter de nouveaux tests en modifiant ce fichier sans les recompiler.

39
matt

C’est là que TestNG, avec son @DataSource, brille. C'est une des raisons pour lesquelles je le préfère à JUnit; les autres sont des dépendances et des tests en parallèle.

9
duffymo

J'utilise une base de données en mémoire telle que hsqldb afin de pouvoir pré-renseigner la base de données avec un ensemble de données de type "production" ou de commencer avec une base de données hsqldb vide et de la remplir avec des lignes que je besoin d'effectuer mes tests. En plus de cela, je vais écrire mes tests en utilisant JUnit et Mockito .

8
digiarnie

J'utilise une combinaison de dbUnit , jMock et jUnit 4. Ensuite, vous pouvez le lancer en tant que suite ou séparément.

4
Bostone

Il est préférable d’étendre TestCase avec un «DataDrivenTestCase» adapté à vos besoins. Voici un exemple concret: http://mrlalonde.blogspot.ca/2012/08/data-driven -tests-with-junit.html

Contrairement aux tests paramétrés, il permet des cas de test bien nommés.

3
Mathieu

Je suis avec @ DroidIn.net, c’est exactement ce que je fais, mais pour répondre littéralement à votre question "et affiche les résultats dans un programme de test comme si vous aviez des tests séparés", vous devez consulter le programme JUnit4 Parameterized. DBUnit ne fait pas ça. Si vous devez faire beaucoup de choses là-dessus, honnêtement, TestNG est plus flexible, mais vous pouvez absolument le faire dans JUnit.

Vous pouvez également consulter le programme d'exécution de JUnit Theories, mais je me souviens qu'il n'est pas idéal pour les ensembles de données pilotés par les données, ce qui est logique car JUnit ne consiste pas à travailler avec de grandes quantités de données externes.

1
Yishai

Même s'il s'agit d'un sujet assez ancien, je pensais toujours apporter ma contribution. Je pense que le soutien de JUnit pour les tests pilotés par les données est trop faible et trop hostile. pour par exemple. pour utiliser paramétré, nous devons écrire notre constructeur. Avec Theories runner, nous n’avons aucun contrôle sur l’ensemble des données de test transmises à la méthode de test.

Il y a d'autres inconvénients identifiés dans cette série d'articles de blog: http://www.kumaranuj.com/2012/08/junits-parameterized-runner-and-data.html

Il existe maintenant une solution complète qui se présente sous la forme d’EasyTest, un framework étendu de JUnit et destiné à fournir de nombreuses fonctionnalités à ses utilisateurs. Son objectif principal est d'effectuer des tests pilotés par les données à l'aide de JUnit, bien qu'il ne soit plus nécessaire de dépendre réellement de JUnit. Voici le projet github pour refernece: https://github.com/anujgandharv/easytest

Si quelqu'un est intéressé à donner son opinion, son code ou ses suggestions, c'est le moment. Vous pouvez simplement aller dans le dépôt github et créer des problèmes.

1
Anuj

Certains tests se prêtent à l’interface.

Si les lectures de base de données/fichier sont récupérées par un appel d'interface, il vous suffit simplement de demander à votre test unitaire de mettre en œuvre l'interface et la classe de test unitaire peut renvoyer les données que vous souhaitez.

0
Fortyrunner

Nous avons actuellement un fichier d'accessoires avec nos numéros d'identification. C'est horriblement fragile, mais il est facile d'obtenir quelque chose. Notre plan est d’avoir initialement ces numéros d’identification remplaçables par les propriétés -D dans nos versions de fourmi. 

Notre environnement utilise une base de données héritée avec des données extrêmement entremêlées qui ne peuvent pas être chargées avant une exécution (par exemple, par dbUnit). Nous souhaiterions éventuellement arriver à un test unitaire qui interrogerait la base de données pour rechercher un ID avec la propriété testée, puis utiliser cet ID dans le test unitaire. Cela serait lent et s'appellerait plutôt un test d'intégration, pas un "test unitaire", mais nous le testerions avec des données réelles pour éviter la situation dans laquelle notre application fonctionne parfaitement avec des données de test mais échoue avec des données réelles.

0
Ed Griebel

Les tests basés sur les données utilisent généralement un petit composant testable pour gérer les données. (Objet de lecture de fichier ou objets fictifs) Pour les bases de données et les ressources en dehors de l'application, les fesses sont utilisées pour simuler d'autres systèmes. (Services Web, bases de données, etc.). Je vois généralement qu'il existe des fichiers de données externes qui gèrent les données et la sortie. De cette façon, le fichier de données peut être ajouté au VCS. 

0
monksy