État de l'Intelligence Artificielle appliquée à l'Ingénierie de la Qualité 2021-2022
Section 3.1 : Mesures

Chapitre 4 par Capgemini

L'analyse du code étendue aux tests basés sur l'impact

Métier ●○○○○
Technique ●●●●○

Download the "Section 3.1: Inform & Measure" as a PDF

Use the site navigation to visit other sections and download further PDF content

By submitting this form, I understand that my data will be processed by Sogeti as described in the Privacy Policy.*

L'intelligence artificielle (IA) aide les ingénieurs à déterminer quelles parties du code ne sont pas encore testées et fournit des informations à l'équipe de test pour qu'elle construise des cas de test supplémentaires afin d'atteindre une couverture de code de 100 %. Elle permet de s'assurer que les applications ne sont pas publiées avec du code non testé et identifie automatiquement les blocs fonctionnels ou les cas de test affectés en fonction des données de couverture. Les algorithmes de distance de Hamming et de regroupement K-means sont respectivement utilisés pour minimiser la redondance des cas de test, augmentant ainsi l'efficacité des cas de test et optimisant les suites de test. Au cours de ce processus, les cas de test impactés basés sur les changements de code peuvent être identifiés.

Dans le dernier chapitre, nous avons vu comment l'application de l'analytique et de l'apprentissage automatique sur le code et les artefacts liés au code aide les organisations à obtenir des versions plus rapides et une meilleure qualité du code. L'analyse du code nous donne la possibilité de faire correspondre les cas de test au code et d'optimiser les suites de test en fonction de leur couverture de code. Contrairement à la couverture fonctionnelle, les mesures de la couverture du code nous aideront à identifier les lignes de code non testées. Il s'agit d'une méthode efficace pour s'assurer que le code non testé n'est pas déployé en production. Elle facilite le développement de nouveaux cas de test afin d'étendre la couverture fonctionnelle. Cette stratégie nous permettra de modifier la suite de tests de manière à ce que chaque ligne de code soit testée, augmentant ainsi la couverture avant la mise en production de l'application. Comparées aux applications à faible couverture de code, les applications à forte couverture de code ont moins de chances d'abriter des défauts logiciels non détectés.

L'objectif de ce chapitre basé sur l'expérience est d'illustrer plus en détail comment l'intelligence artificielle (IA)/l'apprentissage machine (ML) peuvent être utilisés pour améliorer l'analyse du code.

Aperçu de la solution

La solution se compose de quatre phases qui doivent être réalisées dans l'ordre.

  1. Établir la correspondance entre le scénario de test et le code
  2. Identifier les cas de test en double à l'aide de l'algorithme de distance de Hamming
  3. Identifier les cas de test impactés en fonction des changements de code
  4. Optimisation des suites de tests à l'aide du clustering k-means

Établir la correspondance entre le scénario de test et le code 

La figure ci-dessous illustre comment un cas de test fonctionnel est mis en correspondance avec le code. En général, la traçabilité des exigences aux cas de test et aux défauts est disponible. Dans l'approche proposée, nous mappons le code aux cas de test fonctionnels, ce qui nous offre une traçabilité à 360 degrés. Les informations sur la couverture du code sont transmises au système AI/ML pour trouver les redondances et optimiser davantage les cas de test.

Figure: 36O degree traceability


Figure: Traçabilité à 360 degrés

La figure ci-dessous illustre le processus de traduction du code en cas de test fonctionnel et de génération du rapport de couverture.

La solution d'analyse du code parcourt chaque ligne du code en passant par le paquetage -> la classe -> la méthode et attribue un numéro unique et une distance de Hamming (expliquée dans la section 2) à chacun des cas de test (sur la base de leur combinaison unique paquetage/classe/méthode). Cela permet d'identifier les lignes de code uniques qui ont été touchées (ou laissées intactes) pendant l'exécution d'un scénario de test.

La solution d'analyse de code génère un rapport dynamique de couverture de code qui est utilisé pour associer chaque identifiant de scénario de test aux lignes de code couvertes pendant l'exécution. Ces informations sont ensuite utilisées pour calculer les lignes de code uniques et l'efficacité globale du scénario de test en termes de couverture de code.

Figure: Workflow of Functional Test case to Code Coverage


Figure:  Flux du scénario de test fonctionnel à la couverture de code

La suite de tests est exécutée conformément à la stratégie/au plan de test pour s'assurer que toutes les exigences fonctionnelles sont satisfaites. En utilisant la solution d'analyse de code, la couverture de code globale pour la suite de tests est mesurée.  Si la couverture du code n'atteint pas les objectifs définis, des cas de test supplémentaires sont créés pour augmenter la couverture du code. 

 L'efficacité des cas de test est déterminée par les données de couverture du code. Les lignes de code uniques sont identifiées par le code couvert par chaque scénario de test en supprimant les lignes superposées / dupliquées couvertes par d'autres scénarios de test. Les mesures de l'efficacité des scénarios de test peuvent être utilisées pour donner la priorité aux scénarios de test. Les cas de test dont l'efficacité est faible ou nulle (couverture en double) peuvent être éliminés pour optimiser la suite de tests.

