Obtenga más beneficios de las pruebas unitarias con el análisis en tiempo de ejecución
Por Kapil Bhandari
2 de noviembre.
5 min leer
Para darse cuenta de los beneficios de las pruebas unitarias, puede observar una prueba unitaria durante su ejecución a través del análisis en tiempo de ejecución. El análisis en tiempo de ejecución durante la ejecución de la prueba unitaria es fundamental para mejorar la eficiencia y efectividad de la prueba.
La prueba unitaria es una mejor práctica para probar unidades/componentes individuales de un software, pero puede resultar tedioso y costoso para los desarrolladores de Java. Es laborioso probar el comportamiento correcto de cada unidad con aserciones manuales y aislar cada método con burlas, y la prueba de unidad en sí misma está abierta a errores y comportamientos mal entendidos. Para mejorar esta situación, puede usar una herramienta de análisis de tiempo de ejecución para detectar datos y controlar el flujo, las dependencias externas y calcular la cobertura del código de prueba.
Con estos datos recopilados del análisis en tiempo de ejecución, una solución de nivel empresarial como Prueba J de Parasoft puede indicar al desarrollador cómo mejorar las pruebas, recomendando automáticamente aserciones para un comportamiento correcto y métodos de burla para mejorar el aislamiento de la prueba. Esta integración entre la generación automática de pruebas unitarias y el análisis en tiempo de ejecución reduce la intervención manual necesaria para las pruebas unitarias para Java.
Beneficios de las pruebas unitarias
Las pruebas unitarias son una práctica bien conocida, pero su implementación requiere mejoras en muchos proyectos. Las pruebas unitarias, bien hechas, mejoran la agilidad de los procesos ágiles, aumentan la calidad y la seguridad y generan ahorros de costos a largo plazo.
Desafortunadamente, independientemente de estos beneficios, los desarrolladores aún pueden tener dificultades con las pruebas unitarias, a pesar del deseo de lograr mejores resultados. La cantidad de tiempo y esfuerzo necesarios para la creación y el mantenimiento de la prueba puede ser demasiado para justificar el aumento de los esfuerzos de prueba. A menudo, los conjuntos de pruebas son frágiles debido a un aislamiento deficiente de unidades / objetos de las dependencias. La burla adecuada de las dependencias se convierte en la pesadilla de los probadores de software, al igual que la creación de las afirmaciones necesarias para determinar la lógica correcta del programa. Incluso la parametrización de pruebas para escenarios puede resultar tediosa y lenta.
Los equipos de desarrollo de software deben abordar estos problemas con la creación, el aislamiento y el mantenimiento de pruebas si desean obtener los beneficios de las pruebas unitarias exhaustivas. La respuesta comienza con las herramientas de automatización de pruebas, pero simplemente automatizar la ejecución de las pruebas y recopilar los resultados no es suficiente. El análisis en tiempo de ejecución, el proceso de observar un ejecutable en ejecución y registrar métricas clave, es una forma innovadora de ayudar a mejorar la creación de pruebas unitarias, la simulación y la estabilidad de las pruebas.
El análisis en tiempo de ejecución puede mejorar las pruebas unitarias
En la mayoría de los casos, los desarrolladores no consideran que el análisis en tiempo de ejecución sea importante en las primeras etapas de las pruebas unitarias. La mayoría de las herramientas se utilizan para detectar errores que las pruebas unitarias pasaron por alto o simplemente para calcular la cobertura del código. Pero si bien estos beneficios son importantes, el análisis en tiempo de ejecución también puede observar la ejecución de la primera iteración de una prueba unitaria para hacer recomendaciones para mejorar la prueba y detectar cambios en el entorno de tiempo de ejecución de la prueba que interfieren con la estabilidad de la prueba.
Los marcos de trabajo de prueba, como JUnit, crean un código escaso que requiere más información del desarrollador. Este trabajo es tedioso, por lo que puede automatizarse para completar más detalles en función de la lógica del programa observada. La siguiente ejemplo de prueba de unidad java puede ser generado automáticamente por Parasoft Jtest:


Del mismo modo, para las pruebas unitarias con entradas parametrizadas, se muestra a continuación:


