Simple Science

La science de pointe expliquée simplement

# Informatique# Génie logiciel

Exploiter les LLM pour des tests basés sur les propriétés

Explorer comment les LLM peuvent aider dans les tests basés sur des propriétés pour les logiciels.

― 10 min lire


Les LLM transforment leLes LLM transforment letest de propriétéde propriétés basés sur le logiciel.Utiliser l'IA pour améliorer les tests
Table des matières

Les Tests basés sur les propriétés (PBT) sont une méthode utilisée dans les tests de logiciels pour vérifier si un programme fonctionne correctement dans un large éventail de situations. Contrairement aux tests traditionnels, qui se concentrent sur des exemples spécifiques, le PBT génère des entrées aléatoires pour voir comment le programme réagit. Cette approche permet aux testeurs de trouver des bugs qui pourraient ne pas apparaître dans des cas de test habituels.

Le PBT existe depuis un moment et est bien considéré dans la communauté de recherche en logiciels. Cependant, beaucoup de développeurs dans le monde réel ne l'utilisent toujours pas. Les principaux défis qu'ils rencontrent incluent la création de données aléatoires variées et la définition de propriétés utiles à tester.

Les développeurs préfèrent souvent rédiger de la documentation pour leur code plutôt que des tests. Heureusement, la plupart des bibliothèques sont accompagnées de documentation API, qui peut servir de guide pour rédiger des tests basés sur les propriétés. Les grands modèles de langage (LLMs) ont montré leur potentiel dans diverses tâches de programmation, y compris la génération de tests. Cet article explore comment les LLMs peuvent aider à créer efficacement des tests basés sur les propriétés.

Les défis des tests basés sur les propriétés

Malgré ses avantages potentiels, le PBT reste sous-utilisé dans l'industrie du logiciel. Des recherches ont montré qu'un petit pourcentage de paquets Python utilise la bibliothèque PBT populaire appelée Hypothesis, même si elle a une grande communauté sur des plateformes comme GitHub. Des interviews avec des développeurs ont révélé deux principales difficultés qu'ils rencontrent en essayant de mettre en œuvre le PBT :

  1. Création de Générateurs de données aléatoires : Les développeurs ont du mal à écrire des fonctions qui peuvent générer des entrées aléatoires pour leurs tests.

  2. Définir des propriétés significatives : Il peut être difficile pour les développeurs d'exprimer quelles propriétés devraient être testées pour s'assurer que leur code fonctionne comme prévu.

De plus, le "problème de masse critique" suggère que le PBT n'est pas largement connu ou pratiqué parmi les développeurs de logiciels.

Le rôle de la documentation

Bien que de nombreux développeurs trouvent le PBT difficile, ils sont généralement à l'aise avec la rédaction de documentation. Une bonne documentation pour les fonctions de bibliothèque est courante, surtout dans des langages comme Python. Cette documentation contient souvent des détails importants sur les paramètres d'entrée et les sorties attendues.

Étant donné que les LLMs sont efficaces pour générer du code à partir de descriptions en langage naturel, ils peuvent potentiellement utiliser la documentation API pour créer des tests basés sur les propriétés. L'idée est que la documentation pourrait guider le LLM dans la génération à la fois d'entrées aléatoires et de propriétés significatives à tester le logiciel.

Utilisation des grands modèles de langage

Récemment, les LLMs ont gagné en popularité pour les tâches de génération de code. Ces modèles sont entraînés sur de grandes quantités de texte et de code, ce qui leur permet de comprendre diverses tâches de programmation. Ils peuvent traduire des instructions en langage naturel en code et ont montré leur potentiel pour générer des tests unitaires de zéro.

Dans ce travail, nous étudions comment les LLMs peuvent être utilisés pour créer des tests basés sur les propriétés en se basant sur la documentation API. Nous croyons que les informations contenues dans la documentation peuvent aider les LLMs à produire des générateurs d'entrées aléatoires et des Assertions de propriété significatives à vérifier.

Exemple de tests générés par LLM