Mesures de l'efficacité des scénarios de test
Total LoC (lignes de code) 1202  
Couverture du Code 317 26%
# TCs 8  
Couverture ID TC ID TC Name Line Covered Lignes Uniques (TC) Lignes Uniques (Test Set) Efficacité des scénarios de test
1 TC_1 TC1_Admin_Login 94 94 94 100%
2 TC_2 TC2_Add_New_Bank 0 0 0 0%
3 TC_3 TC3_Add_New_Employee 169 150 95 56%
4 TC_4 TC4_Emp_Change_Password 41 41 39 95%
5 TC_5 TC5_Admin_Change_Password 69 65 56 81%
6 TC_6 TC6_Find_Branch 32 32 28 88%
7 TC_7 TC7_Misc_Menu_Validation 32 32 0 0%
8 TC_8 TC8_Overall 299 276 5 2%

Identification des cas de test dupliqués à l'aide de l'algorithme de distance de Hamming 1

Les données de correspondance entre les cas de test fonctionnels et la couverture du code peuvent être transmises à l'algorithme de distance de Hamming pour identifier les cas de test en double. La distance de Hamming1 entre deux chaînes binaires est définie comme le nombre de positions binaires qui diffèrent entre elles.

 Généralement, la distance de Hamming est appliquée aux chaînes binaires ; cependant, dans ce cas, nous essayons de trouver les instances de test en double, comme le conseillent Pang et al2. dans leur publication.  Un cas de test tc1 est supposé être un doublon du cas de test tc2 si les deux cas de test se touchent et couvrent les mêmes lignes de code à tester. Supposons que le code testé contient dix lignes. Comme illustré dans le tableau 2, chaque ligne est représentée par une case carrée.

Nous attribuons une valeur de 1 à chaque ligne qu'un scénario de test touche. Si le scénario de test ne couvre pas une ligne, la position du scénario de test est mise à 0. Un scénario est illustré dans le tableau 1.

Les chiffres 1 à 10 indiquent les lignes de code et tc1 à tc4 indiquent les quatre cas de test. D'après le tableau 2, nous voyons qu'en exécutant le cas de test tc1, les lignes 1,3,5,7 sont couvertes. De même, nous pouvons comprendre les résultats pour les autres cas de test. En assemblant ces 1 et 0 en une chaîne binaire, nous pouvons calculer la distance de Hamming. Comme le montrent leurs chaînes binaires, tc1, tc2 et tc3 couvrent tous différentes lignes de code, mais tc4 couvre les mêmes lignes de code que tc1, ce qui indique qu'il s'agit de deux cas de test identiques. La distance de Hamming entre tc1 et tc2 est de 1111111000, soit un total de 7, alors que la distance de Hamming entre tc1 et tc4 est de 0. Par conséquent, tc1 et tc4 seront considérés comme des cas de test dupliqués. Cette méthode permet d'identifier tous les cas de test dupliqués dans la suite de test et d'éviter tout effort d'exécution inutile.

  1 2 3 4 5 6 7 8 9 10
tc1 1 0 1 0 1 0 1 0 0 0
tc2 0 1 0 1 0 1 0 0 0 0
tc3 0 0 0 0 0 0 0 1 1 1
tc4 1 0 1 0 1 0 1 0 0 0

Table 2 - Illustration de l'utilisation de la distance de Hamming pour identifier les cas de test en double.

Identifier les cas de test impactés en fonction des changements de code.

Code Analytics met en correspondance les cas de test avec le code et optimise les suites de test en fonction de leur couverture de code. Il identifiera les cas de test impactés en se basant sur le mappage. Les tests d'impact basés sur les changements peuvent être effectués sur la base des données de couverture du code. Des détails sur le mappage des cas de test aux lignes de code / méthodes sont disponibles. Les métriques de couverture pour la version actuelle sont basées et comparées à celles de la nouvelle version afin d'identifier les cas de test impactés. Seuls les cas de test impactés peuvent être exécutés pour valider le code récemment modifié. Les tests d'impact basés sur les changements permettent d'identifier le sous-ensemble de suites de tests nécessaires pour valider les récents changements de code. Cela permet d'optimiser l'effort d'exécution des cas de test. 

Optimisation des suites de tests à l'aide du clustering k-means

