Booster les tests logiciels par l’IA

S’il est un domaine dans lequel l’Intelligence artificielle peut apporter de grands services, c’est bien celui des tests logiciels. L’IA peut soulager les testeurs des aspects les plus routiniers, répétitifs et sujets aux erreurs. Nous allons tenter ici de voir comment. Article paru dans L'Informaticien n°199 (septembre 2021).

Les enjeux des tests logiciels à base d’IA

La nécessité de tester un logiciel à chaque phase de son cycle de développement est reconnue par tous les professionnels de l’IT. Cela reste néanmoins une activité coûteuse en temps et en argent et difficile à maintenir sur le long terme. Pour répondre à cette problématique, des outils et des techniques permettant d’automatiser une partie des tests logiciels ont été développés. Cette automatisation n’est pas si simple à mettre en place. Il faut écrire les scripts et les maintenir à jour de façon régulière. Ceux-ci deviennent de moins en moins pertinents au fil des modifications et leur évolution peut se transformer en maintenance pure, rajoutant de la complexité pour un gain de moins en moins évident. Comment faire, alors, pour ne plus rédiger tous les cas de tests ? C’est ici que l’IA intervient.

L’Intelligence artificielle, kesako ?

Le terme «intelligence» n’a pas la même signification en anglais qu’en français, ce qui est souvent source de confusion. En anglais, intelligence se traduit plutôt par savoir, connaissance, sans notion aucune de conscience. Le terme IA, de nos jours, s’entend globalement comme la capacité d’une machine à apprendre d’elle-même par la pratique et un nombre important de données de références (Machine Learning et Deep Learning), à communiquer avec les humains de manière «naturelle » sans suivre un programme déterministe, sous la forme d’une conversation – le fameux test de Turing, du nom du célèbre informaticien anglais qui a, entre autres choses, cassé le cryptage des nazis et facilité le débarquement allié. Les exemples les plus courants sont les ChatBots, la reconnaissance d’images, la traduction automatiques, le ML et le DL en général.

DEVOPS TESTS CODE IA 01

Grâce au projet open source CodeNet, et d’après nos amis de Big Blue, l’utilisation de l’Intelligence artificielle pour la correction du code des applications sort enfin du stade expérimental.

L’apport de l’IA pour le testing et les types de tests concernés

Le développement et l’intégration de l’Intelligence artificielle dans les tests logiciels permet d’introduire une certaine automatisation des tests tout en éliminant une maintenance importante. Le but recherché est qu’elle soit la plus autonome possible, l’objectif étant qu’à terme les IA soient capables de détecter automatiquement les nouveautés d’une application, de créer les tests adéquats et de déterminer s’ils sont conformes ou non et s’ils comportent des bugs. Plus une application avance dans son cycle de développement, plus elle devient complexe et plus les efforts à fournir pour la tester dans son intégralité sont importants. Les possibilités offertes par l’Intelligence artificielle appliquée dans ce domaine du test sont très encourageantes. Les IA dédiées à ce travail sont capables d’effectuer un nombre de tests très important dans un délai très court, de repérer et de documenter instantanément les changements apportés dans l’application. Elles prennent un «cliché» d’une application avant et après chaque mise à jour pour les comparer. Elles peuvent ainsi apprendre à mieux travailler et gagner en efficacité après chaque cycle de test. Les IA de tests ont depuis déjà un certain temps appris par ML et DL en traitant des milliers voire des millions d’applications. Les types de tests pour lesquels elles sont les plus efficaces sont les tests de spécifications, ceux de non régression (TNR), les stress test et la prédiction des anomalies. Elles sont de plus en plus à même de générer des scripts à partir des spécifications, de faire de l’analyse statistique et, bien entendu, de générer des données de test.

La prédiction des défauts ou anomalies du code d’un logiciel

L’idée est ici de créer une espèce de modèle prédictif à partir des releases précédentes afin d’estimer le plus précisément possible les parties du code où le risque de rencontrer des défauts sera le plus élevé. Ceci est d’autant plus intéressant lorsque la release comporte un nombre de lignes de code très important. Cela permet de prioriser les composants à tester et d’ainsi optimiser l’effort de test (approche classique préconisée par l’ISTQB). Cela se fait via la vectorisation des données d’entrées qui prend en compte différents indicateurs. Ceux-ci sont la complexité du code, le nombre de lignes de code, la métrique d’Halstead, le nombre cyclomatique, celui de dépendances, le processus de développement, les révisions du composant, le nombre de refactoring, le nombre de corrections par rapport à leur ancienneté, le nombre de lignes de code modifiées, l’ancienneté du composant, l’identité du/des développeur(s) et le nombre de développeurs qui sont intervenus sur le module ou le projet global.

DEVOPS TESTS CODE IA 02

Deux grandes méthodes permettent à l’Intelligence artificielle «d’apprendre» : de manière supervisée ou de manière non supervisée.

Amélioration des tests exploratoires et rétro modélisation

