Aumente el ROI de las pruebas unitarias con la creación automática de pruebas unitarias
Por Kapil Bhandari
Marzo 22, 2018
6 min leer
La tecnología de creación automática de pruebas unitarias de Parasoft Jtest elimina los obstáculos de las pruebas unitarias, automatizando los aspectos mundanos de las pruebas unitarias, incluida la creación, el aislamiento, la simulación y el mantenimiento.
La mayoría de los equipos de desarrollo estarán de acuerdo en que, aunque no les gusta, las pruebas unitarias son, de hecho, extremadamente valiosas. A pesar de las muchas herramientas que ayudan con la creación manual de pruebas, la creación y el mantenimiento de pruebas unitarias aún requieren mucho esfuerzo manual, lento y, a menudo, abrumador antes de agregar lógica empresarial a una prueba. Como tal, a pesar de tener la intención de realizar grandes pruebas unitarias, los equipos de desarrollo suelen hacer la cantidad mínima de pruebas unitarias necesarias, o las omiten por completo.
Los desarrolladores han hablado
Una encuesta reciente a clientes reveló, de forma un tanto esperada, que la creación de pruebas, el simulacro/aislamiento y el mantenimiento son cuestiones clave que se interponen en el camino del éxito de las pruebas unitarias. La Figura 1 muestra los resultados de esta encuesta, mostrando las principales preocupaciones con las que los desarrolladores se identifican pruebas unitarias en java.
Figura 1: Los resultados de la encuesta muestran áreas clave de preocupación (porcentaje) que surgen de las pruebas unitarias.
Para abordar estas áreas principales de preocupación, podemos recurrir a las pruebas de software automatizadas. En este blog, te mostraré cómo usar Prueba J de Parasoft para automatizar la ejecución de la prueba y la recopilación de datos, así como para crear automáticamente pruebas unitarias, para ahorrar tiempo y energía en el momento de la creación de la prueba. Parasoft Jtest's tecnología de creación automática de pruebas unitarias configura el marco de prueba, crea instancias de objetos y configura simulacros para los objetos apropiados y las llamadas a métodos utilizados por el método bajo prueba. Crea JUnits regulares, haciendo todo el trabajo mundano para que los desarrolladores puedan concentrarse en aplicar la inteligencia humana y la lógica a sus pruebas.
Beneficios de las pruebas unitarias y por qué los desarrolladores aún las evitan
Las pruebas unitarias son iterativas y, en los procesos ágiles, las pruebas unitarias tienen un buen historial de mejora de los resultados de los proyectos. Y, por supuesto, está bien probado que probar antes en el ciclo de vida es la mejor manera de detectar y eliminar errores de nivel de sistema costosos y que requieren mucho tiempo más adelante. Más específicamente, los siguientes son algunos beneficios clave de las pruebas unitarias:
- Proporcionar agilidad para procesos ágiles: Los procesos ágiles dependen de conjuntos de pruebas eficientes, repetibles y automatizados para garantizar que cada iteración no se atasque en un ciclo de prueba "big bang". El éxito de Agile y DevOps depende en gran medida de que los equipos de desarrollo creen conjuntos de pruebas que se puedan ejecutar de manera eficiente, además de probar la mayor cantidad de funcionalidad posible.
- Calidad y seguridad mejoradas: Los equipos de software comprenden que las pruebas son la única forma de garantizar que el software esté haciendo lo que se requiere, pero los equipos a menudo no realizan suficientes pruebas o lo hacen demasiado tarde en el ciclo de vida del desarrollo. La seguridad, en particular, debe integrarse en una aplicación en las primeras etapas, por lo que las pruebas de seguridad deben realizarse lo antes posible.
- Reducir costes a largo plazo: Los errores de software que se encuentran en el software publicado pueden ser 1000 veces más costosos de corregir que durante el desarrollo. Los errores que se encuentran en las primeras etapas de codificación en las pruebas unitarias son mucho más baratos que los que se encuentran más tarde. La inversión a corto plazo en la automatización de pruebas y la infraestructura de pruebas unitarias se traduce en una mejor calidad del producto, seguridad y entrega a tiempo.
Desafortunadamente, independientemente de estos beneficios, los desarrolladores todavía están luchando con las pruebas unitarias, a pesar del deseo de lograr mejores resultados. Estas luchas, también ilustradas por los resultados de la encuesta anterior, incluyen lo siguiente:
- La creación de pruebas es un trabajo adicional y, a menudo, tedioso: Comprensiblemente, las pruebas unitarias son un trabajo adicional y, a menudo, se consideran el aspecto menos deseable de la programación. La creación de un conjunto de pruebas integral mientras se intenta mantener los objetivos y los plazos del proyecto son dos presiones en competencia para los equipos de desarrollo.
- El mantenimiento de las pruebas es caro: Al igual que el código, las pruebas unitarias requieren mantenimiento. Cualquier cambio de código puede introducir cambios en las pruebas asociadas. No solo eso, las pruebas que fallan debido a modificaciones de la base del código pueden aparentemente no estar relacionadas, lo que lleva a la inestabilidad de la suite de pruebas. El mantenimiento adicional crea "el doble de trabajo" en la mente de muchos desarrolladores.
- Las unidades de simulación y aislamiento bajo prueba son difíciles y requieren mucho tiempo: Es fundamental aislar las unidades bajo prueba, pero hacerlo requiere burlarse de las dependencias, lo que puede ser un proceso que requiere mucho tiempo.
Los equipos de desarrollo de software deben abordar estos problemas con la creación, el aislamiento y el mantenimiento de pruebas si quieren obtener los beneficios de las pruebas unitarias exhaustivas, y la solución es la automatización. Parasoft Jtest's herramienta de creación automática de pruebas unitarias proporciona la asistencia necesaria para la creación y el mantenimiento de pruebas, mientras trabaja dentro del IDE del desarrollador y aprovecha los marcos de prueba y simulación existentes.
Reduzca la carga con la creación automática de pruebas
La creación de pruebas unitarias es tediosa y desvía la atención de las partes más interesantes de un proyecto. El código en sí es repetitivo y, a menudo, requiere tanto esfuerzo como el código bajo prueba, y además de eso, el código de prueba unitario en sí mismo requiere corrección y depuración, como lo haría cualquier código. Afortunadamente, las pruebas unitarias se prestan bien a la automatización, y la guía automática de una herramienta de prueba unitaria puede simplificar enormemente la creación de pruebas, reducir la cantidad de depuración y corrección, y recopilar resultados y métricas para alimentar el análisis del proyecto.
Yendo más allá del IDE
Muchos IDE proporcionan asistentes de creación de pruebas unitarias para JUnit, por ejemplo, pero no proporcionan "contenido" para completar el proceso. Las aserciones deben definirse manualmente y, si se utilizan marcos de simulación, se requiere una cantidad significativa de codificación manual. En su lugar, Parasoft Jtest brinda asistencia contextual en tiempo real en el IDE del desarrollador. Con la creación automática de pruebas unitarias, el "contenido" que falta en las pruebas unitarias esqueléticas simples se completa de manera rápida y eficiente, ya que aprovecha su herramienta de prueba unitaria para realizar lo siguiente:
- Crea un marco de prueba, crea instancias de objetos y configura los métodos y objetos simulados apropiados
- Realiza un análisis en tiempo de ejecución de la ejecución de la automatización de la prueba para resaltar los valores de los objetos que cambiaron durante la prueba y recomendar afirmaciones para la verificación de estos valores.
- Identifica las llamadas a métodos que deben simularse para aislar mejor el código bajo prueba
- Detecta los recursos del sistema creados pero no liberados después de la finalización de la prueba, lo que podría crear un entorno de prueba inestable
- Recopila cobertura de código y otras métricas
Para abordar esto, veamos un ejemplo. Aquí, Prueba J de ParasoftEl asistente de pruebas unitarias se invoca con un IDE para crear pruebas parametrizadas:
La herramienta crea el siguiente código de prueba unitaria, momento en el que el desarrollador completa los parámetros según sea necesario:
Para crear casos de prueba para diferentes valores de parámetros, el Asistente de pruebas unitarias de Parasoft Jtest proporciona un asistente de casos de prueba:
Y te vas.
Reducir la complejidad burlona
La prueba unitaria implica el aislamiento del objeto bajo prueba, lo que requiere una buena cantidad de trabajo si hay muchas dependencias. Incluso con marcos burlones como Mockito or PowerMock, todavía se requiere una codificación manual significativa. Con una herramienta de asistente de prueba automatizada, puede detectar dependencias y completar automáticamente los detalles requeridos por el marco.
La herramienta en sí analiza el código bajo prueba, detecta automáticamente las dependencias y hace recomendaciones al desarrollador.
Por ejemplo, aquí estamos ejecutando la siguiente prueba unitaria de la clase IWorkspaceClass:
Las dependencias se detectan durante el tiempo de ejecución y la herramienta recomienda burlarse de las dependencias que ha encontrado:
Al seleccionar "Mock It" con la herramienta se genera el código de simulación necesario con la prueba unitaria. Una vez que se genera este código, se puede personalizar para representar la lógica correcta según sea necesario. La detección automatizada de dependencias y la posterior creación de código simulado reduce en gran medida la cantidad de codificación manual, y potencialmente propensa a errores, necesaria para simular objetos.
Mantenimiento de la suite de pruebas reducido mediante la automatización
El mantenimiento de los conjuntos de pruebas se superpone a gran parte del trabajo requerido para la creación de pruebas, como la creación de nuevas pruebas, la modificación de pruebas para que se adapten a la lógica subyacente, las dependencias simuladas, la ejecución de pruebas y la verificación. Obtener asistencia del asistente de prueba unitaria de Parasoft Jtest durante el mantenimiento de la prueba es tan valioso como durante la creación, ya que proporciona información actualizada sobre los resultados del análisis en tiempo de ejecución recopilados durante la ejecución de la prueba. Por ejemplo, una nueva dependencia en un objeto bajo prueba se detecta en tiempo de ejecución y la herramienta le indica al desarrollador cómo manejarla.
Igualmente crítico durante esta fase es asegurarse de que las afirmaciones sigan siendo válidas. El Asistente de prueba unitaria de Parasoft Jtest proporciona recomendaciones que pueden detectar cambios en el código y actualizar las afirmaciones para reflejar la nueva lógica empresarial.
Maximizar el beneficio de las herramientas existentes
Los desarrolladores de Java que ya están realizando pruebas unitarias probablemente estén usando JUnit y posiblemente un marco de aserción para su proyecto, como Mockito o PowerMock. Las herramientas de automatización de pruebas deben aprovechar estas herramientas existentes, ya que reemplazar una inversión existente en pruebas unitarias eliminaría cualquier beneficio de costo y tiempo. El asistente de pruebas unitarias de Parasoft Jtest se integra a la perfección con estas herramientas existentes, lo cual es fundamental.
Conclusión
Las pruebas unitarias tienen beneficios claros y, aunque la mayoría de los equipos de desarrollo se dan cuenta de esto, muchos se ven obstaculizados por el esfuerzo de crear y mantener pruebas. El uso de tecnologías de pruebas unitarias automatizadas de Parasoft Jtest ayudará a los usuarios a derribar estos obstáculos, automatizando los aspectos mundanos de las pruebas unitarias, incluida la creación, el aislamiento, la simulación y el mantenimiento. Para acelerar la adopción, Prueba J de Parasoft aprovecha la inversión existente del equipo de desarrollo en marcos de prueba y simulación, y devuelve tiempo al desarrollador al tiempo que devuelve la calidad al producto.