Génie logiciel avancé

Documents pareils
Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Environnements de développement (intégrés)

Programme Compte bancaire (code)

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Programmer en JAVA. par Tama


Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Qualité du logiciel: Méthodes de test

Cours Informatique Master STEP

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à la programmation concurrente

Cours de Master Recherche

Recherche dans un tableau

as Architecture des Systèmes d Information

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Projet de programmation (IK3) : TP n 1 Correction

Introduction au langage C

Notions fondamentales du langage C# Version 1.0

Quatrième partie IV. Test. Test 15 février / 71

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Plan du cours. Historique du langage Nouveautés de Java 7

Bases de programmation. Cours 5. Structurer les données

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Conventions d écriture et outils de mise au point

Examen Médian - 1 heure 30

Problèmes liés à la concurrence

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Analyse de sécurité de logiciels système par typage statique

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Initiation à l algorithmique

Test de logiciel dans les méthodes agiles

ACTIVITÉ DE PROGRAMMATION

Algorithmique et Programmation, IMA

Cours 1 : La compilation

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Informatique III: Programmation en C++

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

TP 1. Prise en main du langage Python

Cours d algorithmique pour la classe de 2nde

Découverte de Python

Les processus légers : threads. Système L3, /31

Gestion mémoire et Représentation intermédiaire

Utilisation d objets : String et ArrayList

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation C++ (débutant)/instructions for, while et do...while

Java Licence Professionnelle CISII,

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Architecture des ordinateurs

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Programmation en Java IUT GEII (MC-II1) 1

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Cours de Programmation 2

Cours d initiation à la programmation en C++ Johann Cuenin

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

PHP. PHP et bases de données

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Derrière toi Une machine virtuelle!

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

TP1 : Initiation à Java et Eclipse

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

KL5121. Pour activer des sorties en fonction de la position d'un codeur

SUPPORT DE COURS. Langage C

1 Recherche en table par balayage

Arbres binaires de recherche

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

I. Introduction aux fonctions : les fonctions standards

Corrigé des exercices sur les références

1. Structure d'un programme FORTRAN 95

PROJET 1 : BASE DE DONNÉES REPARTIES

PROGRAMMER EN MQL4. Apprenez à automatiser vos stratégies sur MetaTrader 4

Bases Java - Eclipse / Netbeans

Exercices INF5171 : série #3 (Automne 2012)

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

A.P.I. Kuka Manuel de l utilisateur Version 0.0.5

Algorithmique I. Algorithmique I p.1/??

Conception de circuits numériques et architecture des ordinateurs

Introduction au PL/SQL Oracle. Alexandre Meslé

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Principes des langages de programmation INF 321. Eric Goubault

2. Comprendre les définitions de classes

INF 321 : mémento de la syntaxe de Java

Plan global Outils de développement et compilation. Plan. Objectifs des outils présentés. IDE, GCC/Clang, ASAN, perf, valgrind, GDB.

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Langage Java. Classe de première SI

Mesure de performances. [Architecture des ordinateurs, Hennessy & Patterson, 1996]

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Programmation par les Objets en Java

Transcription:

L3 informatique et MIAGE Année 2016-2017 Génie logiciel avancé Test de mutations Delphine Longuet delphine.longuet@lri.fr http://www.lri.fr/~longuet/enseignements/16-17/l3-gla

Qualité d'une suite de tests Suite de tests valide Les tests n'échouent que sur des programmes incorrects Pas de faux positif, les fautes trouvées sont réelles Suite de tests complète : Les tests ne réussissent que sur des programmes corrects Pas de faux négatif, si un programme contient une faute, elle est trouvée Validité indispensable, complétude impossible en pratique Comment assurer quand même une certaine qualité des tests? D. Longuet - GLA 2

