BankNext tiene un entorno de producción masivo con más de 300 microservicios en vivo. Múltiples escuadras trabajando concurrentemente en estos SVCs aumenta el riesgo de romper la funcionalidad. Agregar JUnits y cobertura de código manualmente a código existente y nuevo es arduo y sumamente lento.
Desafíos con JUnits Manuales
- Actividad intensiva en tiempo para escribir JUnits útiles y adecuados manualmente.
- Carece de estandarización porque cada uno toma enfoques diferentes.
- Se crean JUnits deficientes/incorrectos debido a falta de tiempo.
- Sincronización manual de JUnits existentes debido a cambios en el código es impracticable.
- Escribir JUnits manualmente para código legado es una pesadilla.
- Se asigna la menor prioridad a los JUnits debido a los plazos; por lo tanto, se saltan.
- La calidad del código sufre enormemente, y la deuda técnica se acumula.
Solución: Automatización de JUnit-Mockito
- GitHub
- La automatización toma el nombre de la clase y crea JUnits funcionales y legales.
- Estos JUnits generados contienen los mocks Mockito necesarios.
- Maneja JUnits para RestControllers, Services, Handlers, clases Kafka, etc.
- Por lo tanto, logra una cobertura de código superior al 70% en casi todas las situaciones.
Capacidades de Automatización
- Funciona tanto para aplicaciones basadas en Maven de SpringBoot 2.x como 3.x.
- Casi ningún esfuerzo de configuración.
- Toma la ruta local de tu aplicación & entradas de usuario muy básicas.
- Utiliza utilidades de reflexión para deducir detalles de la estructura de la aplicación.
- Identifica sin problemas los Mockbeans requeridos.
- Genera automáticamente mocks “When-Then” de Mockito.
- Genera informes de cobertura de código de Jacoco.
Estructura de un JUnit legal
- Porciones obligatorias: 3
- Invocar el método de prueba objetivo
- Simular cualquier interacción que sea externa a esta clase
- Comprobar que la salida real coincide con la aserción/verificación esperada
- Identificar y declarar todas las clases externas como MockBeans
- Interpolar las respuestas esperadas de estas interacciones de MockBean
- A continuación se presentan las reglas básicas para un JUnit legal y 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
Demostración de Automatización
Shell
cd C:\Vijay\Java [your local machine path]
git clone https://github.com/vijayredkar/junit-mockito-automation.git
# Estructura final de mi directorio
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation
cd C:\Vijay\Java\AutomationJunitMockito\appsetup
setup.bat
------- Pasos de la demostración ------
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 y Después de la Ejecución de Automatización
Conclusión
- BankNext ahorra una enorme cantidad de tiempo y esfuerzo con la creación automática de JUnit.
- Esto se traduce directamente en ahorros de gastos del proyecto.
- La cobertura de código aumenta enormemente.
- El equipo puede centrarse completamente en actividades de desarrollo real.
- Los JUnit se añaden/mantienen de manera consistente con casi ningún esfuerzo manual.
- La deuda técnica se reduce en gran medida.
- Aumenta enormemente la confianza en las aplicaciones desplegadas en producción.
Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1