BankNext dispone di un ambiente di produzione di grandi dimensioni con oltre 300 microservizi attivi. L’operazione di squadre multiple che lavorano simultaneamente su questi SVC aumenta il rischio di compromissione della funzionalità. L’aggiunta di JUnits e copertura del codice manualmente a codice esistente e nuovo è faticosa e incredibilmente lenta.
Difficoltà con JUnits Manuali
- Attività molto lunga per scrivere manualmente JUnits effettivamente utili.
- Manca di standardizzazione poiché ognuno adotta approcci diversi.
- Si creano JUnits insufficienti/errati a causa della mancanza di tempo.
- La sincronizzazione manuale degli attuali JUnits a causa dei cambiamenti nel codice è impraticabile.
- Scrivere JUnits manualmente per codice legacy è un incubo.
- L’importanza data agli JUnits è minima a causa dei termini di consegna; quindi spesso vengono saltati.
- La qualità del codice ne risente enormemente, e il debito tecnico si accumula.
Soluzione: Automazione JUnit-Mockito
- GitHub
- L’automazione prende il nome della classe e crea JUnits funzionanti e validi.
- Questi JUnits generati includono i necessari mock di Mockito.
- Si occupa degli JUnits per RestControllers, Services, Handlers, classi Kafka, ecc.
- Così, raggiunge oltre il 70% di copertura del codice in quasi tutti i casi.
Capacità di Automazione
- Funziona per applicazioni basate su Maven sia con SpringBoot 2.x che 3.x.
- Praticamente nessuno sforzo di configurazione.
- Prende il percorso locale del tuo applicativo & input utente molto basilari.
- Utilizza utilità di Reflection per dedurre i dettagli della struttura dell’applicazione.
- Identifica senza soluzione di continuità i MockBeans richiesti.
- Genera automaticamente “When-Then” Mockito mocks.
- Genera rapporti di copertura del codice Jacoco.
Struttura di un Legal JUnit
- Porzioni obbligatorie: 3
- Invoca il metodo di test target
- Mocka le interazioni esterne a questa classe
- Verifica che l’output effettivo corrisponda all’assert/verify atteso
- Identifica e dichiara tutte le classi esterne come MockBeans
- Stubba le risposte attese da queste interazioni MockBean
- Di seguito sono elencate le regole di base per un JUnit funzionante e legale
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
Demo dell’Automazione
Shell
cd C:\Vijay\Java [your local machine path]
git clone https://github.com/vijayredkar/junit-mockito-automation.git
# Struttura finale della mia directory
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation
cd C:\Vijay\Java\AutomationJunitMockito\appsetup
setup.bat
------- Passaggi Demo ------
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
Prima e Dopo l’Esecuzione dell’Automazione
Conclusione
- BankNext risparmia un tempo e uno sforzo enormi grazie alla creazione automatica di JUnit.
- Ciò si traduce direttamente in un risparmio sui costi del progetto.
- L’indice di copertura del codice aumenta enormemente.
- Il team riesce a concentrarsi completamente su attività di sviluppo vero e proprio.
- JUnit aggiunti/mantenuti in modo coerente con uno sforzo manuale quasi nullo.
- Il debito tecnico viene ridotto notevolmente.
- Migliora notevolmente la fiducia negli applicativi distribuiti in produzione.
Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1