Intelligence artificielle IA appliquée au test de logiciel / AI Based Testing

Ce texte est une synthèse de la présentation faites par Julien Van Quackebeke lors de la soirée test logiciel de Sophia Antipolis en octobre 2017. Cet article vous fera découvrir un peu plus sur l’intelligence artificielle IA appliquée aux tests de logiciels (AI based Testing).

1. IA appliquée Test de logiciel : les enjeux du AI based testing

La nécessité de tester un logiciel à chaque phase de son développement est désormais une nécessité reconnue par les professionnels de l’IT. Cependant cela reste une activité coûteuse en temps et donc en argent…

Face à ce constat ont été développés des outils et des techniques qui permettent d’automatiser une partie des tests logiciels. Toutefois cette automatisation n’est pas une solution miracle car il faut encore écrire les scripts et les maintenir à jour de façon régulière. Elle devient de moins en moins pertinente au fil des mis à jour et se transforme en maintenance pure, rajoutant de la complexité pour un gain parfois réduit. Surtout, le fait de lancer toujours le même set de scripts de test affecte l’efficacité même de ces tests dans le temps.

Mais existe-il une nouvelle approche ? Est-il possible de se passer de l’automatisation des tests voir de ne plus rédiger tous les cas de tests ?

Ces dernières années l’Inteligence artificielle (IA, deep learning ; machine learning) se développe rapidement. Cela se confirme dans de nombreux métiers, alors pourquoi pas dans le domaine du test ? Serait-il possible d’utiliser l’IA dans le domaine du métier du test logiciel ?

Avant de rentrer plus dans les détails, voici cependant quelques précisions préalables en ce qui concerne la notion d’IA.

2. L’intelligence artificielle IA c’est quoi ?

Le terme “intelligence” n’a pas la même signification en Anglais et en Français.

En anglais la traduction exacte serait plus le savoir / la connaissance que l’intelligence qui elle sous-entend généralement la notion de conscience…ce qui n’est pas de cas des robots ou IA… à ce jour.

Lorsqu’on parle d’IA on parle souvent de capacité d’une machine à apprendre par elle-même via des exemples et un nombre important de données de références, à communiquer avec l’humain de manière « naturelle » sans suivre un programme déterministe, sous la forme d’une conversation (ex ChatBoot, reconnaissance d’images, traductions.)

Une IA peut « apprendre » de différentes manières :

Soit de manière supervisée :

L’intelligence artificielle IA c’est quoi ?

On apprend à la machine via des exemples avec des résultats attendus.

On donne des exemples OK / KO sur des données d’apprentissage, le résultat dépend en partie du volume des données ET de leur qualité.

Soit de manière non supervisée :

L’intelligence artificielle IA c’est quoi ? IA et Test

Dans ce cas il n’y a pas de valeurs de sorties attendues. Les algorithmes d’apprentissage non supervisé ont la capacité de trouver des corrélations dans les données d’entrée.

Cela permet de réaliser des regroupements d’objets ou de fonctions ayant un comportement proche, ou de détecter des comportements anormaux relativement aux comportements habituels d’une fonction ou d’une application, et cela peut être très utile pour détecter des… anomalies.

Exemple de clustering : regroupement de produits similaires sur un site de voyage ; Exemple de détection d’anomalies : surveillance du trafic réseau ;

Les GAN (Generative Adversarial Network)

Les 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 considérées.
Aujourd’hui appliqué au traitement d’images.
Yann LeCun : chercheur pionnier dans l’IA, Directeur IA chez Facebook estime que cette approche est la plus intéressante.

Les GAN (Generative Adversarial Network)

Le développement et l’intégration de l’Intelligence Artificielle dans les tests de logiciel permettent au contrainte d’introduire une certaine automatisation des tests tout en éliminant cette maintenance importante car son but est d’être, dans une certaine mesure, autonome. En effet l’objectif est qu’à terme les IA soient capables de détecter automatiquement les nouveautés et les chemins d’une application et de déterminer s’ils sont conformes ou non et s’ils rencontrent des anomalies.

Plus une application avance dans son 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 au domaine du test sont à ce titre très encourageantes. Les IA sont capables d’effectuer un nombre de test important dans un délai très court et de repérer, de documenter instantanément les changements repérés dans l’application, en prenant une “photo” d’une application avant et après une mise à jour pour les comparer. Elles peuvent apprendre et donc gagner en efficacité après chaque logiciel testé.