Dado que las pruebas creadas son ejecutables desde el principio, se pueden observar mediante análisis de tiempo de ejecución tanto para los resultados como para el flujo de ejecución. Por ejemplo, una prueba puede fallar debido a una excepción generada, que se muestra a continuación.


Detectando dependencias y simulando con Runtime Analysis
Además, las herramientas en tiempo de ejecución observan la ruta de ejecución en dependencias y recomiendan posibles simulaciones para aumentar el aislamiento de la prueba. Aunque la inspección visual de un objeto bajo prueba revelará sus dependencias, la automatización de la detección y la burla de estas dependencias ahorra mucho trabajo tedioso y propenso a errores.
En el siguiente ejemplo, Parasoft Jtest ofrece al desarrollador una opción de qué simular en función del seguimiento de ejecución de la prueba unitaria:


En este caso, agregar un patrón de método simulado agrega el método a una lista de simulacros para ser manejados por un marco simulado como PowerMock.
También es posible simular constructores estáticos, como se muestra a continuación.


Mejora de la fidelidad de las pruebas con análisis en tiempo de ejecución
Con pleno conocimiento del flujo de ejecución, además de los parámetros utilizados en las llamadas a métodos, el análisis en tiempo de ejecución se puede utilizar para proporcionar recomendaciones útiles al desarrollador para mejorar el código de prueba. Aunque las aserciones se proporcionan, de forma estática, cuando se crea una prueba, es posible que no estén habilitadas o no sean correctas. En la ejecución de la prueba, las afirmaciones fallidas o faltantes activan advertencias que luego conducen a recomendaciones para solucionar el problema.
Por ejemplo, después de crear una nueva prueba y no se han descomentado las afirmaciones recomendadas, verá lo siguiente:


O si una aserción falla, por ejemplo, se muestra lo siguiente:


Pase lo que pase, es la retroalimentación constante sobre la acción correctiva para las afirmaciones lo que cierra el ciclo en la creación de la prueba para completar la prueba unitaria. Además, a medida que se cambia la unidad bajo prueba, estos cambios se pueden tratar de la misma manera, reduciendo continuamente el mantenimiento de prueba manual requerido.
Mejora de la estabilidad de la prueba con análisis en tiempo de ejecución
El análisis en tiempo de ejecución también puede detectar cambios en el entorno de prueba durante la ejecución que afectan la capacidad de recrear un entorno de prueba idéntico para pruebas posteriores. Las pruebas que pasan una vez y fallan más tarde pueden ser una gran causa de frustración y pérdida de tiempo y esfuerzo. Algunos ejemplos de inestabilidades que puede detectar con el análisis en tiempo de ejecución son los siguientes:
- Una propiedad del sistema cambiada durante una prueba que no ha vuelto a su estado original. Una prueba posterior puede basarse en esta propiedad.
- Hilos de ejecución adicionales en segundo plano que puede interferir con una prueba de funcionamiento.
- Una nueva creación de archivo durante la ejecución de la prueba que podría afectar las ejecuciones posteriores si se basan en el archivo y su contenido.
- Campos estáticos modificados eso podría afectar las pruebas futuras que utilizan estos mismos campos.
Es fundamental que cada ejecución de prueba tenga un punto de partida idéntico para garantizar resultados fiables. La prevención de la inestabilidad de la prueba con la detección en tiempo de ejecución elimina las conjeturas de la fase de depuración de la prueba.
Por lo tanto, puede ver que el análisis en tiempo de ejecución no es solo para calcular la cobertura del código. El análisis en tiempo de ejecución durante la ejecución de la prueba es fundamental para mejorar la eficiencia y efectividad de la prueba. El seguimiento de las rutas de ejecución proporciona información sobre las dependencias, para mejorar el manejo de las dependencias y las burlas. Las afirmaciones se pueden monitorear y recomendaciones automáticas puede ayudar a mejorar la fidelidad de la prueba. La detección de cambios en el entorno de prueba en tiempo de ejecución que afectan la estabilidad de la prueba elimina la frustración y reduce los ciclos de depuración del código de prueba.