Le clustering K-means est l'algorithme non supervisé le plus populaire. Après avoir choisi un nombre de clusters (K), nous sélectionnons aléatoirement K points comme centroïdes de chacun de ces clusters. Les points restants sont affectés au cluster le plus proche du centroïde. Une fois que tous les points ont été attribués au cluster, le centroïde est recalculé, et la procédure est répétée jusqu'à ce que les centroïdes des clusters nouvellement formés restent constants. Comme l'indiquent Pang et al. dans leur article, nous proposons d'utiliser le clustering k-means pour distinguer les cas de test efficaces et inefficaces. Les cas de test efficaces sont ceux qui ont été impactés par les changements de la nouvelle version et qui, une fois exécutés, révèlent les failles de la nouvelle version. L'objectif ici est de n'exécuter que les scénarios de test les plus efficaces. Considérons le tableau 3 suivant.

  1 2 3 4 5 6 7 8 9 10 P/F
tc1 1 0 1 0 1 0 1 0 0 0 P
tc2 0 1 0 1 0 1 0 0 0 0 F
tc3 0 0 0 0 0 0 0 1 1 1 P
tc4 1 0 1 0 1 0 1 0 0 0 P

Table 3 - Cas de test exécutés pour 10 lignes de code avec la ligne 9 modifiée 

Le tableau 3 est identique au tableau 2, à l'exception de l'ajout d'une colonne indiquant si le cas de test a réussi ou échoué. tc2 et tc3 seront automatiquement inclus dans la collection de cas de test effectifs, puisque tc2 a échoué et que tc3 couvre la ligne où la modification est effectuée. Cela crée le premier ensemble efficace de cas de test à partir duquel le centroïde peut être déterminé, tandis que le centroïde de l'ensemble non efficace est fixé à 0. Nous choisissons les deux cas de test restants et calculons la distance de Hamming entre eux et chacun des cas de test dans les ensembles efficaces et non efficaces. Le cas de test est assigné au cluster qui a la distance la plus courte. La procédure peut être répétée jusqu'à ce que le centroïde ne change pas. En conséquence, nous aurons deux clusters de cas de test qui sont efficaces et inefficaces. Cette technique aide à l'optimisation et à la priorisation des suites de tests en classant les cas de tests dans des clusters efficaces et inefficaces. 

Benefits

The following are some of the perceived benefits of code coverage-based test coverage and impact analysis.

  • Faire du Shift Left pour une détection précoce des défauts et une meilleure qualité du code  
    • Analyse dynamique du code  
    • Couverture des tests fonctionnels en termes de code
  • Augmentation de la couverture de test pour éviter les fuites de défauts 
  • Exécution optimisée des tests de régression pour la réduction du temps de cycle 
  • Traçabilité à 360° pour une meilleure gestion des changements  
  • Concentration sur les fonctionnalités critiques/impactées pour réduire les risques 
  • Déduplication des cas de test en fonction de la couverture du code

About the authors

Arunagiri Sakkaraipalam

Arunagiri Sakkaraipalam

Arunagiri Sakkaraipalam is having overall 20+ years of experience in Product Management, Project Management, People Management, Process, Quality Engineering and Leadership across SDLC life cycle in various Technologies and Domain. Having end to end responsibility for conceptualizing, planning and driving product releases from initiation to closure. Expert in product management with a proven track record of managing multiple releases of high-profile products in the organization. Provided leadership, insight, and vision to translate business requirements into effective business solutions. As part of Innovation Champion role, consolidated all the practice innovations/ideas in the innovation platform. Played an effective role to conduct review of the technology landscape focusing on new products, tools, trends, papers and analyst’s reports.

Venkatesh Babu

Venkatesh Babu

Venkatesh Babu is a technology leader, with 22+ years of experience in JEE, .NET, Mobile, Cloud, Automation, SMAC, IoT, RPA, AI/ML, Digital technologies - architected, designed and delivered enterprise solutions for global clients. He is working in the Research & Innovation Group and passionate about Emerging Technologies, Focus areas include Cloud, Artificial Intelligence & Machine Learning IoT, Gamification, Gesture Recognition, Augmented Reality, Blockchain, Big Data, Microservices, Design thinking, Solution Architecture & Consulting, Application Integration, Product Engineering, Wearables, Crowdsourcing and Technology evangelization.

About Capgemini

Capgemini is a global leader in partnering with companies to transform and manage their business by harnessing the power of technology. The Group is guided everyday by its purpose of unleashing human energy through technology for an inclusive and sustainable future. It is a responsible and diverse organisation of 270,000 team members in nearly 50 countries. With its strong 50 year heritage and deep industry expertise, Capgemini is trusted by its clients to address the entire breadth of their business needs, from strategy and design to operations, fueled by the fast evolving and innovative world of cloud, data, AI, connectivity, software, digital engineering and platforms. The Group reported in 2020 global revenues of €16 billion.

Get the Future You Want  I  www.capgemini.com

 

 

 

Capgemini logo