BankNext possui um ambiente de produção massivo com mais de 300 microservices em funcionamento. A colaboração de várias equipes trabalhando simultaneamente nesses SVCs aumenta o risco de quebrar funcionalidades. Adicionar JUnits e cobertura de código manualmente a código existente e novo é cansativo e extremamente lento.
Desafios com JUnits Manuais
- Atividade demorada para escrever JUnits úteis e corretos manualmente.
- Falta de padronização, pois cada um adota abordagens diferentes.
- JUnits deficientes/incorretos são criados devido à falta de tempo.
- Sincronização manual de JUnits existentes devido a mudanças no código é impraticável.
- Escrever JUnits manualmente para código legado é um pesadelo.
- O menor prioridade é dada a JUnits devido a prazos; portanto, são ignorados.
- A qualidade do código sofre imensamente, e a dívida técnica se acumula.
Solução: Automação com JUnit-Mockito
- GitHub
- A automação recebe o nome da classe e cria JUnits funcionais e legais.
- Esses JUnits gerados contêm os mocks Mockito necessários.
- Lida com JUnits para RestControllers, Services, Handlers, classes Kafka, etc.
- Assim, alcança mais de 70% de cobertura de código em quase todas as situações.
Capacidades de Automação
- Funciona tanto para aplicações baseadas em Maven do SpringBoot 2.x quanto 3.x.
- Quase nenhum esforço de configuração.
- Leva o caminho local do seu aplicativo & entradas de usuário muito básicas.
- Utiliza utilitários de Reflection para deduzir detalhes da estrutura do aplicativo.
- Identifica de forma transparente os beans simulados necessários.
- Gera automaticamente mocks “When-Then” do Mockito.
- Gera relatórios de cobertura de código Jacoco.
Estrutura de um JUnit Legal
- Porções obrigatórias: 3
- Invocar o método de teste alvo
- Simular quaisquer interações que sejam externas a esta classe
- Verificar se a saída real corresponde à esperada assert/verify
- Identificar e declarar todas as classes externas como MockBeans
- Interações de Stub das respostas esperadas a partir destes MockBean
- Abaixo estão as regras de base para um JUnit legal e funcional básico
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 de Automação
Shell
cd C:\Vijay\Java [your local machine path]
git clone https://github.com/vijayredkar/junit-mockito-automation.git
# Estrutura final do meu diretório
# 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 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
Antes e Depois da Execução da Automatização
Conclusão
- O BankNext economiza muito tempo e esforço com a criação automática de JUnit.
- Isso se traduz diretamente em economias de custos do projeto.
- A cobertura de código aumenta imensamente.
- A equipe consegue se concentrar completamente em atividades de desenvolvimento reais.
- JUnits adicionados/mantidos de forma consistente com quase nenhum esforço manual.
- A dívida técnica é reduzida drasticamente.
- Aumenta muito a confiança nas aplicações implantadas na produção.
Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1