Avances en herramientas de generación de código y pruebas
Nuevos métodos y herramientas mejoran las capacidades de pruebas de software y generación de código.
― 10 minilectura
Tabla de contenidos
Los estudios previos se centraron en crear programas de computadora que puedan realizar tareas específicas automáticamente, conocidos como Generación de Código. Un método implica transformar descripciones de tareas en reglas, donde las condiciones que se cumplen llevan a un programa generado. Otro enfoque usó redes especiales para conectar descripciones de texto con estructuras de programación, creando código después prestando atención a diferentes partes. Los grandes modelos de lenguaje también han mostrado una gran capacidad para producir código basado en el contexto dado. Se han lanzado varios modelos de lenguaje importantes para generar código tras ser entrenados en enormes conjuntos de datos con ejemplos de código. Notablemente, una herramienta llamada GitHub Copilot utiliza una versión mejorada de uno de estos modelos para ayudar a los usuarios a escribir código y resolver problemas básicos de programación.
Los esfuerzos recientes buscan mejorar cómo estos modelos de lenguaje crean, ajustan y aplican métodos de generación de código. Aunque no es común usar modelos de lenguaje para probar software, algunos han explorado su aplicación en tareas como predecir pruebas que pueden fallar. Herramientas como GPT-3 han sido utilizadas para probar interfaces gráficas de software. Nuestra investigación no se centra en generar código, sino en cómo una herramienta de generación de código accesible públicamente puede ayudar con tareas específicas como crear Pruebas Unitarias sin necesidad de ajustes.
Un estudio realizado a nivel de posgrado en Pruebas de Software identificó métodos y etapas de prueba utilizados con frecuencia. Se analizaron una gran cantidad de documentos tanto de empresas como de academia, arrojando luz sobre los Olores de prueba y ofreciendo herramientas para detectarlos. Otro estudio investigó la prueba de software para aplicaciones móviles, evaluando la efectividad, el diseño y la identificación de errores en el código de producción. Se han realizado revisiones de literatura para identificar herramientas de prueba disponibles y su efectividad en la detección de problemas.
En el ámbito de las pruebas unitarias, varios documentos abordaron la generación de pruebas, aunque a través de diferentes métodos. Un documento propuso un método basado en búsqueda que genera pruebas para detectar cambios funcionales entre dos versiones de un programa, mientras que otro sugirió generar casos de prueba unitarias aprendiendo de ejemplos del mundo real. Un tercer documento describió un enfoque mejorado para la generación aleatoria de pruebas usando retroalimentación obtenida durante la ejecución de pruebas.
Están surgiendo documentos que utilizan grandes modelos de lenguaje para la generación de pruebas. Un estudio exploró el uso de un modelo de lenguaje llamado Codex para crear automáticamente pruebas unitarias. Otro combinó un enfoque basado en búsqueda con un modelo de lenguaje para ver si podía ayudar en la prueba de software. Un documento se centró en crear un aviso efectivo para ayudar a los modelos de lenguaje con diversas tareas relacionadas con el código.
Algunos documentos han proporcionado ideas sobre pruebas sin introducir nuevas soluciones; por ejemplo, un estudio evaluó cómo un modelo de lenguaje de código preentrenado interactúa con cambios de código, creación de pruebas a partir de descripciones y pruebas de mutación. Otros examinaron estrategias para minimizar el tiempo dedicado a escribir pruebas o garantizar que los cambios en el código también estén cubiertos por pruebas.
El campo de la generación de pruebas es amplio e incluye enfoques variados que enfrentan diferentes desafíos. Ha evolucionado a lo largo de los años con estudios relevantes que datan de al menos 2007. Nuestro trabajo se inserta en esta rica diversidad proponiendo un nuevo enfoque y buscando contribuir al conocimiento existente.
Una herramienta llamada DeepTC-Enhancer utiliza técnicas de aprendizaje profundo para mejorar la calidad y legibilidad de las pruebas generadas automáticamente. Las evaluaciones han mostrado que los desarrolladores encontraron los casos de prueba generados más significativos y comprensibles. Otro método, llamado BOT, asigna inteligentemente recursos de prueba a donde más se necesitan, lo que lleva a una mejor cobertura y efectividad.
Un análisis de la calidad de los identificadores en el código de prueba reveló que suelen ser de menor calidad en comparación con el código de producción. El estudio evaluó la efectividad de las herramientas de renombrado para mejorar los nombres del código de prueba. La investigación sobre la conciencia de los desarrolladores respecto a los olores de prueba destacó su preferencia por estrategias establecidas para abordar estos problemas. Además, un estudio destacó el valor de la educación en pruebas de software para mejorar las habilidades de programación, mostrando mejoras medibles en la fiabilidad del código entre los estudiantes con dicho conocimiento.
Se introdujo una técnica para evaluar la detección de refactorizaciones, donde se probaron herramientas para su capacidad de reconocer cambios realizados durante la programación. Otro enfoque propuso usar algoritmos genéticos para generar pruebas unitarias, que incluía una herramienta de visualización para ayudar a examinar y afinar el proceso de prueba. Hay un método que replica fallos en programas usando algoritmos genéticos, abordando desafíos planteados por lenguajes de codificación dinámicos.
Una herramienta llamada Hapao apoya la identificación de áreas que necesitan más pruebas al presentar métricas visuales sobre la Cobertura de Pruebas. La investigación sobre cómo las operaciones de refactorización se relacionan con la efectividad de las suites de pruebas encontró que muchos cambios no rompen pruebas, pero ciertos tipos de refactorización pueden llevar inadvertidamente a problemas. Mientras tanto, se propuso un enfoque sistemático para generar pruebas unitarias, asegurando que se adhirieran a buenos principios de diseño.
Se exploró la relación entre las pruebas y la calidad del código de producción, identificando cómo varios factores relacionados con las pruebas pueden impactar defectos tras la liberación. Estudios han indicado los efectos perjudiciales de los olores de prueba en la mantenibilidad y efectividad, lo que ha llevado al desarrollo de una herramienta para detectar y refactorizar estos problemas automáticamente. También se examinó la calidad del código de prueba producido por herramientas automatizadas, descubriendo problemas frecuentes que pueden afectar negativamente la fiabilidad del código final.
Se ha introducido un marco que permite a los testers especificar incertidumbres en sistemas de software y utilizar probabilidades para mejorar la precisión de las pruebas. Se ha desarrollado una herramienta automática para detectar olores de prueba en código Java, demostrando flexibilidad y alta precisión en la detección. La investigación sobre el etiquetado de métodos en pruebas unitarias ha mostrado que los enfoques sistemáticos pueden mejorar la claridad y utilidad de las pruebas.
Se examinó la conexión entre la evolución de los olores de prueba y los fallos del código de producción en un estudio, que indicó una correlación donde ciertos olores están a menudo vinculados a fallos. Se propuso un método para generar afirmaciones significativas en métodos de prueba usando una técnica de traducción, mostrando promesas para ayudar a los desarrolladores durante las tareas de codificación.
Los experimentos destacaron la necesidad de mejorar las prácticas de documentación de errores que mejoran la resolución de problemas al proporcionar pasos más claros para reproducir problemas. La investigación sobre el impacto de diferentes condiciones experimentales en el comportamiento y daño mostró la importancia de las estrategias de supervivencia en entornos desafiantes.
Un estudio discutió la documentación sistemática de decisiones arquitectónicas para mejorar cómo se comparten estas decisiones entre los interesados. Otro estableció un marco para examinar prácticas de documentación en el desarrollo continuo de software, descubriendo desafíos comunes y sugiriendo herramientas mejoradas para una mejor calidad de documentación.
La investigación sobre la gestión de la deuda técnica demostró que dichas deudas pueden obstaculizar la calidad general del sistema, proponiendo un modelo para abordar la deuda técnica arquitectónica y mejorar la toma de decisiones en el diseño de software. Se creó una herramienta para ayudar a los desarrolladores a encontrar publicaciones relevantes en foros de ayuda, mejorando el proceso de búsqueda de información relacionada con problemas de codificación.
La extracción de razones de mensajes en línea reveló que una parte significativa de las discusiones se refiere a las razones detrás de las decisiones. Se aplicó aprendizaje automático para clasificar estas discusiones, ofreciendo ideas sobre la dinámica de la comunidad. Se han explorado enfoques para mejorar la redacción de mensajes de confirmación, centrándose en la refinación a través de conjuntos de datos recopilados para varios lenguajes de programación.
Las propuestas para entornos de investigación colaborativa podrían promover avances más rápidos en la ingeniería de software al proporcionar recursos compartidos para la evaluación. Se ha introducido una herramienta de prueba de mutación fácil de usar para Java, que se integra eficientemente con herramientas de desarrollo y permite mejores prácticas de prueba.
Otro lenguaje específico del dominio para la minería de código fuente ha demostrado ser efectivo para examinar fallos en el código fuente y ayudar en el análisis de dependencia de cambios. Se ha explorado la relación entre pruebas automáticas y aplicaciones del mundo real, con el objetivo de reducir el código problemático a través de soluciones algorítmicas.
Se ha enfatizado la importancia de comprender las prácticas de mantenimiento de proyectos de software, siendo los hallazgos indicativos de un sobrecoste significativo por tareas de mantenimiento. Los conocimientos de esta investigación pueden ayudar a refinar estrategias de prueba y mejorar enfoques de gestión de proyectos.
Finalmente, se ha investigado el papel del aprendizaje automático en la generación de comentarios de código y la creación de resúmenes de código. Se están desarrollando programas para ayudar a asegurar que el código generado cumpla con los estándares de calidad esperados. Estas ideas están abriendo el camino para trabajos futuros, permitiendo mejoras en la automatización y la efectividad del output generado en varios contextos de programación.
Los avances en este campo subrayan que la investigación y las aplicaciones prácticas de las técnicas de prueba de software continúan evolucionando, proporcionando mejores herramientas y estrategias para los desarrolladores. La combinación de automatización, control de calidad y participación de la comunidad probablemente mejorará las prácticas de programación en el futuro.
Título: Using Large Language Models to Generate JUnit Tests: An Empirical Study
Resumen: A code generation model generates code by taking a prompt from a code comment, existing code, or a combination of both. Although code generation models (e.g., GitHub Copilot) are increasingly being adopted in practice, it is unclear whether they can successfully be used for unit test generation without fine-tuning for a strongly typed language like Java. To fill this gap, we investigated how well three models (Codex, GPT-3.5-Turbo, and StarCoder) can generate unit tests. We used two benchmarks (HumanEval and Evosuite SF110) to investigate the effect of context generation on the unit test generation process. We evaluated the models based on compilation rates, test correctness, test coverage, and test smells. We found that the Codex model achieved above 80% coverage for the HumanEval dataset, but no model had more than 2% coverage for the EvoSuite SF110 benchmark. The generated tests also suffered from test smells, such as Duplicated Asserts and Empty Tests.
Autores: Mohammed Latif Siddiq, Joanna C. S. Santos, Ridwanul Hasan Tanvir, Noshin Ulfat, Fahmid Al Rifat, Vinicius Carvalho Lopes
Última actualización: 2024-03-08 00:00:00
Idioma: English
Fuente URL: https://arxiv.org/abs/2305.00418
Fuente PDF: https://arxiv.org/pdf/2305.00418
Licencia: https://creativecommons.org/licenses/by/4.0/
Cambios: Este resumen se ha elaborado con la ayuda de AI y puede contener imprecisiones. Para obtener información precisa, consulte los documentos originales enlazados aquí.
Gracias a arxiv por el uso de su interoperabilidad de acceso abierto.
Enlaces de referencia
- https://www.siavoosh.com/blog/2019/01/05/latex-table-cell-coloring-based-on-values-in-the-cell/
- https://tex.stackexchange.com/questions/169475/referencing-in-subfloat-not-working/169477#169477
- https://tug.ctan.org/macros/latex/contrib/minted/minted.pdf
- https://doi.org/10.5281/zenodo.10530787
- https://docs.python.org/3/library/unittest.html
- https://docs.pytest.org/en/7.2.x/
- https://junit.org/junit5/docs/5.8.1/api/index.html
- https://coverage.readthedocs.io/en/6.5.0/
- https://www.jetbrains.com/idea/
- https://www.springboard.com/blog/data-science/machine-learning-gpt-3-open-ai/
- https://huggingface.co/Salesforce/codegen-350M-multi
- https://arxiv.org/pdf/2203.13474.pdf
- https://huggingface.co
- https://www.evosuite.org/experimental-data/sf110/