lancement des tests unitaires / spring boot

Modérateurs : graffiop, jmdouin, agoncal, mlebihan

harrak_z
Messages : 66
Inscription : 19 oct. 2019 20:15

lancement des tests unitaires / spring boot

Message par harrak_z » 11 janv. 2020 1:26

Est ce les tests unitaires dans une application spring boot peuvent être lancé sans que la classe java Application (Run boot) soit lancé ...
A quoi sert l'annotation @SpringBootTest ?
Si vous avez un bon tutorial ou support de cours de test unitaire avec spring boot merci de le mettre en ligne ...
Merci d'avance de votre aide .

rosmorse
Messages : 9
Inscription : 12 déc. 2019 12:25

Re: lancement des tests unitaires / spring boot

Message par rosmorse » 11 janv. 2020 16:37

Pour les tests unitaires, on ne lance pas l'application complète.

Très rapidement, si on suppose que la DAO est la couche 0, les services la couche 1 et l'interface utilisateur la couche 2, alors, pour tester la couche 1, on a au plus besoin de la couche 0. Et plus spécifiquement des éléments de la couche 0 utilisés par ceux qu'on est en train de tester dans la couche 1. Par exemple, si on teste UserService, on n'aura pas besoin de ProductRepository.

En pratique, si un objet A utilise deux autres objets B et C, il y a deux manières de tester A :

- on utilise vraiment B et C. ça n'est plus vraiment du test unitaire, mais c'est souvent plus simple à faire. Dans le cas de bases de données, on mettra en place une base spécifique pour les tests (voir plus loin dans ce message).

- on utilise des substituts de B et C. Pour cela, il faut que A connaisse B et C à travers des interfaces et non des implémentations réelles. On pourra par exemple avoir une implémentation de UserRepository dont la méthode findAll() renvoie une liste d'entrées fixes.

Il peut alors être pratique d'utiliser des outils comme Mockito qui permet de simuler tel ou tel objet dynamiquement (sans écrire de classe).

Voir par exemple : https://www.springboottutorial.com/spri ... -and-junit



L'annotation @SpringBootTest permet de lancer les tests en bénéficiant des fonctionnalités de Spring (injection de dépendance en particulier).

Le statut des tests en question est un peu ambigu. Des "vrais" tests unitaires n'ont normalement pas besoin d'un environnement pour s'exécuter :

Par exemple, en théorie, un test unitaire de couche Service n'est pas supposé mettre en œuvre la "vraie" base de données. On est sensé passer par
une simulation de celle-ci (les "Mock").

En pratique, c'est souvent plus flou et on met en place pour un test une partie de l'architecture - avec souvent une base alternative. Mais ces tests ne supposent pas forcément de lancer le programme SpringBoot complet. S'ils le font, on est dans du test d'intégration ou fonctionnel - ce que JUnit peut aussi faire. Dans ce cas, la convention est de nommer la classe de test en terminant par "IT" son nom.

On utilise en particulier le fichier src/test/resources/application.properties pour mettre en place les valeurs (par exemple l'URL de la base) qui diffèrent entre la base de tests et la base utilisée par l'application.

Vous trouverez des exemples partiels dans le cours :

- pour JPA dans l'archive git 06_spring_jpa, projet 02_spring_jpa

- de tests - plutôt d'intégration - de Spring MVC dans 05_spring_web2, avec demoTestJunit5V1 et demoTestJunit5V2 (la différence entre les deux projets est que V2 utilise Ajax et JQuery et que V1 est du Spring MVC classique). On simule carrément un vrai navigateur Web, qui sait par exemple interpréter du javascript.

- 07_spring_security : dans le projet securityDemo, test de Spring security. Et en passant, exemples de tests "légers" de la couche UI, en passant par MockMVC

harrak_z
Messages : 66
Inscription : 19 oct. 2019 20:15

Re: lancement des tests unitaires / spring boot

Message par harrak_z » 11 janv. 2020 20:31

Merci pour votre réponse.

Répondre