J'ai hérité d'une charge de tests Junit, mais ces tests (à part la plupart ne fonctionnent pas) sont un mélange de tests unitaires réels et de tests d'intégration (nécessitant des systèmes externes, une base de données, etc.).
J'essaie donc de penser à un moyen de les séparer, de sorte que je puisse exécuter le test unitaire rapidement et rapidement et les tests d'intégration après cela.
Les options sont ..
Divisez-les en répertoires séparés.
Passez à Junit4 (à partir de la v3) et annotez les classes pour les séparer.
Utilisez une convention de dénomination de fichier pour dire ce qu'est une classe, c'est-à-dire AdapterATest et AdapterAIntergrationTest.
3 a le problème qu'Eclipse a la possibilité de "Exécuter tous les tests dans le projet / package ou dossier sélectionné". Il serait donc très difficile d'exécuter simplement les tests d'intégration.
2: court le risque que les développeurs commencent à écrire des tests d'intégration dans des classes de tests unitaires et cela devient juste compliqué.
1: Cela semble être la solution la plus soignée, mais mon instinct dit qu'il doit y avoir une meilleure solution là-bas.
C'est donc ma question, comment séparez-vous les tests d'intégration et les tests unitaires appropriés?
la source
Réponses:
J'utilise actuellement des répertoires séparés en raison de la politique organisationnelle (et de l'héritage de Junit 3), mais je cherche moi-même à passer aux annotations maintenant que je suis sur Junit 4.
Je ne serais pas trop préoccupé par les développeurs qui mettent des tests d'intégration dans vos classes de tests unitaires - ajoutez une règle dans vos normes de codage si nécessaire.
Je suis intéressé de savoir quelles sortes d'autres solutions pourraient exister en dehors des annotations ou de la séparation physique des classes.
la source
Vous pouvez les diviser très facilement en utilisant les catégories JUnit et Maven.
Ceci est montré très, très brièvement ci-dessous en fractionnant les tests unitaires et d'intégration.
Définir une interface de marqueur
La première étape du regroupement d'un test à l'aide de catégories consiste à créer une interface de marqueurs.Cette interface sera utilisée pour marquer tous les tests que vous souhaitez exécuter comme tests d'intégration.
Marquez vos classes de test
Ajoutez l'annotation de catégorie en haut de votre classe de test. Il prend le nom de votre nouvelle interface.
Configurer les tests unitaires Maven
La beauté de cette solution est que rien ne change vraiment pour le côté test unitaire des choses.Nous ajoutons simplement une configuration au plugin maven surefire pour qu'il ignore les tests d'intégration.
Lorsque vous effectuez un test de nettoyage mvn, seuls vos tests unitaires non marqués seront exécutés.
Configurer les tests d'intégration Maven
Là encore, la configuration est très simple.Pour exécuter uniquement les tests d'intégration, utilisez ceci:
Si vous encapsulez ceci dans un profil avec id
IT
, vous ne pouvez exécuter que les tests rapides à l'aide demvn clean install
. Pour exécuter uniquement les tests d'intégration / lent, utilisezmvn clean install -P IT
.Mais le plus souvent, vous voudrez exécuter les tests rapides par défaut et tous les tests avec
-P IT
. Si tel est le cas, vous devez utiliser une astuce:Comme vous pouvez le voir, j'exclus les tests annotés avec
java.io.Serializable
. Ceci est nécessaire car le profil héritera de la configuration par défaut du plugin Surefire, donc même si vous dites<excludedGroups/>
ou<excludedGroups></excludedGroups>
, la valeurcom.test.annotation.type.IntegrationTest
sera utilisée.Vous ne pouvez pas non plus l'utiliser
none
car il doit s'agir d'une interface sur le chemin de classe (Maven vérifiera cela).Remarques:
surefire-junit47
n'est nécessaire que lorsque Maven ne bascule pas automatiquement vers le runner JUnit 4. L'utilisation de l' élémentgroups
ouexcludedGroups
devrait déclencher le commutateur. Regardez ici .@RunWith()
annotations pour exécuter des suites ou des tests basés sur Spring.la source
Nous utilisons Maven Surefire Plugin pour exécuter des tests unitaires et Maven Failsafe Plugin pour exécuter des tests d'intégration. Les tests unitaires suivent les
**/Test*.java **/*Test.java **/*TestCase.java
conventions de dénomination, les tests d'intégration -**/IT*.java **/*IT.java **/*ITCase.java
. C'est donc en fait votre option numéro trois.Dans quelques projets, nous utilisons TestNG et définissons différents groupes de test pour l'intégration / les tests unitaires, mais cela ne vous convient probablement pas.
la source
Je passerais à Junit4 juste pour l'avoir :)
Vous pouvez les séparer en différentes suites de tests. Je ne sais pas comment ils sont organisés dans Junit3 mais il devrait être facile dans Junit4 de créer des suites de tests et de mettre tous les tests unitaires réels dans l'un d'eux, puis d'utiliser une deuxième suite pour les tests d'intégration.
Définissez maintenant une configuration d'exécution pour les deux suites dans eclipse et vous pouvez facilement exécuter une seule suite. Ces suites pourraient également être lancées à partir d'un processus automatisé vous permettant d'exécuter les tests unitaires à chaque fois que la source change et peut-être les tests d'intégration (s'ils sont vraiment volumineux) une seule fois par jour ou une fois par heure.
la source
L' utilisation de l'annotation de printemps IfProfileValue permet d'y parvenir sans plug-in maven ou configuration requise.
Annoter les classes ou méthodes de test d'intégration à l'aide de IfProfileValue
Pour exécuter à l'aide de tests unitaires uniquement:
Pour exécuter à l'aide du test d'intégration et des tests unitaires:
De plus, "Exécuter tous les tests" dans un IDE n'exécuterait que des tests unitaires. Ajoutez des
-Dtest-groups=integration
arguments à la VM pour exécuter à la fois l'intégration et les tests unitaires.la source
Il n'y a pas une seule bonne réponse. Comme vous l'avez expliqué, il existe plusieurs façons de le faire qui fonctionneront. J'ai fait à la fois le schéma de nommage des fichiers et la division des choses dans différents répertoires.
Il semble que diviser quelque chose en différents répertoires pourrait mieux fonctionner pour vous, et cela me semble un peu plus clair, alors je me pencherais vers cela.
Je ne pense pas que j'essaierais les annotations parce que cela me semble plus précis. Voulez-vous vraiment que ces deux types de tests soient mélangés dans le même fichier? Je ne le ferais pas.
la source