3. IA appliquée au test de logiciel : quels types de tests sont concernés ? Quel est l’apport de l’IA ?

Les IA de tests ont déjà commencé à tester et à apprendre des centaines d’applications et il est d’ores et déjà possible de les utiliser pour effectuer certains types de tests :

  • Test de spécifications
  • Prédiction des anomalies
  • Test de non régression
  • Stress test
  • Génération de script à partir des spécifications
  • Analyse statistique
  • Génération des données de test

Prédiction des défauts ou anomalies du code d’un logicielPrédiction des défauts ou anomalies du code d’un logiciel 

L’idée est de créer un modèle prédictif à partir des précédentes releases, pour estimer où le risque de défauts est le plus élevé. Particulièrement intéressant quand la release comporte un nombre de lignes de code très important. Cela permet ensuite une priorisation des composants à tester et donc d’optimiser l’effort de test (approche bien connue de l’ISTQB). C’est une manière plus scientifique d’estimés les risques / aux approches actuelles.

Vectorisation des données d’entrées :

Complexité du code, Lignes de code, Métrique d’Halstead, Nombre cyclomatique, Nombre de dépendances, Processus de développement, Révisions du composant, Nombre de refactoring, Nombre de corrections/ ancienneté des corrections, Nombre de lignes de code modifiées, Ancienneté du composant, identité du Développeurs, Nombre d’intervenants sur le module…

IA appliquée au test de logiciel : amélioration des tests exploratoires, rétro modélisation d’une application 

IA appliquée au test de logiciel

L’IA peut également aider à l’automatisation du flow graph des applications. La problématique étant que ce graphe étant en général très grand, il est difficile et/ou long de parvenir jusqu’à une branche pertinente permettant de tester une fonctionnalité importante de l’application. L’IA peut être entraînée à reconnaître les étapes les plus importantes dans un flow graph afin de permettre de fluidifier le parcours automatique du flow graph. Exemple: l’IA donnera un poids beaucoup plus important aux branches passant par login, checkout, pay, etc… dans le cadre d’un site d’e-commerce.

Pour du test exploratoire par exemple, cela permettrait de parcours l’application en commençant par les cas d’usages les plus utilisés par une première analyse de l’application et de son utilisation.

Cela pourrait également permettre de générer des cas de test de TNR de manière plus ciblé, sans devoir modéliser manuellement l’application en amont (approche type MBT : Model Base Testing)

Reconnaissance de forme

Les intelligences artificielles relatives à la vision par ordinateur peuvent permettre de reconnaître des éléments de l’interface graphique par leurs caractéristiques.

Cela pourrait permettre par exemple d’automatiser une partie des tests d’affichage : soit en utilisant un modèle et en analysant de qui ne correspond pas au modèle d’une version à l’autre, soit en réparant des scripts d’automatisation de test lorsqu’un script est cassé ou un objet n’est plus reconnu.

Génération autonome de jeux de données de test

Données d’entrées : c’est une problématique majeure du test. L’Espace très grand : la création et sélection de tests pertinents par le testeur et donc complexe et longue.

C’est un cas d’application du GAN :

  • Génération des données d’entrées (jeux de données de test)
  • Classification des données d’entrées pertinentes

Le testeur doit à la fois générer des configurations de tests dans un espace très grand, et qui soient par ailleurs pertinentes. C’est exactement ce que fait un GAN: il génère des données déjà classifiées.

Optimisation autonome des cas de test de non régression (TNR)

L’objectif de l’IA est alors d’analyse les TNR existant et de trouver la meilleure combinatoire et le meilleur ordre d’enchaînement des tests

  • Test diminuant le tps d’exécution
  • Reduction du nombre de cas de test pour atteindre un objectif de test
  • Test permettant une couverture complète
  • Test lié à des changements de code récents
  • Tests dépendant d’exigences avec un risque élevé.

Optimisation autonome des cas de test de non régression (TNR)

4. Exemples d’outils existants

Voici des quelques exemples d’outils de test qui font usage déjà de l’intelligence artificielle :

Analyse statique:  INFER

Infer est un outil d’analyse statique de code (java, objective C), notamment utilisé par Facebook pour ses développements d’application mobile.  Cet outil est issu d’un rachat d’une entreprise spécialisée dans le domaine par Facebook (Monoidics, en 2009, basée notamment sur la logique de séparation). Il permet notamment une détection automatique d’anomalies dans le code dans une approche Devops.