Considérons un exemple utilisant la méthode numpy.cumsum pour illustrer comment un LLM peut générer un test basé sur les propriétés. Le LLM peut produire de la logique qui génère des valeurs aléatoires pour les paramètres d'entrée et vérifie les propriétés du résultat.

  1. Génération d'entrées aléatoires : Le LLM crée des listes et des données aléatoires pour les paramètres requis.

  2. Appel de la fonction : Il appelle ensuite la méthode cumsum avec les entrées générées.

  3. Vérification des propriétés : Le LLM ajoute des assertions pour vérifier les caractéristiques de la sortie. Par exemple, il peut confirmer que la sortie a la même taille que l'entrée ou vérifier le dernier élément du résultat par rapport à une somme.

Bien que ce ne soit pas un test basé sur les propriétés parfait, cela montre que les LLMs peuvent écrire des tests qui génèrent des entrées aléatoires et dérivent des assertions de propriété pertinentes en fonction de la documentation API.

Approche PBT-GPT

Dans notre travail, nous introduisons une méthode appelée PBT-GPT, qui utilise les LLMs pour générer des tests basés sur les propriétés. Notre approche consiste à concevoir des prompts qui incluent la documentation API et des instructions spécifiques pour le LLM.

Nous divisons le processus en deux principales tâches :

  1. Synthèse de la fonction génératrice : Cela implique de créer un générateur d'entrées aléatoires pour la méthode testée.

  2. Synthèse des propriétés : Cette tâche se concentre sur la génération d'assertions de propriété basées sur les caractéristiques des sorties.

Nous pouvons créer des prompts pour trois tâches :

  • Créer uniquement la fonction génératrice.
  • Créer uniquement des assertions de propriété.
  • Créer à la fois le générateur et les assertions dans un seul test.

Nous explorons comment le LLM fonctionne pour chaque tâche et identifions divers moyens par lesquels il peut échouer. Nous proposons ensuite une méthodologie pour évaluer la qualité de ces tests.

Évaluation de la qualité des tests générés

Pour évaluer la qualité des tests basés sur les propriétés générés, nous nous concentrons sur deux critères : la qualité du générateur d'entrées et la qualité des assertions de propriété.

Qualité du générateur

  1. Validité du générateur : Cela vérifie si le générateur peut produire des entrées aléatoires sans erreurs. Par exemple, si un générateur produit des valeurs qui causent des erreurs à l'exécution, il est considéré comme invalide. Nous mesurons le pourcentage d'exécutions réussies du générateur par rapport au nombre total d'exécutions pour déterminer sa validité.

  2. Diversité du générateur : Il est également crucial que le générateur puisse produire une large gamme d'entrées. Si un générateur ne crée qu'un ensemble étroit d'entrées, il peut ne pas tester complètement la méthode API. Nous mesurons dans quelle mesure le générateur couvre différents chemins de code au sein de la méthode pour évaluer la diversité.

Qualité des propriétés

  1. Validité des propriétés : Une assertion de propriété est invalide si elle entraîne une erreur à l'exécution. Par exemple, si une assertion tente d'appeler une méthode inexistante, elle est considérée comme invalide. Nous mesurons le taux de propriétés valides à travers plusieurs tests pour évaluer cela.

  2. Solidité des propriétés : Une propriété solide devrait être vraie pour toutes les entrées valides. Si une assertion de propriété échoue fréquemment, cela peut indiquer que la propriété n'est pas solide. Nous vérifions la fréquence des échecs d'assertions durant les tests pour évaluer la solidité.

  3. Force des propriétés : Enfin, la force d'une propriété fait référence à sa capacité à vérifier des comportements significatifs dans le code. Nous mesurons à quel point les assertions de propriété sont efficaces pour détecter des erreurs introduites dans le système. Cela peut être fait à l'aide de tests de mutation, où nous évaluons combien de versions modifiées (mutantes) du code peuvent être détectées par les assertions.

Défis et stratégies d'atténuation

