DEMO                  Application SHARPDEVELOP                             Rapport d’audit                                ...
Audit de code de l’application SharpDevelop                                                          01/01/2011         1 ...
Audit de code de l’application SharpDevelop                                                                               ...
Audit de code de l’application SharpDevelop                                                                  01/01/2011   ...
Audit de code de l’application SharpDevelop                                                          01/01/2011         2....
Audit de code de l’application SharpDevelop                                                        01/01/2011             ...
Audit de code de l’application SharpDevelop                                                         01/01/2011         3 O...
Audit de code de l’application SharpDevelop                                                                  01/01/2011   ...
Audit de code de l’application SharpDevelop                                                                  01/01/2011   ...
Audit de code de l’application SharpDevelop                                                     01/01/2011         4 Synth...
Audit de code de l’application SharpDevelop                                                         01/01/2011         4.1...
Audit de code de l’application SharpDevelop                                                       01/01/2011         4.1.3...
Audit de code de l’application SharpDevelop                                                      01/01/2011         4.2 Be...
Audit de code de l’application SharpDevelop                                                       01/01/2011              ...
Audit de code de l’application SharpDevelop                                                    01/01/2011         4.2.2 Ca...
Audit de code de l’application SharpDevelop                                                           01/01/2011         U...
Audit de code de l’application SharpDevelop                                                         01/01/2011         4.3...
Audit de code de l’application SharpDevelop                                                       01/01/2011         4.3.2...
Audit de code de l’application SharpDevelop                                                  01/01/2011                   ...
Audit de code de l’application SharpDevelop                                                 01/01/2011         5 Résultats...
Audit de code de l’application SharpDevelop                                                       01/01/2011         5.2 I...
Audit de code de l’application SharpDevelop                                                    01/01/2011                 ...
Audit de code de l’application SharpDevelop                                                             01/01/2011        ...
Audit de code de l’application SharpDevelop                                                            01/01/2011         ...
Audit de code de l’application SharpDevelop                                                             01/01/2011        ...
Audit de code de l’application SharpDevelop                                                               01/01/2011      ...
Audit de code de l’application SharpDevelop                                                      01/01/2011         5.3.1 ...
Audit de code de l’application SharpDevelop                                                                    01/01/2011 ...
Audit de code de l’application SharpDevelop                                                               01/01/2011      ...
Audit de code de l’application SharpDevelop                                               01/01/2011      Méthode         ...
Audit de code de l’application SharpDevelop                                                     01/01/2011      ICSharpCod...
Audit de code de l’application SharpDevelop                                                     01/01/2011         Le grap...
Audit de code de l’application SharpDevelop                                                 01/01/2011         L’histogram...
Audit de code de l’application SharpDevelop                                          01/01/2011         Méthode           ...
Audit de code de l’application SharpDevelop                                                       01/01/2011              ...
Audit de code de l’application SharpDevelop                                                                     01/01/2011...
Audit de code de l’application SharpDevelop                                                         01/01/2011            ...
Audit de code de l’application SharpDevelop                                                       01/01/2011              ...
Audit de code de l’application SharpDevelop                                                        01/01/2011             ...
Audit de code de l’application SharpDevelop                                                   01/01/2011                  ...
Audit de code de l’application SharpDevelop                                         01/01/2011     Méthode                ...
Audit de code de l’application SharpDevelop                                                            01/01/2011     ICSh...
Audit de code de l’application SharpDevelop                                                       01/01/2011              ...
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Analyse de code: accélérez la validation de vos applications C#
Upcoming SlideShare
Loading in...5
×

Analyse de code: accélérez la validation de vos applications C#

1,780

Published on