Génération des données de test : Intellistest, EvoSuite, Austin

EvoSuite : IA- Test unitaire- env java

Pour trouver des défauts dans le logiciel, il faut des cas de test qui exécutent systématiquement le logiciel et des oracles qui évaluent l’exactitude du comportement observé lors de l’exécution de ces cas de test.
EvoSuite est un outil qui génère automatiquement des cas de test avec des assertions pour les classes écrites dans le code Java. Pour ce faire, EvoSuite applique une nouvelle approche hybride qui génère et optimise les ensembles de test complets pour satisfaire un critère de couverture. Pour les suites de test produites, EvoSuite suggère des oracles possibles en ajoutant des ensembles d’assertions peu nombreux et efficaces qui résument de façon concise le comportement actuel; Ces assertions permettent au développeur de détecter les écarts par rapport au comportement attendu et de capturer le comportement actuel afin de se protéger contre les défauts futurs qui rompent ce comportement.

Caractéristiques principales de EvoSuite (génération de jeux de données, test unitaires)

Algorithme évolutif : population initiale générées au hasard. Evaluation des performances de chaque individu. Dans le cas d’EvoSuite, couverture du code. Mutations et reproduction par mélange des caractéristiques de chaque individu. Réitération du processus.

  • Génération de tests JUnit 4 pour les classes sélectionnées
  • Optimisation de différents critères de couverture, comme les lignes, les branches, les sorties et les tests de mutation
  • Les tests sont minimisés : seuls ceux qui contribuent à la couverture sont conservés
  • La génération de JUnit permet pour capturer le comportement actuel des classes testées
  • Les tests s’exécutent dans un bac à sable pour éviter les opérations potentiellement dangereuses
  • Système de fichiers virtuel
  • Réseau virtuel

IntelliTest for .NET – Testez plus avec moins d’effort
IA- Test unitaires- Visual studio

L’écriture d’une combinaison de tests unitaires qui exercent et valident de manière exhaustive la logique du code à tester n’est pas facile. On peut même considérer qu’il est trop coûteux de le faire de manière exhaustive. Heureusement, la fonctionnalité IntelliTest d’expédition dans Visual Studio 2015 Enterprise Edition répond aux deux préoccupations : obtenir une couverture de code élevée pour un coût raisonnable.

Lorsque vous exécutez IntelliTest sur votre code .NET, cela génère des cas de test en analysant dynamiquement le code sous test tel qu’il s’exécute sur le CLR. Pour chaque déclaration dans le code, elle intègre une entrée qui atteindra cette déclaration, en effectuant une analyse de cas pour chaque branche conditionnelle, si des énoncés, des assertions et toutes les opérations qui peuvent lancer des exceptions, comme le test boîte blanche. L’objectif est de générer une suite de test couvrant toutes les branches de votre code, et chaque fois qu’il produit une entrée qui augmente la couverture, il émet cette valeur concrète en tant que cas de test en utilisant C # et l’un des MSTest, xUnit.net ou NUnit comme Le cadre de test. Le résultat est une série de tests avec une couverture élevée que vous n’avez pas à écrire à partir de rien.

IA- Test unitaires- Visual studio

Remarque: IntelliTest s’inspire du projet Pex et a eu plusieurs incarnations, en commençant comme extensions dans Visual Studio. On l’appelait également «Tests de l’unité intelligente» avant Visual Studio 2015 RC. Cependant, grâce à tous ces changements, les API et les espaces de noms subjacents ont été conservés, de sorte que l’expertise et les extensions, que vous avez peut-être construites autour de ces incarnations antérieures, peuvent être exploitées; En effet, toutes les extensions Pex que vous auriez pu écrire dans le passé vont probablement fonctionner avec IntelliTest.

Faciliter l’écriture et le maintien des tests unitaires

Voici les problèmes que IntelliTest essaie de résoudre.

  • Problème 1: L’écriture d’une suite de test exhaustive pour le code complexe peut prendre autant d’effort que d’écrire le code sous test lui-même. Par conséquent, il est tentant d’éviter d’écrire les tests, ce qui entraîne des trous de test et une dépendance aux tests d’intégration qui se fait après l’activité de développement. Les bugs sont détectés plus tard dans le cycle de développement (le cas échéant) et sont supprimés à partir de la ligne de code provoquant le bogue, ce qui signifie que le coût de la correction de ces bugs est considérablement plus élevé que lorsqu’ils ont été capturés plus tôt dans le cycle.
  • Problème 2: Il est difficile de maintenir des tests lorsque le code testé évolue constamment. Cela conduit à une réticence à créer des tests en premier lieu, ce qui entraîne des trous de test et des problèmes d’intégration (problème 1).

