Avancées dans les outils de génération de code et de test
De nouvelles méthodes et outils améliorent les capacités de test logiciel et de génération de code.
― 10 min lire
Table des matières
Les études précédentes se sont concentrées sur la création de programmes informatiques capables d'effectuer automatiquement des tâches spécifiques, ce qu'on appelle la Génération de code. Une méthode consiste à transformer des descriptions de tâches en règles, où les conditions satisfaisantes mènent à un programme généré. Une autre approche utilise des réseaux spéciaux pour relier des descriptions textuelles à des structures de programmation, créant ensuite du code en prenant en compte différentes parties. Les grands modèles de langage ont aussi montré de fortes capacités à produire du code en fonction du contexte donné. Plusieurs modèles de langage majeurs ont été publiés pour générer du code après avoir été formés sur d’énormes ensembles de données contenant des exemples de code. Notamment, un outil appelé GitHub Copilot utilise une version améliorée de l'un de ces modèles pour aider les utilisateurs à écrire du code et résoudre des problèmes de programmation de base.
Les efforts récents visent à améliorer la façon dont ces modèles de langage créent, ajustent et appliquent des méthodes de génération de code. Bien que l'utilisation de modèles de langage pour les tests logiciels ne soit pas courante, certains ont exploré leur application dans des tâches comme prédire les tests qui pourraient échouer. Des outils comme GPT-3 ont été utilisés pour tester des interfaces graphiques logicielles. Notre enquête ne se concentre pas sur la génération de code, mais plutôt sur la manière dont un outil de génération de code accessible au public peut aider avec des tâches spécifiques comme créer des Tests Unitaires sans nécessiter d'ajustements.
Une étude menée au niveau des cycles supérieurs en tests logiciels a identifié les méthodes et étapes de test couramment utilisées. Un grand nombre de papiers provenant à la fois des entreprises et du milieu académique ont été analysés, mettant en lumière les odeurs de test et proposant des outils pour les détecter. Une autre étude s'est penchée sur les tests logiciels pour les applications mobiles, évaluant l'efficacité, la conception et identifiant les bogues dans le code de production. Des revues de littérature ont été réalisées pour identifier les outils de test disponibles et leur efficacité à détecter des problèmes.
Dans le domaine des tests unitaires, plusieurs papiers ont traité de la génération de tests, bien que par différentes méthodes. Un papier a proposé une méthode basée sur la recherche qui génère des tests pour détecter les changements fonctionnels entre deux versions de programme, tandis qu'un autre a suggéré de générer des cas de test unitaire en apprenant à partir d'exemples du monde réel. Un troisième papier a décrit une approche améliorée pour la génération aléatoire de tests en utilisant les retours obtenus pendant l'exécution des tests.
Des papiers utilisant de grands modèles de langage pour la génération de tests émergent. Une étude a exploré l'utilisation d'un modèle de langage appelé Codex pour créer automatiquement des tests unitaires. Un autre a combiné une approche basée sur la recherche avec un modèle de langage pour voir si cela pourrait aider dans les tests logiciels. Un papier s'est concentré sur la création d'un prompt efficace pour aider les modèles de langage avec diverses tâches liées au code.
Certains papiers ont fourni des aperçus sur le test sans introduire de nouvelles solutions ; par exemple, une étude a évalué comment un modèle de langage de code pré-entraîné interagit avec les changements de code, la création de tests à partir de descriptions et les tests de mutation. D'autres ont examiné des stratégies pour minimiser le temps consacré à l'écriture de tests ou s'assurer que les modifications de code sont également couvertes par des tests.
Le domaine de la génération de tests est vaste et comprend des approches variées traitant de différents défis. Il a évolué au fil des ans avec des études pertinentes datant d'au moins 2007. Notre travail s'inscrit dans cette riche diversité en proposant une approche novatrice et visant à contribuer aux connaissances existantes.
Un outil appelé DeepTC-Enhancer utilise des techniques d'apprentissage profond pour améliorer la qualité et la lisibilité des tests générés automatiquement. Les évaluations ont montré que les développeurs trouvaient les cas de test générés plus significatifs et compréhensibles. Une autre méthode, appelée BOT, attribue intelligemment les ressources de test là où elles sont le plus nécessaires, ce qui conduit à une meilleure couverture et efficacité.
Une analyse de la qualité des identifiants dans le code de test a révélé qu'ils sont généralement de qualité inférieure par rapport au code de production. L'étude a évalué l'efficacité des outils de renommage pour améliorer les noms de code de test. La recherche sur la sensibilisation des développeurs aux odeurs de test a mis en évidence leur préférence pour des stratégies établies pour résoudre ces problèmes. De plus, une étude a souligné la valeur de l'éducation aux tests logiciels pour améliorer les compétences en programmation, montrant des améliorations mesurables dans la fiabilité du code parmi les étudiants ayant ce type de connaissance.
Une technique pour évaluer la détection des refactorisations a été introduite, où des outils ont été testés pour leur capacité à reconnaître les changements effectués pendant la programmation. Une autre approche a proposé d'utiliser des algorithmes génétiques pour générer des tests unitaires, incluant un outil de visualisation pour aider à examiner et peaufiner le processus de test. Il existe une méthode qui reproduit les plantages dans les programmes en utilisant des algorithmes génétiques, s'attaquant aux défis posés par les langages de codage dynamiques.
Un outil nommé Hapao aide à identifier les zones nécessitant plus de tests en présentant des métriques visuelles sur la couverture des tests. La recherche sur la manière dont les opérations de refactorisation sont liées à l'efficacité de l'ensemble de tests a révélé que de nombreux changements ne cassent pas les tests, mais certains types de refactorisation peuvent, sans le vouloir, mener à des problèmes. Pendant ce temps, une approche systématique a été proposée pour générer des tests unitaires, garantissant qu'ils respectaient de bonnes principes de conception.
La relation entre les tests et la qualité du code de production a été explorée, identifiant comment divers facteurs liés aux tests peuvent impacter les défauts après publication. Les études ont indiqué les effets néfastes des odeurs de test sur la maintenabilité et l'efficacité, entraînant le développement d'un outil pour détecter et refactoriser ces problèmes automatiquement. La qualité du code de test produit par des outils automatisés a aussi été scrutée, découvrant des problèmes fréquents qui peuvent affecter négativement la fiabilité du code final.
Un cadre a été introduit qui permet aux testeurs de spécifier des incertitudes dans les systèmes logiciels et d'utiliser des probabilités pour améliorer la précision des tests. Un outil automatique a été développé pour détecter les odeurs de test dans le code Java, démontrant flexibilité et haute précision de détection. La recherche sur le marquage des méthodes dans les tests unitaires a montré que des approches systématiques peuvent améliorer la clarté et l'utilité des tests.
La connexion entre l'évolution des odeurs de test et les défauts du code de production a été examinée à travers une étude, qui a indiqué une corrélation où certaines odeurs sont souvent liées à des défauts. Une méthode pour générer des assertions significatives dans les méthodes de test utilisant une technique de traduction a été proposée, montrant des promesses pour aider les développeurs pendant les tâches de codage.
Des expériences ont souligné la nécessité d'améliorer les pratiques de documentation des bogues qui renforcent la résolution des problèmes en fournissant des étapes plus claires pour reproduire les problèmes. La recherche sur l'impact de différentes conditions expérimentales sur le comportement et les dommages a montré l'importance des stratégies de survie dans des environnements difficiles.
Une étude a discuté de la documentation systématique des décisions architecturales pour améliorer la manière dont ces décisions sont partagées entre les parties prenantes. Une autre a établi un cadre pour examiner les pratiques de documentation dans le développement logiciel continu, révélant des défis communs et suggérant des outils améliorés pour une meilleure qualité de documentation.
La recherche sur la gestion de la dette technique a démontré que ces dettes peuvent freiner la qualité globale du système, proposant un modèle pour traiter la dette technique architecturale et améliorer la prise de décision dans la conception des logiciels. Un outil a été créé pour aider les développeurs à trouver des posts pertinents sur des forums d'aide, améliorant le processus de recherche d'informations liées aux problèmes de codage.
L'extraction de rationales à partir de messages en ligne a révélé qu'une grande partie des discussions concerne les raisons derrière les décisions. L'apprentissage automatique a été appliqué pour classifier ces discussions, offrant des aperçus sur la dynamique de la communauté. Des approches ont été explorées pour améliorer la rédaction des messages de validation, en se concentrant sur le perfectionnement à travers des ensembles de données collectées pour divers langages de programmation.
Des propositions pour des environnements de recherche collaboratifs pourraient favoriser des avancées plus rapides en ingénierie logicielle en fournissant des ressources partagées pour l'évaluation. Un outil de test de mutation convivial pour Java a été introduit, s'intégrant efficacement aux outils de développement et permettant de meilleures pratiques de test.
Un autre langage spécifique au domaine pour l'extraction de code source a montré son efficacité pour examiner les défauts du code source et aider dans l'analyse de dépendance des changements. La relation entre les tests automatiques et les applications réelles a été explorée, visant à réduire le code problématique grâce à des solutions algorithmiques.
L'importance de comprendre les pratiques de maintenance des projets logiciels a été soulignée, avec des conclusions indiquant des charges importantes dues aux tâches de maintenance. Les informations provenant de cette recherche peuvent aider à affiner les stratégies de test et améliorer les approches de gestion de projet.
Enfin, le rôle de l'apprentissage automatique dans la génération de commentaires de code et le résumé du code a été examiné. Des programmes sont en cours de développement pour aider à garantir que le code généré respecte les normes de qualité attendues. Ces idées ouvrent la voie à des travaux futurs, permettant des améliorations dans l'automatisation et l'efficacité des sorties générées dans divers contextes de programmation.
Les avancées dans le domaine soulignent que la recherche et les applications pratiques des techniques de test logiciel continuent d’évoluer, fournissant de meilleurs outils et stratégies pour les développeurs. La combinaison de l'automatisation, du contrôle de qualité et de l'implication de la communauté est susceptible d'améliorer les pratiques de programmation à l'avenir.
Titre: Using Large Language Models to Generate JUnit Tests: An Empirical Study
Résumé: 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.
Auteurs: Mohammed Latif Siddiq, Joanna C. S. Santos, Ridwanul Hasan Tanvir, Noshin Ulfat, Fahmid Al Rifat, Vinicius Carvalho Lopes
Dernière mise à jour: 2024-03-08 00:00:00
Langue: English
Source URL: https://arxiv.org/abs/2305.00418
Source PDF: https://arxiv.org/pdf/2305.00418
Licence: https://creativecommons.org/licenses/by/4.0/
Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.
Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.
Liens de référence
- 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/