Accélérez la mise en production de vos logiciels C# en réalisant des tests plus efficaces, basés sur les risques, et une validation plus rapide.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,780
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
39
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Analyse de code: accélérez la validation de vos applications C#"

  1. 1. DEMO Application SHARPDEVELOP Rapport d’audit 01/01/2011 Ce document est un exemple de rapport d’audit produit automatiquement à partir des résultats de l’analyse de l’application sur la plateforme Kalistick. Il n’intègre pas de commentaires spécifiques sur les résultats obtenus. Son objectif est de servir de modèle pour constituer des rapports personnalisés,il illustre la capacité de la plateforme à restituer une vision claire et compréhensible de la qualité d’une application. Ce document est confidentiel, il est la propriété de Kalistick, Il ne doit pas être diffusé ni modifié sans autorisation. Kalistick 13 av Albert Einstein F-69100 Villeurbanne +33(0) 486 68 89 42 contact@kalistick.com www.kalistick.com
  2. 2. Audit de code de l’application SharpDevelop 01/01/2011 1 Executive Summary Le Cockpit Qualité utilise des techniques d’analyse statique : il n’exécute pas l’application mais analyse les éléments qui la constituent (code, résultats des tests, architecture, …). Les résultats sont corrélés, agrégés et comparés avec les enjeux du projet pour identifier les risques liés à la qualité. Ce rapport présente les résultats obtenus. Synthèse - Ecart par rapport à l’objectif Ce graphique compare la situation actuelle du projet par rapport aux objectifs fixés sur chacun des axes de qualité. L’objectif, configuré à l’initialisation de l’audit, représente l’importance de chaque axe de qualité. Il est destiné à déterminer les règles à respecter dans les développements et la tolérance acceptée. Taux de non-conformité global Cette jauge indique le niveau de qualité global de l’application par rapport à son objectif qualité. Elle présente le pourcentage de l’application (code) considéré comme non-conforme. Selon la configuration réalisée, un taux supérieur à 15% indique la nécessité d’approfondir l’analyse des résultats. Origine des violations Ce graphique identifie l’origine technique des non-conformités détectées, et les principaux domaines d’amélioration. Selon les éléments soumis lors de l’analyse, certains domaines peuvent ne pas avoir été évalués.Confidentiel - Ce document est la propriété de Kalistick 2/61
  3. 3. Audit de code de l’application SharpDevelop 01/01/2011 Organisation du rapport Ce rapport présente les concepts du Cockpit Qualité, l’objectif fixé et les exigences techniques associées, avant de poursuivre par les résultats synthétiques puis détaillés par domaine technique. 1 Executive Summary ...................................................................................................................................... 2 2 Introduction .................................................................................................................................................. 4 2.1 Le Cockpit Qualité ................................................................................................................................. 4 2.2 La grille d’analyse ................................................................................................................................. 4 3 Objectif qualité ............................................................................................................................................. 7 3.1 Le profil qualité..................................................................................................................................... 7 3.2 Les exigences techniques ..................................................................................................................... 7 4 Synthèse des résultats ................................................................................................................................ 10 4.1 Situation du projet.............................................................................................................................. 10 4.2 Benchmarking ..................................................................................................................................... 13 4.3 Modélisation de l’application ............................................................................................................. 17 5 Résultats détaillés....................................................................................................................................... 20 5.1 Détail par axes de qualité ................................................................................................................... 20 5.2 Implémentation .................................................................................................................................. 21 5.3 Structure ............................................................................................................................................. 26 5.4 Test ..................................................................................................................................................... 35 5.5 Architecture ........................................................................................................................................ 42 5.6 Duplication ......................................................................................................................................... 43 5.7 Documentation................................................................................................................................... 44 6 Plan d’action ............................................................................................................................................... 47 7 Glossaire ..................................................................................................................................................... 49 8 Annexes ...................................................................................................................................................... 51 8.1 La complexité cyclomatique ............................................................................................................... 51 8.2 Le couplage ......................................................................................................................................... 53 8.3 Le TRI et TEI ........................................................................................................................................ 54 8.4 Exigences techniques ......................................................................................................................... 56Confidentiel - Ce document est la propriété de Kalistick 3/61
  4. 4. Audit de code de l’application SharpDevelop 01/01/2011 2 Introduction 2.1 Le Cockpit Qualité Cet audit est basé sur un processus d’analyse de code industrialisé. Cette industrialisation permet de garantir des résultats fiables et facilement comparables avec les résultats d’autres audits. Le processus d’analyse repose sur la plateforme « Cockpit Qualité », disponible en mode SaaS1 (https://cockpit.kalistick.com). Cette plateforme présente l’avantage d’offrir une base de connaissances unique du fait qu’elle centralise les résultats statistiques issus de l’analyse de millions de lignes de code, base enrichie en continu avec les nouvelles analyses. Elle permet notamment de réaliser des analyses comparatives avec d’autres projets similaires. 2.2 La grille d’analyse L’analyse porte sur le code Java (JEE) ou C# (.Net) de l’application (code source et code binaire). C’est une analyse statique (sans exécution), complétée par la corrélation avec des informations extraites des outils de développement déjà mis en œuvre pour le projet : gestionnaires de versions, frameworks de tests unitaires, outils de couverture de code. Les résultats sont proposés dans une grille d’analyse qui s’articule autour de 3 dimensions principales :  Les axes de qualité, qui déterminent la nature de l’impact des non-conformités détectées, donc la conséquence sur le niveau de qualité de l’application  Les domaines de qualité, qui précisent l’origine technique des non-conformités  Les niveaux de sévérité, qui positionnent les non-conformités sur une échelle de gravité afin de caractériser leur priorité 1 Software as a Service : application accessible à distance via Internet (à l’aide d’un navigateur standard)Confidentiel - Ce document est la propriété de Kalistick 4/61
  5. 5. Audit de code de l’application SharpDevelop 01/01/2011 2.2.1 Les axes de qualité Les axes de qualité standardisent un ensemble de qualités auxquelles doit prétendre l’application selon la norme ISO 912623 :  Maintenabilité. Capacité d’un logiciel à pouvoir être dépanné facilement, en fonction de l’effort exigé pour localiser, identifier et corriger les erreurs.  Fiabilité. Aptitude d’un logiciel à fonctionner correctement en rendant le service attendu dans les conditions normales de fonctionnement.  Evolutivité. Aptitude d’un logiciel à pouvoir évoluer, en fonction de l’effort requis pour ajouter, supprimer, modifier des fonctions d’un logiciel déjà opérationnel.  Sécurité. Aptitude du logiciel à fonctionner en respectant les contraintes d’intégrité, de confidentialité et de traçabilité requises.  Transférabilité. Capacité à faire réaliser la maintenance et les évolutions d’un logiciel par une nouvelle équipe distincte de celle ayant développé le logiciel initial.  Efficacité. Relation entre le niveau de performance du logiciel et la quantité de ressources nécessaires pour le faire fonctionner dans des conditions nominales. 2.2.2 Les domaines de qualité Les domaines de qualité déterminent la nature des problèmes selon leur origine technique. Ils sont au nombre de six :  Implémentation. Les problèmes inhérents au codage : mauvaise utilisation du langage, bugs potentiels, code difficilement compréhensible, … Ces problèmes peuvent nuire à un ou plusieurs des six axes de qualités.  Structure. Les problèmes liés à l’organisation du code : méthodes trop longues, trop complexes, avec trop de dépendances, … Ces problèmes impactent généralement la maintenabilité et l’évolutivité de l’application. 2 ISO/IEC 9126-1:2001 Software engineering — Product quality — Part 1: Quality model : http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=22749 3 L’analyse porte sur un sous-ensemble de la norme ISO 9126 afin de se focaliser sur les dimensions contrôlables de manière automatisée.Confidentiel - Ce document est la propriété de Kalistick 5/61
  6. 6. Audit de code de l’application SharpDevelop 01/01/2011  Test. Qualifie la manière dont est testée l’application, à partir des résultats des tests unitaires (taux d’échec, durée d’exécution, …), mais également en fonction de la nature du code couvert par l’exécution des tests. L’objectif consiste à s’assurer que les tests couvrent les parties critiques de l’application.  Architecture. Problèmes liés à l’architecture logicielle de l’application. Il est possible de définir un modèle d’architecture pour modulariser l’application en couches ou composants puis de définir des contraintes d’appel entre ces éléments. L’analyse identifie au sein du code tous les appels ne respectant pas ces contraintes, pour détecter les risques au niveau de la maintenabilité, de l’évolutivité et de la sécurité.  Documentation. Problèmes liés au manque de documentation dans le code. Ce domaine impacte essentiellement la transférabilité du code.  Duplication. Identification de tous les copier-collers importants au sein de l’application. Ceux-ci présentent des risques sur les axes fiabilité, maintenabilité, transférabilité et évolutivité. 2.2.3 Les niveaux de sévérité Les niveaux de sévérité sont destinés à caractériser la priorité de correction d’une non-conformité. Cette priorité dépend de la gravité de l’impact d’une non-conformité, mais également de l’effort à fournir pour la correction : certains problèmes moyennement critiques seront marqués avec un niveau de sévérité important en raison de la trivialité de leur résolution. Pour simplifier leur interprétation, les niveaux de sévérité sont exprimés à l’aide d’une échelle à quatre niveaux. Le premier correspond à une erreur, les trois suivants à des avertissements, du plus grave au moins grave :  Interdit  Fortement déconseillé  Déconseillé  A éviter Par rapport au niveau Interdit, les autres niveaux de sévérité sont gérés à l’aide d’un seuil de tolérance, qui augmente inversement avec la gravité.Confidentiel - Ce document est la propriété de Kalistick 6/61
  7. 7. Audit de code de l’application SharpDevelop 01/01/2011 3 Objectif qualité Une des particularités du « Cockpit Qualité » consiste à réaliser une analyse en fonction des besoins réels du projet en terme de qualité, afin d’éviter des efforts inutiles de « sur-qualité » et de garantir une meilleure pertinence sur les risques qualité. Ces besoins sont formalisés via la définition d’un « profil qualité » de l’application, qui caractérise les niveaux de qualité attendus sur chacun des six axes de qualités. Ce profil qualité est ensuite traduit en « exigences techniques », qui sont des règles techniques que devront respecter les développeurs. 3.1 Le profil qualité Pour cet audit, le profil qualité établi est le suivant : Voir sur le Cockpit Qualité 3.2 Les exigences techniques En se basant sur le profil qualité précédent, les exigences techniques ont été sélectionnées à partir de la base de connaissances du « Cockpit Qualité ». Ces exigences techniques couvrent les six domaines de qualités (implémentation, structure, test, architecture, documentation, duplication) et sont configurées en fonction du profil qualité (seuils, niveaux de sévérité, …). L’objectif est d’assurer un calibrage des exigences qui assure le meilleur retour sur investissement.Confidentiel - Ce document est la propriété de Kalistick 7/61
  8. 8. Audit de code de l’application SharpDevelop 01/01/2011 Voici le détail de ces exigences techniques : Domaine Règle Explication, objectif et seuils éventuels - Selon votre profil, entre 150 et 200 règles ont été sélectionnées. Elles sont Implémentation présentées exhaustivement en annexe du rapport (8.4.1 Règles d’implémentation). Objectif : éviter les mauvaises pratiques et appliquer les bonnes pratiques liées aux technologies utilisées. Taille des méthodes Nombre de ligne dinstructions. Cette mesure est différente du nombre de ligne de code : elle ninclut pas les lignes de commentaire ni les lignes blanches mais seulement les lignes comportant au moins une instruction. Objectif : éviter les blocs de traitements difficilement compréhensibles. Le seuil retenu pour le projet est :  nombre de lignes : 100 Complexité des Complexité cyclomatique dune méthode. Elle mesure la complexité méthodes algorithmique dune méthode en comptant le nombre de chemins indépendants couvrant tous les cas possibles. Plus ce nombre est élevé, plus le code est difficile à maintenir et à tester. Structure Objectif : éviter les blocs de traitements difficilement compréhensibles, non testables et qui tendent à avoir un taux de dysfonctionnement important. Le seuil retenu pour le projet est :  complexité cyclomatique : 20 Complexité et couplage Identifie les méthodes difficiles à comprendre, à tester et à maintenir en des méthodes raison dune complexité moyenne (complexité cyclomatique) et à de nombreuses références à des types tiers (couplage efférent) Objectif : éviter les blocs de traitements difficilement compréhensibles et non testables. Les seuils retenus pour le projet sont :  complexité cyclomatique : 15  couplage efférent : 20Confidentiel - Ce document est la propriété de Kalistick 8/61
  9. 9. Audit de code de l’application SharpDevelop 01/01/2011 Domaine Règle Explication, objectif et seuils éventuels Couverture de test des Taux de couverture de code dune méthode. Cette métrique est méthodes standardisée par notre plateforme à partir des mesures brutes de couverture de code quand elles sont fournies au sein de larchive du projet. Cette exigence associe un seuil minimal de test (couverture de code) à chaque méthode de lapplication selon le TRI (TestRelevancyIndex) ; le TRI évalue pour chaque méthode le risque quelle contienne des bugs. Son calcul tient compte des risques métiers définis pour lapplication. Test Objectif : orienter sa stratégie et les efforts de test sur les points sensibles de l’application et la vérifier. Ces points sensibles sont évalués selon leur propension à contenir des bugs et les risques métiers/fonctionnels de l’application. Le détail des seuils est fourni en annexe du rapport (8.4.2 Seuils de couverture de code). Règles définies Voir le modèle d’architecture éventuellement défini pour découvrir les spécifiquement pour le contraintes d’architecture en cours. Architecture modèle d’architecture de l’application. Objectif : s’assurer que les développements respectent le modèle d’architecture prévu et n’introduisent pas des incohérences synonymes de failles de sécurité, de difficultés de maintenance ou d’évolution. NB : les violations d’architecture ne sont pas prises en compte dans le calcul de la non-conformité. Entête de Identifie les méthodes de complexité moyenne qui ne disposent pas documentation des dentête de documentation. Les méthodes prises en compte sont celles Documentation méthodes dont la complexité cyclomatique et le nombre dinstructions excèdent des seuils définis spécifiquement pour le projet. Objectif : s’assurer que la documentation est présente sur les blocs de traitements clés en vue de faciliter les éventuels changements d’équipe (transférabilité). Les seuils retenus pour le projet sont :  complexité cyclomatique : 10  nombre de lignes : 50 Détection des Les duplications sont invalidées au-delà de 20 instructions Duplication duplications Objectif : détecter l’implémentation de traitements identiques à plusieurs endroits différents dans l’application, très souvent source d’incohérences lorsque l’on effectue des modifications, et facteur d’augmentation des coûts de tests et d’évolution.Confidentiel - Ce document est la propriété de Kalistick 9/61
  10. 10. Audit de code de l’application SharpDevelop 01/01/2011 4 Synthèse des résultats Ce chapitre synthétise la situation du projet à l’aide d’indicateurs globaux. Ceux-ci mesurent la qualité intrinsèque du projet, mais comparent également sa situation à celle des autres projets de la base de référence du « Cockpit Qualité ». 4.1 Situation du projet Les indicateurs suivants concernent la situation intrinsèque du projet. 4.1.1 Taux de non-conformité global Le taux de non-conformité mesure la proportion du code de l’application considéré comme non-conforme. Voir sur le Cockpit Qualité Plus précisément, ce chiffre résulte du rapport entre le nombre total d’instructions, et le nombre d’instructions des classes non-conformes. Une classe est considérée comme non conforme si au moins un des cas suivants est rencontré : - Une non-conformité de sévérité interdite est détectée dans la classe - Un ensemble de non-conformités fortement déconseillées, déconseillées, ou à éviter sont détectées dans la classe et dépassent un certain seuil. Ce calcul dépend de la sévérité de chaque non-conformité ainsi que du profil qualité qui ajuste le seuil de tolérance.Confidentiel - Ce document est la propriété de Kalistick 10/61
  11. 11. Audit de code de l’application SharpDevelop 01/01/2011 4.1.2 Ecart par rapport à l’objectif Ce graphique résume l’écart entre l’objectif visé tel que représenté par le profil qualité et la situation actuelle du projet. Cet écart est présenté pour chacun des axes de qualité : Voir sur le Cockpit Qualité Le niveau de non-conformité est calculé pour chaque axe de qualité, puis pondéré en fonction du niveau d’exigence fixé pour l’axe concerné. Axe de qualité Classes Violations impactantes % application Efficacité 159 283 42% Evolutivité 429 1794 84% Fiabilité 425 1925 84% Maintenabilité 54 339 18% Sécurité 0 0 0% Transférabilité 51 180 25% [Total] 480 2286 87% Les résultats détaillés précisent pour chaque axe de qualité : le nombre de classes non- conformes, le nombre de violations des règles sélectionnées, et le pourcentage de l’application présent dans les classes concernées.Confidentiel - Ce document est la propriété de Kalistick 11/61
  12. 12. Audit de code de l’application SharpDevelop 01/01/2011 4.1.3 Origine des non-conformités Le graphique suivant montre la répartition des non-conformités selon leur origine technique : Voir sur le Cockpit Qualité Ce graphique compare chaque domaine selon l’impact des règles qui lui sont associées sur la qualité de l’application. L’impact est mesuré à partir du nombre d’instructions des classes non- conformes. 4.1.4 Volumétrie Le tableau suivant précise la volumétrie de l’application analysée : Métrique Valeur Tendance Nombre de lignes 70895 +0,14% Nombre dinstructions 48877 +0,15% Nombre de méthodes 7568 +0,36% Nombre de classes 975 +0,21% Nombre de packages 48 = Voir sur le Cockpit Qualité Une « ligne » correspond à une ligne physique dun fichier de code. Elle peut concerner une ligne blanche, ou une ligne de commentaire. Une « instruction » représente une unité de code primaire, elle peut s’écrire sur plusieurs lignes, mais une ligne peut également contenir plusieurs instructions. Pour simplifier, une instruction est délimitée par un point-virgule (;) ou par une accolade gauche ({).Confidentiel - Ce document est la propriété de Kalistick 12/61
  13. 13. Audit de code de l’application SharpDevelop 01/01/2011 4.2 Benchmarking La base de connaissance du « Cockpit Qualité » permet de réaliser une analyse comparative du projet avec les autres projets analysés sur la plateforme. L’objectif est de mesurer son niveau de qualité par rapport à une moyenne générale. Cette comparaison « benchmarking » est proposée par rapport à deux catégories de projets :  Les projets « intra-Cockpit » : les projets analysés en continu sur la plateforme, donc, à priori, avec un niveau de qualité supérieur à la moyenne  Les projets « extra-Cockpit » : les projets analysés ponctuellement sur la plateforme, en mode audit, donc avec un niveau de qualité très hétérogène. NB : chaque projet disposant d’un profil qualité qui lui est spécifique, on ne compare pas l’écart en fonction de l’objectif, mais à l’aide de caractéristiques brutes, afin de donner des points de repère. 4.2.1 Comparaison sur les problèmes d’implémentation Le graphique suivant présente la situation du projet dans le domaine implémentation par rapport aux projets « extra-Cockpit », donc analysés ponctuellement sur la plateforme. Pour chaque niveau de sévérité, le niveau de qualité du projet est positionné par rapport aux autres : Voir sur le Cockpit QualitéConfidentiel - Ce document est la propriété de Kalistick 13/61
  14. 14. Audit de code de l’application SharpDevelop 01/01/2011 Le projet est positionné par rapport aux autres projets selon son taux de violations pour chaque règle. La répartition est basée sur la méthode des quartiles, trois groupes sont distingués, « Meilleur » : les 25% de projets les meilleurs, « Dans la moyenne » : les 50% de projets médians, « Moins bon » : les 25% de projets les moins bons. Cette information est synthétisée ensuite par niveau de sévérité. Plus le rouge domine plus le problème est important. Les règles d’implémentation comparées ne sont pas forcément les mêmes selon les profils de qualité, mais on compare ici les règles selon leur niveau de sévérité défini pour chaque projet. Le graphique suivant propose la même analyse, mais cette fois avec les projets « intra-Cockpit », analysés en continu sur la plateforme, donc avec un niveau de qualité normalement supérieur à la moyenne car dans un processus d’amélioration où les violations détectées sont corrigées : Voir sur le Cockpit Qualité Une couleur rouge dominante indique que les autres projets tendent à corriger les violations détectées sur ce projet.Confidentiel - Ce document est la propriété de Kalistick 14/61
  15. 15. Audit de code de l’application SharpDevelop 01/01/2011 4.2.2 Cartographie de la structure Le graphique suivant compare la cartographie de la taille des méthodes du projet avec celle des autres projets, « intra-Cockpit » et « extra-Cockpit », en comparant la proportion de l’application (en pourcentage d’instructions) qui est située dans des blocs de traitement (méthodes) avec un nombre d’instructions élevé : Voir sur le Cockpit Qualité Une proportion importante de l’application dans la zone droite est un indicateur de coûts de maintenance et d’évolution plus importants. NB : l’application analysée est indiquée sous le terme « Release ».Confidentiel - Ce document est la propriété de Kalistick 15/61
  16. 16. Audit de code de l’application SharpDevelop 01/01/2011 Une cartographie similaire est proposée à partir de la complexité cyclomatique4 des méthodes, en comparant la proportion de l’application (en pourcentage d’instructions) qui est située dans des blocs de traitement (méthodes) complexes : Voir sur le Cockpit Qualité Une proportion importante de l’application dans la zone droite indique non-seulement des coûts de maintenance et d’évolution plus importants, mais également des problèmes de fiabilité car ce code est difficile à tester. 4.2.3 Comparaison des principales métriques Le tableau suivant compare le projet avec les autres projets, « intra-Cockpit » et « extra-Cockpit », sur les principales métriques liées à la structure du code. Les intervalles de valeurs recommandées sont fournis à titre d’information. Métrique Project Extra-Cockpit Intra-Cockpit Intervalle recommandé Classes par package 20,31 10,48 10,9 6 - 26 Méthodes par classe 7,76 7,78 7,58 4 - 10 Lignes de code par méthode 6,46 12,76 10,85 7 - 13 Complexité par ligne de code 0,31 0,22 0,15 0.16 - 0.24 Voir sur le Cockpit Qualité 4 La complexité cyclomatique mesure la complexité algorithmique du code, et donc sa facilité à le tester, cf. http://classes.cecs.ucf.edu/eel6883/berrios/notes/Paper%204%20(Complexity%20Measure).pdfConfidentiel - Ce document est la propriété de Kalistick 16/61
  17. 17. Audit de code de l’application SharpDevelop 01/01/2011 4.3 Modélisation de l’application Pour faciliter la restitution des résultats d’analyse, l’application est modélisée sous deux angles: un angle fonctionnel pour mieux identifier les fonctionnalités métier de l’application et les rattacher au code, et un angle technique pour vérifier l’architecture technique de l’application. Ces modèles sont construits à l’aide de l’assistant de modélisation disponible au sein du Cockpit. Vous pouvez modifier ces modèles sur les pages Modélisation fonctionelle et Architecture technique (selon vos droits utilisateurs). 4.3.1 Modèle fonctionnel Le modèle fonctionnelle représente la vue métier de l’application, compréhensible par l’ensemble des acteurs du projet. Voir sur le Cockpit Qualité Le modèle fonctionnel est constitué de « modules » qui représente chacun une fonctionnalité métier, ou un groupe de fonctionnalité. Ces modules ont été identifiés à partir d’un corpus lexical généré à partir du code de l’application et qui permet d’isoler le vocabulaire métier de l’application.Confidentiel - Ce document est la propriété de Kalistick 17/61
  18. 18. Audit de code de l’application SharpDevelop 01/01/2011 4.3.2 Modèle technique Le modèle technique représente l’architecture du code de l’application. Le principe consiste à définir un modèle d’architecture cible, qui identifie des couches et/ou des composants techniques au sein de l’application, puis établit des contraintes pour autoriser ou interdire les communications entre chacun de ces éléments. L’objectif est triple :  Homogénéiser le comportement dune application. Par exemple sassurer que les écritures de logs utilisent telle API spécifique, que les accès aux données passent par telle couche, que telle librairie ne soit utilisée que par tel composant, ...  Assurer létanchéité de certains composants pour faciliter leur évolution et limiter les effets imprévus, mais aussi les rendre mutualisables avec dautres applications. Les cycles de dépendances sont par exemple proscrits.  Eviter les failles de sécurité en sassurant par exemple que des appels directs vers une couche daccès aux données ne sont jamais réalisés sans passer par une couche métier qui serait responsable de contrôles de validation Le résultat de l’analyse des contraintes d’architecture est présenté dans le chapitre 5.5 Architecture.Confidentiel - Ce document est la propriété de Kalistick 18/61
  19. 19. Audit de code de l’application SharpDevelop 01/01/2011 Voir sur le Cockpit Qualité Les flèches vertes formalisent des communications autorisées entre modules, tandis que les flèches rouges formalisent des communications proscrites.Confidentiel - Ce document est la propriété de Kalistick 19/61
  20. 20. Audit de code de l’application SharpDevelop 01/01/2011 5 Résultats détaillés Ce chapitre détaille les résultats en ciblant plus précisément les règles et les éléments de code non- conformes. Une analyse domaine par domaine est proposée. 5.1 Détail par axes de qualité L’histogramme suivant complète l’analyse synthétique en détaillant le taux de non-conformité ainsi que le nombre de classes non-conformes pour chaque axe de qualité. Pour rappel, le taux de non-conformité est basé sur le volume d’instructions des classes non-conformes par rapport au volume d’instructions global du projet. Ces taux de non-conformité dépendent directement du profil qualité du et du niveau des exigences qui ont été sélectionnées : Voir sur le Cockpit Qualité Une même classe pouvant être non-conforme sur plusieurs axes, le total ne correspond pas nécessairement à la somme des axes.Confidentiel - Ce document est la propriété de Kalistick 20/61
  21. 21. Audit de code de l’application SharpDevelop 01/01/2011 5.2 Implémentation Le domaine Implémentation couvre les règles se rapportant aux techniques de codage. Contrairement aux autres domaines, ces règles sont souvent spécifiques aux caractéristiques du langage (Java / C#). Elles identifient par exemple :  des bugs potentiels : variables non initialisées, problèmes d’accès concurrents, appels récursifs, …  des optimisations en terme mémoire ou CPU  des failles de sécurité  des utilisations de code obsolètes  des écritures s’écartant des standards recommandés  … Les règles d’implémentations sont les plus nombreuses au sein des exigences techniques. Elles sont ici nommées « pratiques ». 5.2.1 Répartition par sévérité L’objectif de cet indicateur est d’identifier la sévérité des pratiques qui ont provoqué l’invalidation des classes. On restreint ici les niveaux de sévérité à deux niveaux : les pratiques interdites (niveau de sévérité Interdit) et les pratiques déconseillées (niveaux de sévérité Fortement déconseillé, Déconseillé et A éviter). Le graphique suivant compare le nombre de classes invalidées en implémentation, selon les pratiques qui ont participé à cette invalidation :  Si une classe ne viole que des pratiques interdites, elle est dans le groupe « Pratiques interdites »  Si une classe ne viole que des pratiques déconseillées, elle est dans le groupe « Pratiques déconseillées »  Sinon, elle viole des pratiques des deux catégories et se trouve dans le groupe « Pratiques déconseillées et interdites » Voir sur le Cockpit QualitéConfidentiel - Ce document est la propriété de Kalistick 21/61
  22. 22. Audit de code de l’application SharpDevelop 01/01/2011 L’effort de correction lié aux pratiques interdites est généralement moins important par rapport aux sévérités inférieures : une seule violation interdite suffit à générer une non- conformité alors qu’il en faut plusieurs non interdites pour générer une non-conformité, en fonction des seuils de tolérance. Le tableau suivant détaille le graphique en introduisant la notion de « violation impactante ». Une violation impactante est une violation dont la correction permet de corriger totalement ou partiellement la non- conformité d’une classe. En effet, en raison des seuils de tolérance associés aux niveaux de sévérité, la correction de certaines violations n’a aucune influence sur la non-conformité globale de la classe. Sévérité Violations Nouvelles Violations Autres impactantes violations corrigées violations Interdit 382 5 0 0 Fortement déconseillé 176 1 0 55 Déconseillé 81 5 2 336 A éviter 202 1 1 340 Les colonnes « Nouvelles violations » et « Violations corrigées » ne sont pertinentes que dans le cas où l’audit fait suite à un audit précédent.Confidentiel - Ce document est la propriété de Kalistick 22/61
  23. 23. Audit de code de l’application SharpDevelop 01/01/2011 5.2.2 Pratiques à corriger en priorité Les deux tableaux suivants fournissent la liste des pratiques interdites et fortement déconseillées détectées dans l’application. Ce sont généralement les règles à corriger en priorité. Ces tableaux proposent pour chaque pratique le nombre de nouvelles violations (si un audit précédent a été réalisé), le nombre de violations au total pour cette pratique, le nombre de classes non-conformes où cette pratique a été détectée et le pourcentage d’instructions de ces classes par rapport au volume d’instruction global du projet. Ces chiffres permettent d’établir un plan d’action en fonction de l’impact associé à chaque pratique. 5.2.2.1 Pratiques interdites Pratique Nouvelles Violations Classes % NC application AvoidRedundantCasts 1 124 83 29% ImplementIDisposableForTypesWithDisposableFields 0 103 64 13% DontHardcodeLocaleSpecificStrings 2 81 56 14% UseConstInsteadOfReadOnlyWhenPossible_ 0 33 10 4% UseIsNullOrEmptyToCheckEmptyStrings 0 12 9 4% OverrideEqualsWithOperatorOnValueTypes 0 11 11 4% PropertyNamesMustNotMatchGetMethods 0 6 5 1% InstantiateExceptionsWithArguments 0 5 4 2% DontImplementWriteOnlyProperty 0 3 3 1% DefineMessageForObsoleteAttribute 2 2 2 1% DontUseInadvisableTypes 0 1 1 1% DontRaiseExceptionInUnexpectedMethod_ 0 1 1 1% Voir sur le Cockpit QualitéConfidentiel - Ce document est la propriété de Kalistick 23/61
  24. 24. Audit de code de l’application SharpDevelop 01/01/2011 5.2.2.2 Pratiques fortement déconseillées Pratique Nouvelles Violations Classes % NC application NeverMakeCtorCallOverridableMethod 0 185 48 10% DontUseNonConstantStaticVisibleFields 1 26 11 3% OverrideMethodsInIComparableImplementations 0 9 6 2% DefineAttributeForISerializableTypes 0 7 5 3% DontNestGenericInMemberSignatures_ 0 3 2 2% DontIgnoreMethodsReturnValue 0 1 1 1% Voir sur le Cockpit Qualité 5.2.3 Classes à corriger en priorité sur les problèmes d’implémentation Les deux tableaux suivants fournissent une vision complémentaire concernant l’impact des problèmes d’implémentation en détaillant la liste des principales classes concernées par des pratiques interdites ou fortement déconseillées. Pour chaque classe sont associés le nombre de violations existantes (pratiques interdites ou fortement déconseillées), le nombre de nouvelles violations (si un audit précédent a été réalisé), et l’état de conformité de la classe.Confidentiel - Ce document est la propriété de Kalistick 24/61
  25. 25. Audit de code de l’application SharpDevelop 01/01/2011 5.2.3.1 Classes avec des pratiques interdites Classe NC Nouvelles Violations Instructions ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefa Oui 0 10 647 ctoryResolver ICSharpCode.SharpDevelop.Dom.VBNet.VBExpressionFinder Oui 0 10 319 ICSharpCode.SharpDevelop.Dom.CSharp.CSharpExpressionFi Oui 0 10 600 nder ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.SharpD Oui 0 9 255 evelopTextAreaControl ICSharpCode.SharpDevelop.Gui.DefaultWorkbench Oui 0 8 387 ICSharpCode.SharpDevelop.Project.ConfigurationGuiHelper Oui 1 8 0 ICSharpCode.SharpDevelop.Widgets.TreeGrid.DynamicListIt Oui 0 8 211 em ICSharpCode.SharpDevelop.ParserService Oui 0 7 489 ICSharpCode.SharpDevelop.Gui.SdiWorkbenchLayout Oui 0 7 360 ICSharpCode.SharpDevelop.Dom.DomPersistence Oui 0 6 567 ICSharpCode.Core.MenuService Oui 0 6 78 ICSharpCode.SharpDevelop.Dom.DefaultProjectContent Oui 0 5 554 ICSharpCode.SharpDevelop.Gui.XmlForms.XmlLoader Oui 0 5 200 ICSharpCode.SharpDevelop.Refactoring.RefactoringService Oui 0 5 312 ICSharpCode.SharpDevelop.Project.ProjectService Oui 0 5 355 ICSharpCode.SharpDevelop.Project.MSBuildEngine Oui 0 5 337 ICSharpCode.SharpDevelop.Gui.FontSelectionPanelHelper Oui 0 5 101 ICSharpCode.SharpDevelop.Project.Commands.AddExistingIt Oui 0 4 168 emsToProject ICSharpCode.SharpDevelop.Debugging.DebuggerService Oui 0 4 288 Voir sur le Cockpit QualitéConfidentiel - Ce document est la propriété de Kalistick 25/61
  26. 26. Audit de code de l’application SharpDevelop 01/01/2011 5.2.3.2 Classes avec des pratiques fortement déconseillées Classe NC Nouvelles Violations Instructions ICSharpCode.SharpDevelop.Gui.ExtTreeNode Oui 0 69 248 ICSharpCode.SharpDevelop.Gui.ClassBrowser.MemberNode Oui 0 12 72 ICSharpCode.SharpDevelop.Gui.XmlForms.XmlForm Oui 0 12 22 ICSharpCode.SharpDevelop.Dom.HostCallback Oui 1 9 19 ICSharpCode.SharpDevelop.Dom.ReflectionLayer.ReflectionClass Oui 0 8 102 ICSharpCode.SharpDevelop.Dom.ExpressionContext Oui 0 6 142 ICSharpCode.SharpDevelop.Dom.ReflectionLayer.ReflectionMethod Oui 0 5 41 ICSharpCode.SharpDevelop.Project.Dialogs.NewProjectDialog Oui 0 4 274 ICSharpCode.SharpDevelop.Project.FileNode Oui 0 4 155 ICSharpCode.SharpDevelop.Gui.NewFileDialog Oui 0 3 378 ICSharpCode.SharpDevelop.Project.ProjectNode Oui 0 3 114 ICSharpCode.SharpDevelop.Dom.DefaultEvent Oui 0 3 43 ICSharpCode.SharpDevelop.Dom.ReflectionLayer.ReflectionParame Oui 0 3 14 ter ICSharpCode.SharpDevelop.Dom.DefaultProperty Oui 0 3 62 ICSharpCode.SharpDevelop.Dom.DefaultMethod Oui 0 3 84 ICSharpCode.SharpDevelop.Dom.DefaultProjectContent Oui 0 2 554 ICSharpCode.SharpDevelop.Internal.Templates.FileTemplate Oui 0 2 124 ICSharpCode.SharpDevelop.Dom.DefaultParameter Oui 0 2 76 ICSharpCode.Core.MenuCommand Oui 0 2 85 Voir sur le Cockpit Qualité 5.3 Structure Le domaine Structure cible les règles se rapportant à la structuration du code, par exemple :  La taille des méthodes  La complexité cyclomatique des méthodes  Le couplage, ou la dépendance des méthodes par rapport aux classes extérieures L’objectif est de s’assurer que le code est structuré de telle manière qui puisse être facilement maintenu, testé, et qu’il puisse évoluer. Ces règles sont des « métriques ». Elles mesurent des valeurs (p. ex. : un nombre d’instructions) et sont conditionnées par des seuils (p. ex. : 100 instructions / méthode). Seules les métriques qui offrent un levier d’action facile à comprendre et à mettre en œuvre sont proposées ici. Elles s’appliquent toutes à des méthodes.Confidentiel - Ce document est la propriété de Kalistick 26/61
  27. 27. Audit de code de l’application SharpDevelop 01/01/2011 5.3.1 Typologie des problèmes de structure Cet histogramme montre pour chaque règle de structure le nombre de non-conformités (donc de méthodes) ainsi que le pourcentage du volume d’instructions concernées par rapport au volume global de l’application : Voir sur le Cockpit Qualité Le pourcentage d’instructions représenté est intéressant dans la mesure où on constate souvent qu’un petit nombre de méthodes concentrent une grosse partie du code de l’application. Si des règles ont été configurées pour ne pas être prises en compte dans l’audit, elles sont affichées dans ce graphe mais sans aucun résultat. Une méthode peut-être concernée par plusieurs règles, en conséquence le total ne correspond pas à la somme des chiffres. Le tableau suivant complète cette vision en introduisant le nombre de nouvelles violations et le nombre de violations corrigées dans le cas où un audit précédent aurait été réalisé :Confidentiel - Ce document est la propriété de Kalistick 27/61
  28. 28. Audit de code de l’application SharpDevelop 01/01/2011 Anomalie Violation Nouvelles Violations NC s violations corrigées impactant es Complexité cyclomatique supérieure à 20 41 1 0 5% Voir sur le Cockpit Qualité 5.3.2 Cartographie des méthodes par taille L’histogramme suivant présente une cartographie des méthodes de l’application selon leur taille. La taille est exprimée en nombre d’instructions pour faire abstraction du format d’écriture (conventions de styles appliquées sur le projet). Le dernier intervalle identifie les méthodes dont le nombre d’instructions dépasse le seuil fixé. Ces méthodes sont considérées comme non-conformes car elles sont généralement difficiles à maintenir et à faire évoluer, et montrent également une forte propension à faire apparaître des bugs, car elles sont difficilement testables. Le pourcentage d’instructions est fourni car les méthodes les plus grosses concentrent généralement une part importante de l’application : Voir sur le Cockpit Qualité Le tableau suivant détaille les principales méthodes non-conformes, identifiées dans le dernier intervalle du graphique précédent :Confidentiel - Ce document est la propriété de Kalistick 28/61
  29. 29. Audit de code de l’application SharpDevelop 01/01/2011 Méthode Instructions Lignes Complexité Nouvelle violation 5.3.3 Cartographie des méthodes par complexité L’histogramme suivant présente une cartographie des méthodes de l’application selon leur complexité cyclomatique (cf 8.1 La complexité cyclomatique). La complexité cyclomatique est une mesure qui permet de caractériser la complexité d’un bloc de code, en s’intéressant aux différents chemins d’exécution possibles. Ce concept a été standardisé par Mc Cabe5 mais plusieurs modes de calcul existent. Celui retenu ici est l’un des plus répandus et l’un des plus simples : il consiste à compter le nombre d’opérateur d’embranchements (if, for, while, ?, …) et de conditions ( ??, &&, …). Le dernier intervalle identifie les méthodes dont la complexité dépasse le seuil fixé. Ces méthodes sont considérées comme non-conformes pour les mêmes raisons que pour les méthodes trop longues : elles sont généralement difficiles à maintenir et à faire évoluer, et montrent également une forte propension à faire apparaître des bugs. Le pourcentage d’instructions ainsi que le pourcentage de complexité sont fournis car les méthodes les plus complexes concentrent généralement une part importante de l’application. Voir sur le Cockpit Qualité Le tableau suivant détaille les principales méthodes non-conformes, identifiées dans le dernier intervalle du graphique précédent : 5 1976, IEEE Transactions on Software Engineering: 308–320. http://classes.cecs.ucf.edu/eel6883/berrios/notes/Paper%204%20(Complexity%20Measure).pdf.Confidentiel - Ce document est la propriété de Kalistick 29/61
  30. 30. Audit de code de l’application SharpDevelop 01/01/2011 Méthode Instructions Lignes Complexité Nouvelle violation ICSharpCode.SharpDevelop.Dom.ReflectionLayer.Reflection 21 36 21 Nouvelle Class.InitMembers ( System.Type) ICSharpCode.SharpDevelop.Dom.MemberLookupHelper.Con 53 77 83 versionExists ( ICSharpCode.SharpDevelop.Dom.IReturnType, ICSharpCode.SharpDevelop.Dom.IReturnType) ICSharpCode.SharpDevelop.Dom.CSharp.CSharpExpression 57 78 47 Finder.SearchBracketForward ( System.String, System.Int32, System.Char, System.Char) ICSharpCode.SharpDevelop.Dom.VBNet.VBNetAmbience.C 81 128 44 onvert ( ICSharpCode.SharpDevelop.Dom.IClass) ICSharpCode.SharpDevelop.Dom.CSharp.CSharpAmbience. 77 118 41 Convert ( ICSharpCode.SharpDevelop.Dom.IClass) ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRef 71 100 34 actoryResolver.ResolveInternal ( ICSharpCode.NRefactory.Ast.Expression, ICSharpCode.SharpDevelop.Dom.ExpressionContext) ICSharpCode.SharpDevelop.Widgets.SideBar.SideBarContro 81 97 32 l.ProcessCmdKey ( ref System.Windows.Forms.Message, System.Windows.Forms.Keys) ICSharpCode.SharpDevelop.Dom.MemberLookupHelper.Get 20 22 31 BetterPrimitiveConversion ( ICSharpCode.SharpDevelop.Dom.IReturnType, ICSharpCode.SharpDevelop.Dom.IReturnType) ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.Type 53 73 31 Visitor.CreateReturnType ( ICSharpCode.NRefactory.Ast.TypeReference, ICSharpCode.SharpDevelop.Dom.IClass, ICSharpCode.SharpDevelop.Dom .IMember, System.Int32, System.Int32, ICSharpCode.SharpDevelop.Dom.IProjectContent, System.Boolean) ICSharpCode.SharpDevelop.Dom.CecilReader.CecilClass.Ini 57 83 30 tMembers ( Mono.Cecil.TypeDefinition) ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.MethodI 42 59 29 nsightDataProvider.SetupDataProvider ( System.String, ICSharpCode.TextEditor.Document.IDocument, ICSharpCode.SharpDevelop.Dom.ExpressionResult, System.Int32, System.Int32) ICSharpCode.SharpDevelop.Refactoring.RefactoringService. 55 89 29 AddReferences ( System.Collections.Generic.List<ICSharpCode.SharpDevelop .Refactoring.Reference>, ICSharpCode.SharpDevelop.Dom.IClass, ICSharpCode.SharpDevelop.Dom.IMember, System.Boolean, System.String, System.String) ICSharpCode.SharpDevelop.Project.DirectoryNode.Initialize ( 81 121 29 ) ICSharpCode.SharpDevelop.Project.MSBuildBasedProject.S 92 140 28 etPropertyInternal ( System.String, System.String, System.String, System.String, ICSharpCode.SharpDevelop.Project.PropertyStorageLocation s, System.Boolean)Confidentiel - Ce document est la propriété de Kalistick 30/61
  31. 31. Audit de code de l’application SharpDevelop 01/01/2011 ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRef 53 81 28 actoryResolver.ResolveIdentifierInternal ( System.String) ICSharpCode.SharpDevelop.Commands.ToolMenuBuilder.To 54 74 26 olEvt ( System.Object, System.EventArgs) ICSharpCode.SharpDevelop.Dom.MemberLookupHelper.Get 32 51 26 BetterFunctionMember ( ICSharpCode.SharpDevelop.Dom.IReturnType[], ICSharpCode.SharpDevelop.Dom.IMethodOrProperty, ICSharpCode.SharpDevelop.Dom.IReturnType[], System.Boolean, ICSharpCode.SharpDevelop.Dom.IMethodOrProperty, ICSharpCode.SharpDevelop.Dom.IReturnType[], System.Boolean) ICSharpCode.SharpDevelop.Dom.CSharp.CSharpExpression 51 68 26 Finder.FindFullExpression ( System.String, System.Int32) ICSharpCode.SharpDevelop.Dom.CSharp.CSharpExpression 58 76 25 Finder.ReadNextToken ( ) 5.3.4 Cartographie des méthodes selon leur complexité et leur couplage efférent Cette règle vise à identifier les méthodes dont le code présente de nombreuses dépendances vers d’autres classes que la classe courante. La notion de « couplage efférent » correspond à ces dépendances « sortantes ». Le principe est qu’une méthode accusant un fort couplage efférent est difficile à comprendre, à maintenir et à tester d’une part parce qu’elle nécessite la connaissance des différents types tiers dépendants, d’autre par parce que son risque de déstabilisation est plus élevé en raison de ses dépendances. Cette règle est croisée avec la complexité cyclomatique afin d’ignorer certaines méthodes triviales, par exemple des méthodes d’initialisation d’interfaces graphiques qui font appels à de nombreuses classes de composants graphiques sans présenter de réelle complexité. Cette règle considère donc qu’une méthode est non-conforme si elle excède un seuil de couplage efférent et un seuil de complexité cyclomatique.Confidentiel - Ce document est la propriété de Kalistick 31/61
  32. 32. Audit de code de l’application SharpDevelop 01/01/2011 Le graphique suivant présente une cartographie des méthodes selon leur complexité et leur couplage efférent. Chaque point représente une ou des méthodes avec les mêmes valeurs de complexité et de couplage. Ils sont répartis dans quatre zones selon leur état par rapport aux deux seuils :  La zone en bas à gauche (points verts) contient des méthodes conformes qui n’ont atteint aucun des deux seuils  La zone en bas à droite (points gris) contient des méthodes conformes ; elles ont atteint le seuil de complexité, mais restent en-dessous du seuil de couplage  La zone en haut à gauche (points gris) contient des méthodes conformes ; elles ont atteint le seuil de couplage, mais restent en-dessous du seuil de complexité  La zone en haut à droite (points rouges) contient les méthodes non-conformes car les deux seuils sont atteints Voir sur le Cockpit Qualité L’intensité de la couleur des points dépend du nombre de méthodes partageant les mêmes valeurs en complexité et en couplage : plus la couleur du point est marquée, plus il y a de méthodes concernées.Confidentiel - Ce document est la propriété de Kalistick 32/61
  33. 33. Audit de code de l’application SharpDevelop 01/01/2011 L’histogramme suivant fournit une vision complémentaire de cette cartographie et précise les chiffres pour les quatre zones, en termes de pourcentage des méthodes de l’application et en termes de pourcentage du nombre d’instructions total de l’application. Les dernières barres correspondent à la zone de non- conformité : Voir sur le Cockpit Qualité Le tableau suivant détaille les principales méthodes non-conformes :Confidentiel - Ce document est la propriété de Kalistick 33/61
  34. 34. Audit de code de l’application SharpDevelop 01/01/2011 Méthode Couplage Complexité Nouvelle efférent violation ICSharpCode.SharpDevelop.Refactoring.RefactoringMenuBuilder.Build 45 22 Submenu ( ICSharpCode.Core.Codon, System.Object) ICSharpCode.SharpDevelop.Project.Commands.AddExistingItemsToP 39 22 roject.Run ( ) ICSharpCode.SharpDevelop.Dom.CecilReader.CecilClass.InitMember 36 30 s ( Mono.Cecil.TypeDefinition) ICSharpCode.SharpDevelop.Gui.NewFileDialog.OpenEvent ( 35 17 System.Object, System.EventArgs) ICSharpCode.SharpDevelop.Commands.ToolMenuBuilder.ToolEvt ( 32 26 System.Object, System.EventArgs) ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryRes 31 34 olver.ResolveInternal ( ICSharpCode.NRefactory.Ast.Expression, ICSharpCode.SharpDevelop.Dom.ExpressionContext) ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.MethodInsightDat 30 29 aProvider.SetupDataProvider ( System.String, ICSharpCode.TextEditor.Document.IDocument, ICSharpCode.SharpDevelop.Dom.ExpressionResult, System.Int32, System.Int32) ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryRes 30 18 Nouvelle olver.CtrlSpace ( System.Int32, System.Int32, System.String, System.String, ICSharpCode.SharpDevelop.Dom.ExpressionContext) ICSharpCode.SharpDevelop.DefaultEditor.Commands.ClassBookmark 29 19 MenuBuilder.BuildSubmenu ( ICSharpCode.Core.Codon, System.Object) ICSharpCode.SharpDevelop.Project.MSBuildEngine.BuildRun.ParseS 29 19 olution ( Microsoft.Build.BuildEngine.Project) ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryRes 28 28 olver.ResolveIdentifierInternal ( System.String) ICSharpCode.SharpDevelop.Dom.CecilReader.CreateType ( 28 21 ICSharpCode.SharpDevelop.Dom.IProjectContent, ICSharpCode.SharpDevelop.Dom.IDecoration, Mono.Cecil.TypeReference) ICSharpCode.SharpDevelop.Project.ProjectService.LoadProject ( 27 15 System.String) ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.TypeVisitor.Cre 26 31 ateReturnType ( ICSharpCode.NRefactory.Ast.TypeReference, ICSharpCode.SharpDevelop.Dom.IClass, ICSharpCode.SharpDevelop.Dom.IMember, System.Int32, System.Int32, ICSharpCode.SharpDevelop.Dom.IProjectContent, System.Boolean) ICSharpCode.SharpDevelop.Project.DirectoryNode.Initialize ( ) 26 29 ICSharpCode.SharpDevelop.Widgets.TreeGrid.DynamicList.OnPaint ( 26 21 System.Windows.Forms.PaintEventArgs) ICSharpCode.SharpDevelop.Project.Dialogs.NewProjectDialog.OpenE 26 20 vent ( System.Object, System.EventArgs) ICSharpCode.SharpDevelop.Dom.CecilReader.CecilClass ( 26 15 ICSharpCode.SharpDevelop.Dom.ICompilationUnit, ICSharpCode.SharpDevelop.Dom.IClass, Mono.Cecil.TypeDefinition, System.String).CecilClass ( ICSharpCode.SharpDevelop.Dom.ICompilationUnit, ICSharpCode.SharpDevelop.Dom.IClass, Mono.Cecil.TypeDefinition, System.String) ICSharpCode.SharpDevelop.Gui.GotoDialog.TextBoxTextChanged ( 25 18 System.Object, System.EventArgs)Confidentiel - Ce document est la propriété de Kalistick 34/61
  35. 35. Audit de code de l’application SharpDevelop 01/01/2011 Voir sur le Cockpit Qualité 5.4 Test Le domaine Test propose des règles pour s’assurer que l’application est suffisamment testée, quantitativement mais surtout qualitativement, c.-à-d. que les tests ciblent les zones à risques. 5.4.1 Problématiques Il est important de situer les problématiques inhérentes à la gestion des tests afin de comprendre les résultats d’analyse pour ce domaine. 5.4.1.1 Tests unitaires et couverture de code Les résultats de ce domaine dépendent du processus de test appliqué sur le projet : si processus de tests unitaires automatisés et/ou de la couverture de code sont mis en œuvre sur le projet, alors l’analyse exploite les résultats de ces processus. Pour rappel, il faut bien distinguer test unitaire et couverture de code :  Un test unitaire est un test automatisé, qui teste généralement une méthode. Mais cette méthode ayant généralement des dépendances vers d’autres méthodes ou classes, un test unitaire peut tester un ensemble plus ou moins important de l’application (et plus cet ensemble est large, moins le test est pertinent)  La couverture de code mesure le volume de code réellement exécuté suite à des tests, en identifiant précisément chaque élément de code exécuté (instruction, branche conditionnelle, fonction, …). Ces tests peuvent être des tests unitaires (automatisés), ou des tests d’intégration / fonctionnels (manuels ou automatisés). La couverture de code est intéressante à combiner aux tests unitaires car c’est le seul moyen de mesurer le code réellement testé. Cependant, beaucoup de projets ne vérifient toujours pas la couverture du code, ce qui ne permet pas de vérifier la qualité des tests dans ce type d’analyse. Les indicateurs présentés par la suite permettent d’adresser les différents cas, que le projet mette en œuvre ou non des tests unitaires ou de la couverture de code. 5.4.1.2 Pertinence de la couverture de code La couverture de code fournit des chiffres précisant la proportion du code exécuté suite à des tests, par exemple 68% des instructions d’une méthode sont couvertes, 57% des instructions du projet. Le problème est que ces chiffres ne tiennent pas compte de la pertinence à tester le code. Par exemple une couverture de 70% de l’application est un bon chiffre, mais le code couvert peut être trivial et sans réel intérêt pour les tests (par exemple les accesseurs ou du code généré), alors que le code sensible pourra se trouver dans les 30% non couverts.Confidentiel - Ce document est la propriété de Kalistick 35/61
  36. 36. Audit de code de l’application SharpDevelop 01/01/2011 L’analyse réalisée ici tient compte de la pertinence à tester chaque méthode, ce qui permet de calibrer les exigences de couverture de code et de fixer des exigences en termes de seuil de couverture qui utilisent au mieux l’effort de test en l’orientant sur les zones à risques. 5.4.2 Les métriques TestRelevancyIndex (TRI) et TestEffortIndex (TEI) Pour affiner l’analyse des tests, deux nouvelles métriques ont été conçues par le Centre d’Excellence en Technologies de l’Information et de la Communication (CETIC) en s’appuyant sur les recherches effectuées durant les 20 dernières années et à partir de la base de connaissances du « Cockpit Qualité »6. Le TestRelevancyIndex (TRI) mesure la pertinence à tester une méthode selon ses risques techniques et ses risques fonctionnels. Le risque technique évalue la probabilité de trouver un défaut, il est basé sur différentes métriques qui les favorisent telles que la complexité cyclomatique, le nombre de variables, de paramètres, le couplage efférent, le nombre de non-conformités cumulé, … Le risque fonctionnel associe un facteur de risque aux différents groupes de traitements fonctionnels que l’on souhaite tester en priorité (risque majoré) ou à l’inverse ne pas tester (risque minoré). Il doit être déterminé au début de l’audit pour être pris en compte dans les calculs de TRI. L’objectif est d’orienter l’effort de test sur les fonctionnalités importantes. Pour cela, le TRI permet de classer les méthodes selon une échelle de priorité de tests, et donc de bien distinguer les méthodes réellement pertinentes à tester des méthodes triviales et sans intérêt sur ce domaine. Pour chaque niveau de l’échelle, un seuil de couverture de code à atteindre peut être fixé indépendamment. Ceci permet de définir un seuil exigeant pour des méthodes critiques, et un seuil bas pour des méthodes à priorité basse. Le TestEffortIndex (TEI) complète le TRI en mesurant le niveau d’effort pour tester une méthode. Comme le TRI, il est basé sur un ensemble de métriques unitaires caractérisant la méthode. Il permet d’affiner les décisions pour sélectionner le code à tester en mettant dans la balance l’effort à fournir par rapport à la pertinence de test. Le détail du calcul de ces deux index est fourni en annexe (8.2 Le couplage). 5.4.3 Cartographie des méthodes par priorité de test L’histogramme suivant présente une cartographie des méthodes selon leur priorité de tests, à l’aide d’une échelle de quatre niveaux basée sur le TRI des méthodes (chaque niveau correspondant à un intervalle de TRI). Cette cartographie exploite les informations de couverture de code seulement si elles ont été fournies pour l’analyse. Pour chaque niveau de priorité est indiqué :  Le taux de couverture moyen (0 si les informations de couverture n’ont pas été fournies)  Le nombre de méthodes non couvertes (aucune couverture) 6 CETIC, Kalistick. Statistically Calibrated Indexes for Unit Test Relevancy and Unit Test Writing Effort, 2010Confidentiel - Ce document est la propriété de Kalistick 36/61
  37. 37. Audit de code de l’application SharpDevelop 01/01/2011  Le nombre de méthodes insuffisamment couvertes (taux de couverture inférieur au taux fixé en objectif pour ce niveau de priorité)  Le nombre de méthodes suffisamment couvertes (taux de couverture supérieur ou égal au taux fixé en objectif pour ce niveau de priorité) Le tableau suivant détaille ces chiffres pour chaque niveau de priorité, en ajoutant également un cinquième niveau correspondant aux méthodes sans priorité de test : Priorité de test Couvertes Non couvertes Insuffisamment couvertes Critique 0 1373 0 Haute 0 515 0 Moyenne 0 10 0 Basse 0 14 0 Aucune 0 5656 0 [Total] 0 7568 0 Voir sur le Cockpit Qualité 5.4.4 Couverture de l’application par les tests Ce graphique, appelé « TreeMap », restitue une vision de la couverture de l’application par les tests par rapport aux objectifs. Il permet d’identifier facilement les parties de l’application qui ne sont pas assez testées par rapport aux risques identifiés. Il regroupe les classes du projet par sous-ensembles techniques, et les caractérise selon deux dimensions :  la taille, qui dépend de leur nombre dinstructions  la couleur, qui représente lécart par rapport à lobjectif de test fixé pour la classe : la couleur rouge indique que le taux de couverture actuel est loin de l’objectif, la couleur verte indique que l’objectif est atteintConfidentiel - Ce document est la propriété de Kalistick 37/61
  38. 38. Audit de code de l’application SharpDevelop 01/01/2011 Voir sur le Cockpit Qualité Une classe peut être de couleur verte même si elle n’est pas ou peu testée, par exemple pour des classes avec une faible probabilité de défauts ou un risque fonctionnel réduit. Inversement, une classe déjà bien testée peut être indiquée comme insuffisante (rouge/brun) si son objectif est très exigeant. Une stratégie efficace pour améliorer sa couverture consiste à se concentrer sur les classes de taille importantes et proches de l’objectif. 5.4.5 Classes les plus importantes à tester (Top Risks) Le graphique suivant permet d’identifier rapidement les classes les plus pertinentes à tester, les « Top Risks ». C’est une représentation dite en « nuage », qui affiche les classes à l’aide de deux dimensions :  La taille du nom de classe dépend de son intérêt à être testée (valeur de TRI cumulée pour toutes ses méthodes)  La couleur représente lécart par rapport à lobjectif de couverture fixé pour la classe, tout comme pour le TreeMap précédentConfidentiel - Ce document est la propriété de Kalistick 38/61
  39. 39. Audit de code de l’application SharpDevelop 01/01/2011 Voir sur le Cockpit Qualité Cette représentation permet d’identifier les éléments critiques, mais si l’on souhaite tenir compte de l’effort d’écriture des tests il faut privilégier la représentation suivante pour sélectionner les éléments à corriger. 5.4.6 Classes les plus importantes à tester et demandant le moins d’effort (Quick Wins) Les « Quick Wins » complémente les « Top Risks » en tenant compte de l’effort de test à fournir pour tester la classe (TEI) :  La taille du nom de classe dépend de son intérêt à être testée (TRI), mais pondéré par l’effort nécessaire (TEI cumulé pour toutes ses méthodes) : une classe avec un fort TRI et un fort TEI (donc difficile à tester) apparaît plus petite qu’une classe avec un TRI moyen mais un faible TEI  La couleur représente lécart par rapport à lobjectif de couverture fixé pour la classe, tout comme pour le TreeMap ou les QuickWinsConfidentiel - Ce document est la propriété de Kalistick 39/61
  40. 40. Audit de code de l’application SharpDevelop 01/01/2011 Voir sur le Cockpit Qualité 5.4.7 Méthodes à tester en priorité Le tableau suivant détaille les principales méthodes à tester en priorité. A chaque méthode sont associés son taux de couverture actuel, sa valeur brute de TRI, et son niveau de TEI échelonnée de 0 à 4 :Confidentiel - Ce document est la propriété de Kalistick 40/61
  41. 41. Audit de code de l’application SharpDevelop 01/01/2011 Méthode Couverture Pertinence Priorité Effort Nouvelle (TRI) violation ICSharpCode.SharpDevelop.Refactoring.RefactoringM 0% 37.00 Critique Elevé enuBuilder.BuildSubmenu ( ICSharpCode.Core.Codon, System.Object) ICSharpCode.SharpDevelop.Project.Solution.SetupSol 0% 37.00 Critique Très élevé ution ( ICSharpCode.SharpDevelop.Project.Solution, System.String) ICSharpCode.SharpDevelop.Project.MSBuildBasedProj 0% 37.00 Critique Très élevé ect.SetPropertyInternal ( System.String, System.String, System.String, System.String, ICSharpCode.SharpDevelop.Project.PropertyStorageL ocations, System.Boolean) ICSharpCode.SharpDevelop.Dom.NRefactoryResolver. 0% 37.00 Critique Très élevé NRefactoryResolver.ResolveIdentifierInternal ( System.String) ICSharpCode.SharpDevelop.Commands.SharpDevelop 0% 36.00 Critique Elevé StringTagProvider.Convert ( System.String) ICSharpCode.Core.AddInTree.Load ( 0% 36.00 Critique Elevé System.Collections.Generic.List<System.String>, System.Collections.Generic.List<System.String>) ICSharpCode.SharpDevelop.Project.Commands.AddEx 0% 36.00 Critique Elevé istingItemsToProject.Run ( ) ICSharpCode.SharpDevelop.Dom.CecilReader.CreateT 0% 35.00 Critique Elevé ype ( ICSharpCode.SharpDevelop.Dom.IProjectContent, ICSharpCode.SharpDevelop.Dom.IDecoration, Mono.Cecil.TypeReference) ICSharpCode.SharpDevelop.Commands.ToolMenuBuil 0% 35.00 Critique Elevé der.ToolEvt ( System.Object, System.EventArgs) ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor. 0% 35.00 Critique Très élevé MethodInsightDataProvider.SetupDataProvider ( System.String, ICSharpCode.TextEditor.Document.IDocument, ICSharpCode.SharpDevelop.Dom.ExpressionResult, System.Int32, System.Int32) ICSharpCode.SharpDevelop.Refactoring.RefactoringSe 0% 35.00 Critique Elevé rvice.AddReferences ( System.Collections.Generic.List<ICSharpCode.SharpD evelop.Refactoring.Reference>, ICSharpCode.SharpDevelop.Dom.IClass, ICSharpCode.SharpDevelop.Dom.IMember, System.Boolean, System.String, System.String) ICSharpCode.SharpDevelop.Dom.ReflectionLayer.Refl 0% 35.00 Critique Elevé ectionReturnType.Create ( ICSharpCode.SharpDevelop.Dom.IProjectContent, ICSharpCode.SharpDevelop.Dom.IDecoration, System.Type, System.Boolean)Confidentiel - Ce document est la propriété de Kalistick 41/61
  42. 42. Audit de code de l’application SharpDevelop 01/01/2011 ICSharpCode.SharpDevelop.Dom.NRefactoryResolver. 0% 35.00 Critique Très élevé NRefactoryResolver.ResolveInternal ( ICSharpCode.NRefactory.Ast.Expression, ICSharpCode.SharpDevelop.Dom.ExpressionContext) ICSharpCode.SharpDevelop.Dom.NRefactoryResolver. 0% 35.00 Critique Très élevé TypeVisitor.CreateReturnType ( ICSharpCode.NRefactory.Ast.TypeReference, ICSharpCode.SharpDevelop.Dom.IClass, ICSharpCode.SharpDevelop.Dom.IMember, System.Int32, System.Int32, ICSharpCode.SharpDevelop.Dom.IProjectContent, System.Boolean) ICSharpCode.SharpDevelop.Dom.CSharp.CSharpExpre 0% 35.00 Critique Elevé ssionFinder.SearchBracketForward ( System.String, System.Int32, System.Char, System.Char) ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.A 0% 35.00 Critique Elevé bstractCodeCompletionDataProvider.CreateItem ( System.Object, ICSharpCode.SharpDevelop.Dom.ExpressionContext) ICSharpCode.SharpDevelop.Project.MSBuildEngine.Bu 0% 34.00 Critique Normal ildRun.ParseSolution ( Microsoft.Build.BuildEngine.Project) ICSharpCode.SharpDevelop.Project.ProjectService.Loa 0% 34.00 Critique Elevé dProject ( System.String) ICSharpCode.SharpDevelop.Project.ProjectBrowserCo 0% 34.00 Critique Elevé ntrol.FindDeepestOpenNodeForPath ( System.String) Voir sur le Cockpit Qualité 5.5 Architecture Le domaine Architecture vise à contrôler le respect d’un modèle d’architecture logicielle. Le modèle d’architecture cible a été présenté dans le chapitre 4.3.2 Modèle technique. Le schéma suivant montre les résultats de l’analyse des contraintes d’architecture en comparant ce modèle cible avec le code de l’application. Actuellement, les violations des contraintes d’architecture ne sont pas prises en compte dans le calcul de la non-conformité de l’application.Confidentiel - Ce document est la propriété de Kalistick 42/61
  43. 43. Audit de code de l’application SharpDevelop 01/01/2011 Voir sur le Cockpit Qualité Les violations de contraintes de communication entre deux éléments sont représentées à l’aide de flèches. Le point de départ est l’élément appelant, le point de destination est l’appelé. Les flèches oranges concernent une communication directe entre une couche haute et une couche basse non adjacente (parfois acceptables). Les flèches noires concernent des communications totalement prohibées. 5.6 Duplication Le domaine Duplication concerne les « copier-coller » identifiés au sein de l’application. Pour éviter les nombreux faux-positifs dans ce domaine, seuls sont remontés les blocs dupliqués impliquant un seuil minimal d’instructions. Les duplications sont à proscrire pour de multiples raisons : problèmes de maintenance et d’évolutivité, coûts de tests, défaut de fiabilité, … 5.6.1 Cartographie des duplications Le graphique suivant présente une cartographie des duplications au sein de l’application. Il ne tient pas compte des duplications impliquant un nombre d’instructions inférieur au seuil, car celles-ci sont généralement nombreuses et peu pertinentes (par exemple les duplications d’accesseurs entre différentes classes partageant des propriétés semblables).Confidentiel - Ce document est la propriété de Kalistick 43/61

×