Les tests unitaires vs tests d'intégration avec Spring
Je suis en train de travailler sur un Spring MVC projet, et j'ai des tests unitaires pour l'ensemble des divers éléments dans l'arbre source.
Par exemple, si j'ai un contrôleur de HomeController
, qui doit avoir un LoginService
injecté dans, alors dans mon unité de test HomeControllerTest
j'ai simplement créer une instance de l'objet en tant normal (en dehors de Printemps) et injecter de la propriété:
protected void setUp() throws Exception {
super.setUp();
//...
controller = new HomeController();
controller.setLoginService( new SimpleLoginService() );
//...
}
Cela fonctionne très bien pour tester chaque composant comme une unité isolée - sauf que maintenant que j'ai quelques dizaines de classes dans le projet, après l'écriture d'une classe et de l'écriture avec succès un test unitaire pour elle, j'oublie de mettre à jour mon Spring MVC fichier de contexte qui fait tout le câblage dans l'application déployée. Je trouve que j'ai oublié de mettre à jour le fichier de contexte quand j'déployer le projet sur Tomcat et trouver un tas de NullPointers de non-câblé haricots.
Donc, voici mes questions:
-
C'est mon premier projet pour le Printemps - est-il normal de créer des tests unitaires pour l'individu, les haricots, comme je l'ai fait, et ensuite de créer une deuxième série de tests (tests d'intégration) pour tester que tout fonctionne comme prévu avec le contexte de l'application? Est-il une meilleure pratique établie pour cette?
-
En outre, comment voulez-vous séparer les tests unitaires à partir des tests d'intégration? J'ai tout le code source dans
src
, les tests unitaires danstest
- devrait-il y avoir un 2ème dossier de test (commetest-integration
) pour l'intégration des cas de test?
Comme c'est mon premier projet pour le Printemps, je suis curieux de voir comment les autres vont habituellement à propos de faire ce genre de chose - et plutôt que de ré-inventer la roue, je préfère demander au reste de la communauté.
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas parler pour être une bonne pratique, mais voici ce que j'ai fait dans le passé.
Tests unitaires:
test
répertoire. À l'aide deTest
ouTestCase
comme un préfixe ou un suffixe à celui de la classe semble être largement pratiqué.Tests D'Intégration:
AbstractIntegrationTestCase
qui met en place unSpring
WebApplicationContext
pour une utilisation dans intetgration test clases.test
répertoire. J'ai utiliséIntTest
ouIntegrationTest
comme un préfixe ou un suffixe pour ces tests.Mis en place trois Ant
test
objectifs:test
semble être l'utilisation la plus courante pour les tests unitairesComme indiqué, vous pouvez utiliser les conventions de nommage qui font sens pour votre projet.
À la séparation de l'unité à partir de tests d'intégration dans un répertoire séparé, je ne pense pas que cela importe, tant que les développeurs et de leurs outils pouvez trouver et d'exécuter facilement.
Comme un exemple, le dernier projet en Java, j'ai travaillé avec le Printemps utilisé exactement ce qui est décrit ci-dessus, avec les tests d'intégration et tests unitaires vivant dans le même
test
répertoire. Graal des projets, d'autre part, explicitement unité séparée et test d'intégration sous-répertoires d'un test général de répertoire.Quelques cas isolés de points:
Oui, c'est une approche commune pour le Printemps de test séparée des tests unitaires et des tests d'intégration où les anciens ne charge pas tout le Printemps contexte.
Pour vos tests unitaires, peut-être envisager de se moquant de s'assurer que vos tests sont concentrés sur un isolé module.
Si vous êtes tests de câblage dans une tonne de dépendances alors qu'ils ne sont pas vraiment des tests unitaires. Ils sont les tests d'intégration où vous êtes le câblage de dépendances à l'aide de nouvelles plutôt que de l'injection de dépendance. Un gaspillage de temps et d'efforts redondants lorsque votre application en production utilise le Printemps!
Base de tests d'intégration pour apporter votre Printemps contextes sont utiles.
L' @annotation requise peut vous aider à vous assurer d'attraper les dépendances nécessaires dans votre Ressort de câblage.
Peut-être regarder dans Maven qui vous donnera explicite phases de lier votre appareil et les tests d'intégration sur. Maven est très largement utilisé dans le Ressort de la communauté.
Beaucoup de la fastidieuse double-tenue de la comptabilité avec le printemps s'en va, si vous aussi passer à un niveau purement annoté régime, où vous annoter tous vos haricots avec @Composant, @Contrôleur, @Service et @Référentiel. Juste ajouter @Autocâblés pour les attributs que vous avez besoin pour obtenir injecté.
Voir la section 3.11 du printemps manuel de référence. http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config
Sur une note connexe, nous avons été à l'aide de la division de l'Unité/Integratrion tests KenG décrire. Dans mon dernier régime que nous avons également introduit une troisième "classe" des tests", ComponentTests". Ces exécuté avec plein printemps de câblage, mais avec filaire stub implémentations (à l'aide de component-scan des filtres et des annotations au printemps).
La raison que nous avons fait, c'est parce que pour certains le "service" de la couche, vous vous retrouvez avec une effroyable quantité de main-codé câblage logique manuellement le fil de la fève, et parfois des quantités ridicules de la maquette des objets. 100 lignes de câblage pour 5 lignes de test n'est pas rare. Les tests d'éléments de remédier à ce problème.
Utiliser le InitializingBean interface (implémente une méthode "afterPropertiesSet") ou de spécifier une init-method pour vos haricots. InitializingBean est généralement plus facile parce que vous n'avez pas besoin de n'oubliez pas d'ajouter la méthode init de vos haricots.
Utilisation afterPropertiesSet pour s'assurer que tout est injecté dans la non-nulle, si elle est nulle, lance une Exception.
Lorsque j'ai créé les tests d'intégration pour les applications web, je les ai mis dans un répertoire séparé. Ils sont construits en utilisant jUnit ou TestNG et d'interagir avec le système en cours de test à l'aide de quelque chose comme Le sélénium qui frappe les pages web comme si elles étaient des utilisateurs. Le cycle aller comme ceci: compilation, exécution de tests unitaires, de construire l'application web, la déployer sur un serveur en cours d'exécution, exécuter les tests, annulez le déploiement de l'application, et de faire rapport des résultats. L'idée est de tester l'ensemble du système.
À l'égard de l'exécution des tests unitaires séparément à partir de tests d'intégration, j'ai mis tous les derniers dans une intégration-répertoire test et de les exécuter à l'aide de l'IDE/Ant à l'aide d'une approche comme cette. Fonctionne pour moi.
la différence entre le test unitaire et d'intégration, test , test de l'unité ne prend pas nécessairement en charge de votre contexte, vous êtes en se concentrant sur le code que vous avez écrit - il fonctionne échoue rapide , c'est avec et sans exceptions, en se moquant tout dépend des appels en elle.
Mais dans le cas de tests d'intégration , vous pouvez charger le contexte et effectuer la procédure de fin de fin de test comme de véritables scénarios.