Estudo de Caso BankNext: Automação com JUnit e Mockito

BankNext possui um ambiente de produção massivo com mais de 300 microserviços ativos. A execução simultânea de várias equipes nesses SVCs aumenta o risco de quebra de funcionalidades. Adicionar JUnits e cobertura de código manualmente a código existente e novo é árdua e lentamente penoso.

Desafios com JUnits Manuais

  1. Atividade demorada para escrever JUnits úteis e apropriados manualmente.
  2. Falta de padronização porque cada um adota abordagens diferentes.
  3. JUnits deficientes/incorretos são criados devido à falta de tempo.
  4. Sincronização manual de JUnits existentes devido a mudanças no código é impraticável.
  5. Escrever JUnits manualmente para código legado é um pesadelo.
  6. A prioridade mínima é dada aos JUnits devido a prazos; portanto, são ignorados.
  7. A qualidade do código sofre imensamente, e a dívida técnica se acumula.

Solução: Automação JUnit-Mockito

  1. GitHub 
  2. A automação recebe o nome da classe e cria JUnits funcionais e legais.
  3. Esses JUnits gerados contêm os mocks Mockito necessários.
  4. Lida com JUnits para RestControllers, Services, Handlers, classes Kafka, etc.
  5. Assim, consegue uma cobertura de código superior a 70% em quase todas as situações.

Capacidades de Automação

  1. Funciona tanto para aplicações baseadas em Maven do SpringBoot 2.x quanto 3.x.
  2. Quase nenhum esforço de configuração.
  3. Recebe o caminho local do seu aplicativo & entradas básicas do usuário.
  4. Utiliza utilitários de Reflection para deduzir detalhes da estrutura do aplicativo.
  5. Identifica perfeitamente os Mockbeans necessários.
  6. Gera automaticamente mocks “When-Then” com Mockito.
  7. Gera relatórios de cobertura de código com Jacoco.

Estrutura de um Legal JUnit

  1. Porções obrigatórias: 3
    1. Invocar o método de teste alvo
    2. Mocke qualquer interação que seja externa a esta classe
    3. Verifique se a saída real corresponde à esperada assert/verify
  2. Identificar e declarar todas as classes externas como MockBeans
  3. Esfacote as respostas esperadas dessas interações MockBean
  4. Abaixo estão as regras básicas para um JUnit legal e funcional
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

Demonstração de Automação

Veja a demonstração aqui.

Shell

 

cd C:\Vijay\Java              [your local machine path]
git clone https://github.com/vijayredkar/junit-mockito-automation.git

# Estrutura final da minha pasta
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation 

cd C:\Vijay\Java\AutomationJunitMockito\appsetup
setup.bat

------- Passos da Demonstração ------
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

Antes e Depois da Execução de Automação

Conclusão

  1. O BankNext economiza muito tempo e esforço com a criação automática de JUnit.
  2. Isso se traduz diretamente em economias de custos de projeto.
  3. A cobertura de código aumenta imensamente.
  4. A equipe consegue se concentrar completamente em atividades de desenvolvimento reais.
  5. JUnits adicionados/mantidos de forma consistente com quase nenhum esforço manual.
  6. A dívida técnica é reduzida significativamente.
  7. Aumenta muito a confiança nas aplicações implantadas em produção.

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