Bien que la génération de tests basés sur les propriétés à l'aide des LLMs montre un potentiel, cela peut aussi présenter des défis. Voici quelques problèmes courants et des stratégies pour y faire face :

  • Générateurs invalides : Si un générateur entraîne des erreurs à l'exécution, nous pouvons inviter le LLM avec les détails de l'erreur et lui demander de corriger l'erreur. Ce processus peut aider à créer un générateur valide.

  • Générateurs à faible diversité : Si un générateur produit des types d'entrées limités, nous pouvons demander au LLM d'incorporer des caractéristiques plus diverses. Par exemple, nous pourrions demander qu'il génère à la fois des graphes dirigés et non dirigés.

  • Propriétés invalides : Pour les propriétés qui entraînent des erreurs, nous pouvons fournir des messages d'erreur au LLM et demander des corrections.

  • Propriétés non solides : Si une assertion de propriété échoue sur des entrées spécifiques, il est essentiel d'informer le LLM et de fournir des exemples. Ainsi, le modèle peut affiner la propriété pour s'assurer qu'elle n'indique pas faussement des problèmes.

  • Propriétés faibles : Si une assertion de propriété est trop basique, nous pouvons fournir des exemples de cas plus complexes et demander au LLM de créer des propriétés plus solides.

Conclusion et futures directions

En conclusion, nous avons montré le potentiel d'utiliser les LLMs pour synthétiser des tests basés sur les propriétés. Nos études préliminaires sur des échantillons de bibliothèques Python démontrent que les LLMs peuvent produire des générateurs divers et des propriétés pertinentes basées sur la documentation.

À l'avenir, nous visons à améliorer nos conceptions de prompts pour inclure des fonctionnalités plus avancées du test basé sur les propriétés, telles que des conditions qui guident le générateur à produire des attributs spécifiques. Ces améliorations peuvent aider le LLM à produire des tests encore plus efficaces.

De plus, notre travail souligne comment les LLMs peuvent aider les développeurs à rédiger des tests basés sur les propriétés. Cela pourrait réduire les barrières empêchant les développeurs d'adopter le PBT, permettant ainsi des tests plus robustes dans les pratiques de développement logiciel.

Nous travaillons à créer une plateforme conviviale pour que les développeurs puissent tirer parti des LLMs dans la génération de tests basés sur les propriétés de haute qualité, facilitant ainsi leur utilisation de cette méthode de test précieuse. Notre objectif est de rendre le PBT plus accessible et d'encourager son incorporation dans les pratiques de test standard dans l'industrie du logiciel.

Source originale

Titre: Can Large Language Models Write Good Property-Based Tests?

Résumé: Property-based testing (PBT), while an established technique in the software testing research community, is still relatively underused in real-world software. Pain points in writing property-based tests include implementing diverse random input generators and thinking of meaningful properties to test. Developers, however, are more amenable to writing documentation; plenty of library API documentation is available and can be used as natural language specifications for PBTs. As large language models (LLMs) have recently shown promise in a variety of coding tasks, we investigate using modern LLMs to automatically synthesize PBTs using two prompting techniques. A key challenge is to rigorously evaluate the LLM-synthesized PBTs. We propose a methodology to do so considering several properties of the generated tests: (1) validity, (2) soundness, and (3) property coverage, a novel metric that measures the ability of the PBT to detect property violations through generation of property mutants. In our evaluation on 40 Python library API methods across three models (GPT-4, Gemini-1.5-Pro, Claude-3-Opus), we find that with the best model and prompting approach, a valid and sound PBT can be synthesized in 2.4 samples on average. We additionally find that our metric for determining soundness of a PBT is aligned with human judgment of property assertions, achieving a precision of 100% and recall of 97%. Finally, we evaluate the property coverage of LLMs across all API methods and find that the best model (GPT-4) is able to automatically synthesize correct PBTs for 21% of properties extractable from API documentation.

Auteurs: Vasudev Vikram, Caroline Lemieux, Joshua Sunshine, Rohan Padhye

Dernière mise à jour: 2024-07-21 00:00:00

Langue: English

Source URL: https://arxiv.org/abs/2307.04346

Source PDF: https://arxiv.org/pdf/2307.04346

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.

Plus d'auteurs

Articles similaires