L’IA peut également aider à l’automatisation de l’établissement du flow graph des applications. La problématique qui se pose généralement avec ce graphe est qu’il peut être très grand et du coup très difficile de le parcourir pour arriver à une branche pertinente et tester une fonctionnalité de l’application. L’IA peut être entraînée à reconnaître les étapes les plus importantes d’un flow graph afin de fluidifier son parcours automatique. Dans le cas de tests exploratoires, cela permettrait par exemple de parcourir l’application en commençant par les cas d’usages (use case) les plus employés par une première analyse de l’application et de son utilisation. Cela peut également permettre de générer des cas de test de non régression (TNR) de façon plus ciblée, sans devoir modéliser manuellement l’application en amont (approche de type MBT : Model Base Testing, complétant l’approche TDD, Test Driven Development).

Reconnaissance de forme

Les IA employées dans le domaine de la vision par ordinateur peuvent permettre de reconnaître certains éléments d’une interface graphique par leurs caractéristiques. Elles peuvent être employées pour automatiser une partie des tests d’affichage, soit à partir d’un modèle donné alimentant l’IA en analysant ce qui ne correspond pas au dit modèle d’une version à l’autre, soit en corrigeant/réécrivant automatiquement des scripts d’automatisation de test lorsqu’un script ne fonctionne plus ou qu’un objet n’est plus reconnu.

Application à l’optimisation des TNR

L’IA peut aussi être employée pour analyser les TNR (Tests de Non Régression) existants afin de trouver la meilleure combinatoire et le meilleur ordre d’enchaînement. Les points concernés sont, principalement, les tests diminuant le temps d’exécution, la réduction du nombre de cas de tests pour atteindre un objectif de testing, les tests permettant une couverture complète, ceux liés à des changements de code récents et les tests dépendant d’exigences avec un risqué élevé.

Quels sont les outils de testing automatique employant l’IA ?

Parmi les quelques exemples d’outils de testing faisant d’ores et déjà usage de l’Intelligence artificielle, nous pouvons citer Austin, EvoSuite, Functionize, Infer ou Intellitest. Infer est un outil d’analyse statique de code Java et Objective-C utilisé entre autres par Facebook pour ses développements d’application mobile. Il est capable de détecter automatiquement des anomalies dans le code via une approche Devops.

DEVOPS TESTS CODE IA 03

EvoSuite est capable de générer automatiquement des cas de test pour des projets écrits en Java. Il gère la couverture globale du code.

EvoSuite, des tests unitaires pour Java

Pour réussir à trouver des dysfonctionnements dans un logiciel, il faut créer des cas de test automatiques, des oracles et des prédictions évaluant l’exactitude du comportement observé lors de l’exécution du logiciel. EvoSuite est capable de générer automatiquement des cas de test avec des assertions pour les classes Java. Il applique pour cela une nouvelle approche hybride en générant et optimisant les ensembles de test complets. Son algorithme est évolutif. Il créé une population initiale générée au hasard avec l’évaluation des performances de chaque individu. EvoSuite gère la couverture globale du code, les mutations et la reproduction par mélange des caractéristiques de chaque individu ainsi que la réitération du processus. Voici, en résumé, ce que propose EvoSuite :

  • • La génération de tests JUnit pour les classes sélectionnées
  • • L’optimisation de différents critères de couverture tels que les lignes, les branches, les sorties et les tests de mutation
  • • La réduction du nombre de tests : seuls ceux contribuant à la couverture sont conservés
  • • La génération de JUnit permet de capturer le comportement des classes testées
  • • Les tests s’exécutent dans un bac à sable afin d’éviter tout risque potentiel
  • • L’emploi d’un système de fichiers et d’un réseau virtuels.

IntelliTest for .NET, les tests unitaires avec Visual Studio