IntelliTest résout ces problèmes. Il aborde la complexité du code en adoptant une approche de test de type blanc, c’est-à-dire qu’elle analyse votre code lorsqu’il exécute et synthétise des entrées de test précises pour obtenir une couverture élevée. Il réduit l’effort dans les tests d’écriture en générant automatiquement des cas de tests en utilisant ces entrées et en capturant toutes sorties observées à partir du code testé. Il élimine la problématique de maintenance des tests en évoluant automatiquement au fur et à mesure que le code a testé évolue (lorsque vous ré-exécutez IntelliTest). Il permet de détecter rapidement les bugs en s’intégrant dans Visual Studio et en étant juste à un clic droit afin que vous puissiez l’utiliser dans votre flux de travail de développement.

Ces problèmes existent autant dans le nouveau code que dans de l’ancien code récupéré. Une combinaison de tests d’intégration, et peut-être quelques tests unitaires écrits à la main, sont inadéquats dans ces contextes, et c’est là que IntelliTest peut améliorer votre pratique des tests.

Évolution du code existant / hérité : utilisez IntelliTest pour générer un réseau de sécurité des tests avant de commencer le refactoring.

  • Exploration du code existant / nouveau : utilisez IntelliTest pour comprendre le comportement d’entrée / sortie du code contre diverses valeurs de données.

En savoir plus

Intelistest peut avoir des domaines d’application plus vaste

Functionize (test unitaire, test affichage, génération de jeux de données de test)

Outil dans le cloud, basé sur une extension Chrome pour l’enregistrement des tests.

Génération automatique des tests à partir des utilisateurs réels des websites (module javascript)

Utilisation d’IA en Computer Vision pour détecter les anomalies d’affichages et réparer l’identification des éléments de l’affichage.

Faciliter l'écriture et le maintien des tests unitaires

Stress test, Fuzz test

Génération aléatoire d’actions, de données d’entrée…
Objectif : mettre le système dans un état bloqué, voir générer un crash

Cela demande peu d’information de la part du testeur, les résultats sont faciles à interpréter… mais plus long à traiter par la suite.

  • Google Monkey

Intégré aux outils de DEV Android, gratuity – fuzz testing tool – random inputs

  • Sapienz

open source, « search-based » testing tool :  basé sur les techniques de recherche méta-heuristique (algo génétique, recherche type tabu, optimisation combinatoire.). Permet d’optimiser des données ou cas de test

Utilisé sur les 1,000 principales applications mobile Android,  Sapienz a trouvé 558 bugs non identifié auparavant

  • Dynodroid : – open source, – permet une approche combinée humain / outils

APPDIF

Appdiff se concentre sur les applications Android.
C’est un outil Saas, qui permet d’uploader l’apk d’une application Android pour la faire analyser automatiquement.
Le test se fait aujourd’hui principalement sur des émulateurs. Contrairement à du monkey testing, l’IA permet de parcourir les branches les plus pertinentes de l’application, en classifiant les actions réalisables à chaque écran d’affichage.
Exemple : l’action login est identifiée comme une action importante par l’IA lors de son apprentissage.
L’algorithme générera donc des cas de tests, donc la première étape est “login” beaucoup plus nombreux en proportion, contrairement à un monkey tester qui affecterait une probabilité similaire aux différentes actions de la page d’accueil (help, rate app, feedback, etc.)

5. Synthèse

Les outils qui utilisent l’IA dans le test se concentrent aujourd’hui sur les tests unitaires, intégration, affichage et générations de données de test et se positionnent comme outils d’aide aux testeurs : réparation automatique des scripts, analyse de risque, etc. Les nouvelles IA (notamment les GAN) ne sont pas encore disponibles dans des outils finalisés actuellement, mais on peut prévoir que demain elles permettront de prendre en charge les tests de plus haut niveau (intégration, système).

Formez-vous sur l’Intelligence Artificielle appliquée au Test Logiciel grâce à notre partenaire UpSkill4IT.

Voir aussi nos différents articles sur les différents sujets au test + notre livre blanc :

À bientôt