Studio di Caso BankNext: Automazione con JUnit e Mockito

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

  1. Attività molto lunga per scrivere manualmente JUnits effettivamente utili.
  2. Manca di standardizzazione poiché ognuno adotta approcci diversi.
  3. Si creano JUnits insufficienti/errati a causa della mancanza di tempo.
  4. La sincronizzazione manuale degli attuali JUnits a causa dei cambiamenti nel codice è impraticabile.
  5. Scrivere JUnits manualmente per codice legacy è un incubo.
  6. L’importanza data agli JUnits è minima a causa dei termini di consegna; quindi spesso vengono saltati.
  7. La qualità del codice ne risente enormemente, e il debito tecnico si accumula.

Soluzione: Automazione JUnit-Mockito

  1. GitHub 
  2. L’automazione prende il nome della classe e crea JUnits funzionanti e validi.
  3. Questi JUnits generati includono i necessari mock di Mockito.
  4. Si occupa degli JUnits per RestControllers, Services, Handlers, classi Kafka, ecc.
  5. Così, raggiunge oltre il 70% di copertura del codice in quasi tutti i casi.

Capacità di Automazione

  1. Funziona per applicazioni basate su Maven sia con SpringBoot 2.x che 3.x.
  2. Praticamente nessuno sforzo di configurazione.
  3. Prende il percorso locale del tuo applicativo & input utente molto basilari.
  4. Utilizza utilità di Reflection per dedurre i dettagli della struttura dell’applicazione.
  5. Identifica senza soluzione di continuità i MockBeans richiesti.
  6. Genera automaticamente “When-Then” Mockito mocks.
  7. Genera rapporti di copertura del codice Jacoco.

Struttura di un Legal JUnit

  1. Porzioni obbligatorie: 3
    1. Invoca il metodo di test target
    2. Mocka le interazioni esterne a questa classe
    3. Verifica che l’output effettivo corrisponda all’assert/verify atteso
  2. Identifica e dichiara tutte le classi esterne come MockBeans
  3. Stubba le risposte attese da queste interazioni MockBean
  4. 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

Visualizza la demo qui.

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

  1. BankNext risparmia un tempo e uno sforzo enormi grazie alla creazione automatica di JUnit.
  2. Ciò si traduce direttamente in un risparmio sui costi del progetto.
  3. L’indice di copertura del codice aumenta enormemente.
  4. Il team riesce a concentrarsi completamente su attività di sviluppo vero e proprio.
  5. JUnit aggiunti/mantenuti in modo coerente con uno sforzo manuale quasi nullo.
  6. Il debito tecnico viene ridotto notevolmente.
  7. Migliora notevolmente la fiducia negli applicativi distribuiti in produzione.

Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1