L’écriture d’une combinaison de tests unitaires exerçant et validant de manière exhaustive la logique du code n’est pas si aisée. La fonctionnalité IntelliTest d’expédition dans Visual Studio Enterprise Edition permet d’obtenir une couverture de code élevée pour un coût raisonnable. Lorsque vous exécutez IntelliTest sur votre code .NET (C#, VB .Net, F#, …), il génère des cas de test en analysant dynamiquement le code du programme. C’est un outil encore assez sommaire mais très pratique.

Functionize

Functionize est un outil dans le Cloud pour l’enregistrement des tests basé sur une extension Chrome. Il génère automatiquement des tests à partir des utilisateurs réels des sites web.

DEVOPS TESTS CODE IA 06

Avec Functionize, vous entrez de plain pied dans le monde des solutions de testing low code pour vos sites web.

Sapienz

Open source, Sapienz est un outil basé sur les techniques de recherche méta-heuristique (algorithme génétique, recherche de type tabu, emploi de l’optimisation combinatoire…). Son rôle est d’optimiser des données et des cas de test.

Appdiff

Appdiff s’utilise uniquement sur les applications Android. C’est un outil SaaS permettant d’uploader le fichier apk d’une application Android pour le faire analyser. Contrairement à du monkey testing, l’IA permet de parcourir les branches les plus pertinentes de l’application en classifiant les actions réalisables pour chaque interface d’affichage.

En résumé, les outils de testing employant l’IA se concentrent principalement sur les tests unitaires, l’intégration, l’affichage et la génération de données de test. Ils se positionnent comme des outils d’aide aux testeurs avec la réparation automatique des scripts et l’analyse de risque. Les nouvelles IA de testing, les GAN notamment (lire l’encadré), ne sont pas disponibles dans tous les outils proposés actuellement, loin s’en faut.

Automatisation des tests sans code

Le mouvement no-code ayant pris de l’ampleur depuis déjà quelques années, il devient de plus en plus pertinent dans le domaine des tests. Les outils de test sans code sont basés sur des algorithmes d’IA qui utilisent la modélisation visuelle pour créer rapidement et automatiquement des cas de test. Tout cela doit être basé sur d’autres tests automatisés développés au préalable par des ingénieurs qualité, mais cela reste une excellente alternative pour écrire facilement des scénarios de test en peu de temps. Les tests sans code étant efficaces et très faciles à réviser, de plus en plus d’outils tels que Ghost Inspector, tests.ai, Testsigma, ou TestComplete sont employés par de petites entreprises.

IBM dope la correction de code à l’IA avec CodeNet

Le projet open source CodeNet (https:// github.com/IBM/Project_CodeNet) vise à faire pour l’IA for code ce que ImageNet a fait pour la vision par ordinateur, dixit IBM. L’utilisation de l’Intelligence artificielle pour la correction du code des applications sort enfin du stade du Proof-of-concept, toujours d’après Big Blue. Avec sa volumineuse base d’échantillons de code, le projet va contribuer à sa généralisation. L’énorme dataset de CodeNet comprend près de 14 millions de soumissions de code, dont plus de la moitié sont acceptées, les autres étant associées à différentes causes de rejet. Le projet CodeNet a l’ambition d’aller plus loin dans l’AI for code. Il a pour objectif de fournir à la communauté un vaste ensemble d’exemples de code, organisé et diversifié. Il comporte en tout 500 millions de lignes de programmation dans plus de 55 langages différents : 95 % d’entre elles dans l’un des six langages les plus couramment employés : C, C++, C#, Java, Python et Ruby. Chaque échantillon est présenté comme une solution à l’un des 4 000 problèmes de codage. Ce qui distingue CodeNet des initiatives déjà menées, c’est d’une part la mise à disposition d’exemples sur plus de 50 langages, avec différentes informations : la taille, l’empreinte mémoire, le runtime CPU, ainsi que le statut qui indique les types d’acceptation ou d’erreur. Plus de 90% des problèmes rencontrés sont décrits, avec les formats d’entrée et de sortie. « Les utilisateurs peuvent exécuter les échantillons de code acceptés afin d’en extraire des métadonnées supplémentaires et de vérifier l’exactitude des résultats des modèles d’IA génératifs », toujours d’après IBM.


Les différents types d’apprentissage des IA

Une IA peut «apprendre» selon deux grandes méthodes, soit de manière supervisée, soit de manière non supervisée. Avec la méthode supervisée, la machine apprend via des exemples fournis avec des résultats attendus, avec des réponses de type OK/KO sur les données d’apprentissage. Le résultat dépend alors grandement du volume des données mais aussi de leur qualité. En employant l’autre méthode, la non supervisée, les valeurs de sorties ne sont pas totalement prévisibles. Les algorithmes d’apprentissage non-supervisés doivent être capables de trouver des corrélations dans les données d’entrée. Cela permet de réaliser des regroupements de fonctions ou d’objets ou ayant un comportement attenant ou de détecter des comportements anormaux relativement aux comportements habituels de telle fonction ou telle application, cela pouvant être très utile pour détecter d’éventuelles anomalies.


Les GAN

DEVOPS TESTS CODE IA 04

Les Generative Adversarial Network (GAN) permettent d’entraîner deux intelligences artificielles à la fois, l’une appliquée à la classification, l’autre à la génération de données appartenant à l’une des classes déterminées par la première. Elles génèrent de manière autonome des jeux de données de test. Le traitement peut se résumer ainsi : génération des données d’entrées (jeux de données de test) et classification des données d’entrées pertinentes. Elles sont, à l’heure actuelle, appliquées essentiellement au traitement d’images mais leur utilisation s’étend à d’autres domaines. Il ne faut pas perdre de vue que les données d’entrées représentent une problématique majeure du testing. Plus le spectre d’utilisation du logiciel est grand, plus la création et la sélection de tests pertinents par le testeur est longue et complexe. Le testeur doit à la fois générer des configurations de tests dans un espace très grand et faire en sorte qu’elles soient pertinentes. C’est exactement ce que fait un GAN en générant des données déjà classifiées.


DEVOPS TESTS CODE IA 05