Mesures de la qualité des tests Critères de couverture fonctionnels : couverture des exigences fonctionnelles couverture des domaines de définition des paramètres et de leurs limites (analyse partitionnelle + test aux limites) couverture des couples de paramètres (test pairwise) Critères de couverture structurels : couverture des méthodes, classes, modules couverture des instructions, des décisions, des boucles couverture des définitions-utilisations de variables D. Longuet - GLA 3

Mesures de la qualité des tests boolean contains(int[] t, int n, int size, int v) { int i = 0; while (i < size) { if (tab[i] == v) { return true; i++; return false; Objectif Données d'entrée t n size v tableau vide [_,_,_,_] 4 0 32 false élément absent [3,1,8,_,_] 5 3 2 false élément présent [4,6,2,9,_] 5 4 6 true Résultat attendu Couverture : toutes les instructions, toutes les décisions, passe 0 et plusieurs fois dans la boucle... Mais ces tests détectent-ils toutes les fautes possibles? D. Longuet - GLA 4

Principe Test de mutations 1. Création d'un ensemble de mutants : application d'un ensemble de modifications syntaxiques (mutations) sur le programme original 2. Exécution des tests sur les mutants 3. Analyse des résultat des tests pour chaque mutant : Échec : mutant tué, donc tests adéquats pour trouver la faute simulée par le mutant Succès : mutant survivant Deux raisons à la survie d'un mutant : Tests incomplets : manque un test qui cible cette faute Mutant équivalent : même comportement du mutant et du programme original D. Longuet - GLA 5

Exemples d'opérateurs de mutation Changer un opérateur arithmétique par un autre Original i + j i++ -i Mutant i j i-- i Changer un opérateur relationnel par un autre Changer un opérateur booléen par un autre Changer une constante par une constante du même type Changer une variable par une variable du même type Changer une variable par une constante du même type i < j a && b i <= j a b int i = 32 int i = 33 int i,j,k; i = j + 1 int i,j; i = j int i,j,k; i = k + 1 int i,j; i = 1 D. Longuet - GLA 6

Mutants Mutation : Modification syntaxique n'empêchant pas la compilation Mutant : Programme obtenu par l'application d'un opérateur de mutation sur le programme original Instruction Mutants if a > 8 then x = y+1 if a >= 8 then x = y+1 if a < 8 then x = y+1 if a > 8 then x = x+1 if a > 8 then x = y-1 if a > 8 then x = 1 Remarque : Très grand nombre de mutants pour un programme D. Longuet - GLA 7

Objectifs : Simuler des fautes classiques Mutants Modifier le comportement du programme Si comportement modifié, un test doit trouver la faute : exécuter une instruction ne suffit pas à la tester, il faut vérifier son impact sur le comportement du programme But du test : Tuer les mutants Score = nb mutants tués / nb mutants D. Longuet - GLA 8

Exemple Programme original P bool contains(int[] t,int n, int size,int v) { int i = 0; while (i < size) { if (tab[i] == v) { return true; i++; return false; Mutant M bool contains(int[] t,int n, int size,int v) { int i = 0; while (i <= size) { if (tab[i] == v) { return true; i++; return false; Objectif Données d'entrée t n size v Résultat attendu P M tableau vide [_,_,_,_] 4 0 32 false élément absent [3,1,8,_,_] 5 3 2 false élément présent [4,6,2,9,_] 5 4 6 true D. Longuet - GLA 9

Exemple Programme original P bool contains(int[] t,int n, int size,int v) { int i = 0; while (i < size) { if (tab[i] == v) { return true; i++; return false; Mutant M bool contains(int[] t,int n, int size,int v) { int i = 0; while (i <= size) { if (tab[i] == v) { return true; i++; return false; Objectif Données d'entrée t n size v Résultat attendu P M tableau vide [_,_,_,_] 4 0 32 false élément absent [3,1,8,_,_] 5 3 2 false élément présent [4,6,2,9,_] 5 4 6 true élément absent et tableau plein [2,9,0,1] 4 4 8 false D. Longuet - GLA 10

Comparaison avec les critères de couverture Opérateurs de mutation instables : mutants obtenus facilement tués par suite de tests couvrant toutes les instructions ou toutes les décisions Remplacer return true par return false Critère toutes les instructions suffit Remplacer if (a < 3 && b = 5) par if (true) Critère toutes les décisions suffit Opérateurs de mutation stables : mutants obtenus survivent aux tests couvrant les instructions et les décisions Mutants intéressants car représentant fautes potentielles non détectées D. Longuet - GLA 11

Comparaison avec les critères de couverture Opérateurs de mutation instables : mutants obtenus facilement tués par suite de tests couvrant toutes les instructions ou toutes les décisions Opérateurs de mutation stables : mutants obtenus survivent aux tests couvrant les instructions et les décisions Mutants intéressants car représentant fautes potentielles non détectées En général, couverture atteinte par élimination des mutants supérieure à celle atteinte par critères structurels classiques (instructions, décisions, conditions multiples, définitions, utilisations...) D. Longuet - GLA 12

En pratique Mutants très nombreux : du même ordre de grandeur que le nombre de lignes du programme original Générer + compiler + tester les mutants : très coûteux en temps et en espace mémoire Exemples d'optimisations : Muter le code compilé Exécuter seulement les tests qui couvrent la ligne mutée Ne pas jouer les tests restants si mutant tué D. Longuet - GLA 13

Mutants équivalents Mutant ne pouvant pas être détecté par un test : mutation non accessible (code mort) mutation équivalente (a < b et a <= b avec a toujours différents de b) mutation d'une ligne sans conséquence (variable jamais utilisée) Mutants équivalents empêchent score 100% Détecter les mutants équivalents : problème indécidable Mais certaines méthodes d'analyse de code permettent d'en repérer certains D. Longuet - GLA 14

Utilisation de la méthode Seule : tuer les mutants devient l'objectif des tests, chaque test est conçu pour tuer un mutant donné. Très coûteux en exécution, et données de test plutôt difficiles à trouver puisque pas liées à un critère strictement structurel Pour mesurer la qualité : Si aucun critère de couverture n'a été vérifié au préalable, peut être très coûteux et demander l'écriture de nombreux tests complémentaires Si suite de tests couvre déjà toutes les instructions au moins, beaucoup de mutants tués facilement et mutants restants intéressants D. Longuet - GLA 15

Avantages : Conclusion Plus puissant que nombre de critères structurels Très bien corrélé à la découverte de fautes Inconvénients : Nécessité d'un très grand nombre de mutants Beaucoup sont tués facilement (environ 90%) Intérêt de la méthode : élimination des 5-15% restants Difficile et coûteux, mais grande qualité des tests générés Utilisation préconisée pour la mesure de qualité D. Longuet - GLA 16

Démo avec CodeCover CodeCover : outil de mesure de couverture de code (codecover.org) Disponible comme plug-in Eclipse 1 : http://update.codecover.org/ Critères de couverture mesurés codecover.org/features/coverage.html Statement coverage : toutes les instructions Branch coverage : toutes les décisions Term coverage : toutes les conditions multiples Loop coverage : tous les chemins passant 0 fois, 1 fois, et plusieurs fois dans les boucles 1 Plus maintenu mais encore fonctionnel sous Eclipse Kepler D. Longuet - GLA 17

Démo avec PIT PIT : outil de test de mutation pour Java (pitest.org) Disponible comme plug-in Eclipse : http://eclipse.pitest.org/release/ Opérateurs de mutation disponibles pitest.org/quickstart/mutators/ Conditionals Boundary Mutator (<, <=, >, >=) Negate Conditionals Mutator (== par!=, < par >=) Math Mutator (+ par -, * par /, % par *) Increments Mutator (i++ par i--) Invert Negatives Mutator (-i par i) Return Values Mutator (mute les valeurs renvoyées dans return) Void Method Calls Mutator (enlève les appels aux méthodes de type void) D. Longuet - GLA 18