BankNext possède un environnement de production massif avec plus de 300 microservices en direct. Plusieurs équipes travaillant simultanément sur ces SVC augmentent le risque de casser des fonctionnalités. Ajouter des JUnits et une couverture de code manuellement aux codes existants et nouveaux est fastidieux et extrêmement lent.
Défis Avec JUnits Manuel
- Activité très chronophage pour écrire des JUnits utiles et appropriés manuellement.
- Manque de standardisation car chacun adopte des approches différentes.
- JUnits incomplets/incorrects créés en raison du manque de temps.
- Synchronisation manuelle des JUnits existants en raison des changements de code est impraticable.
- Écrire des JUnits manuellement pour du code legacy est un cauchemar.
- Le moins de priorité est accordé aux JUnits en raison des délais; donc, ils sont souvent omis.
- La qualité du code en pâtit grandement, et la dette technique s’accumule.
Solution: Automatisation JUnit-Mockito
- GitHub
- L’automatisation prend en entrée le nom de la classe et crée des JUnits fonctionnels et légaux.
- Ces JUnits générés contiennent les mocks Mockito nécessaires.
- Gère les JUnits pour RestControllers, Services, Handlers, classes Kafka, etc.
- Ainsi, il atteint plus de 70% de couverture de code dans presque tous les scénarios.
Capacités d’Automatisation
- Fonctionne pour les applications basées sur Maven SpringBoot 2.x et 3.x.
- Un effort de configuration quasi nul.
- Prend le chemin local de votre application & entrées utilisateur très basiques.
- Utilise des utilitaires de réflexion pour déduire les détails de la structure de l’application.
- Identifie de manière transparente les MockBeans requis.
- Génère automatiquement des mocks Mockito « When-Then ».
- Génère des rapports de couverture de code Jacoco.
Structure d’un JUnit légal
- Portions obligatoires : 3
- Appeler la méthode de test cible
- Simuler toute interaction qui est externe à cette classe
- Vérifier que la sortie réelle correspond à l’assertion/vérification attendue
- Identifier et déclarer toutes les classes externes en tant que MockBeans
- Faire des stubs des réponses attendues de ces interactions MockBean
- Voici les règles de base pour un JUnit fonctionnel et légal
Shell
Junit-Mockito Ground Rules
1- target mtd to be tested createCustomer is a void returnType
2- external mtd invoked .delete is a void returnType
3- when-then : doNothing whenInvoke .delete
4- assertion : verify .delete called 1 times
1- target mtd to be tested createCustomer is a void returnType
2- external mtd invoked .save is a Customer returnType
3- when-then : when save then return new Customer
4- assertion : verify .save called 1 times
1- target mtd to be tested createCustomer is a Customer returnType
2- external mtd invoked .save is a Customer returnType
3- when-then : when save then return new Customer
4- assertion : assert result instanceof Customer / Customer is not null
1- target mtd to be tested createCustomer is a Customer returnType
2- external mtd invoked .findAll is a List returnType
3- when-then : when findAll then return new ArrayList
4- assertion : assert result instanceof List / List.size >0
Démo d’automatisation
Shell
cd C:\Vijay\Java [your local machine path]
git clone https://github.com/vijayredkar/junit-mockito-automation.git
# Structure finale de mon répertoire
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation
cd C:\Vijay\Java\AutomationJunitMockito\appsetup
setup.bat
------- Étapes de la démo ------
https://vijayredkar.medium.com/banknext-case-study-junit-mockito-automation-ac9f6b72cfcc
https://github.com/vijayredkar/junit-mockito-automation
C:\Vijay\Java\AutomationJunitMockito\appsetup
demo scenario -1
com.banknext.customer.mgt.service.CustomerServiceImplType1
com.banknext.customer.mgt.controller.CustomerMgtControllerType1
demo scenario -2
com.banknext.customer.mgt.service.CustomerServiceImplType2
com.banknext.customer.mgt.controller.CustomerMgtControllerType2
demo scenario -3
com.banknext.customer.mgt.event.publisher.CustomerTxnPublisherType1
com.banknext.customer.mgt.event.consumer.CustomerTxnConsumerType1
demo scenario -4
https://github.com/bezkoder/spring-boot-h2-database-crud/tree/master
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects
#git clone https://github.com/bezkoder/spring-boot-h2-database-crud.git
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
cd C:\Vijay\Java\AutomationJunitMockito\appsetup
run setup.bat
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
import in Eclipse
add POM dependencies
check current Jacoco code coverage
continue automation run
check/adjust generated Junits
check current Jacoco code coverage
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
check new Jacoco code coverage
run all tests
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
check again all Jacoco code coverage
C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud\src\main\java\com\bezkoder\spring\jpa\h2
com.bezkoder.spring.jpa.h2.controller.TutorialController
com.bezkoder.spring.jpa.h2.model.Tutorial
TutorialController
Avant et Après Exécution de l’Automatisation
Conclusion
- BankNext économise un temps et un effort considérables avec la création automatique de JUnit.
- Cela se traduit directement par des économies de coûts de projet.
- La couverture de code augmente considérablement.
- L’équipe est en mesure de se concentrer entièrement sur les activités de développement réel.
- Les JUnits sont ajoutés/maintenus de manière constante avec un effort manuel presque nul.
- La dette technique est réduite de manière significative.
- Renforce grandement la confiance dans les applications déployées en production.
Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1