6.1Contributions majeures
Les trois contributions majeures de cette thèse s’articulent autour de deux axes complémentaires : la conception testable de systèmes orientés objet par assemblage de composants et la validation des composants et assemblages. Les deux sections suivantes résument ces contributions.
6.1.1Validation de composants
Les chapitres 3 et 4 se sont intéressés à la validation de composants et d’assemblages dans le cadre de la méthode des composants autotestables. Nous avons tout d’abord étudié l’optimisation des cas de test pour un composant, puis la conception par contrat pour la validation d’assemblages de composants.
Au cours du chapitre 3 nous avons proposé une solution pour le problème de la génération et de l’optimisation automatique d’un ensemble de cas de test pour un composant. Nous avons étudié un algorithme génétique pour résoudre ce problème. L’analyse des résultats expérimentaux plutôt décevants nous a conduit à proposer une adaptation de l’algorithme que nous appelons un
algorithme bactériologique. Le développement d’un outil nous a permis d’effectuer plusieurs expériences qui ont confirmé la pertinence de l’approche pour le test d’un composant.
Le chapitre 4 propose une étude de la conception par contrat pour le test d’un système OO. Nous avons analysé l’apport de cette méthode pour deux aspects du test : la détection et la localisation des erreurs. Pour cela, nous avons défini respectivement, les mesures de robustesse et de diagnosabilité pour des systèmes OO conçus par contrat. Ceci nous a ensuite permis d’estimer l’impact de la densité et de la qualité des contrats sur ces deux mesures. Les résultats ont montré que la simple introduction de contrats réduit rapidement l’effort de détection et de localisation des erreurs, et qu’au-delà d’une densité minimale, la qualité des contrats (leur capacité à détecter un état erroné du système) est le facteur le plus important pour renforcer la robustesse et faciliter le diagnostic.
Figure 82 – Processus global pour la conception d’un composant fiableA partir de ces deux études, nous proposons une approche itérative de la conception de composants autotestables. Cette approche consiste à améliorer les trois facettes du composant autotestable, en six étapes (Figure 82) :
une version initiale de l’implantation, des contrats et des cas de test est disponible
une analyse de mutation permet d’améliorer les cas de test. Nous avons étudié deux algorithmes évolutionnistes pour automatiser cette étape.
les cas de test sont exécutés sur l’implantation. Si des erreurs sont détectées, elles doivent être localisées et corrigées. Dans ce cas, il faut revenir à l’étape 1, puisqu’une modification du programme initial, modifie la génération de mutants, et donc la génération de cas de test.
l’efficacité des contrats est mesurée, de nouveau à l’aide d’une analyse de mutation. Cette fois, on n’utilise que les contrats comme oracles pour détecter les mutants. Le score de mutation obtenu correspond à la qualité des contrats.
les contrats sont améliorés si nécessaire.
l’ensemble des cas de test est minimisé, et exécuté sur le composant. L’état du composant est sauvegardé après l’exécution de chaque cas de test, et c’est ce qui sert d’oracle global.
6.1.2Testabilité d’un assemblage de composants
La troisième contribution de cette thèse concerne la testabilité des systèmes orientés objet. Cette étude consiste à prendre en compte l’impact des structures de contrôle particulières engendrées au cours d’un assemblage de composants sur la testabilité des systèmes. En effet, l’utilisation de mécanismes tels que la délégation et le polymorphisme entraîne une forte répartition du contrôle à travers tout le système, et implique des interactions complexes entre les objets du système. Nous avons donc défini un critère de test qui vise à couvrir ces interactions. Associée à ce critère, nous proposons une mesure de complexité, calculable à partir d’un diagramme de classes et qui permet d’évaluer la testabilité d’un assemblage dés la conception. Au cours de cette étude de testabilité, nous avons aussi observé le comportement particulier de l’application des design patterns pour le test. Nous avons montré comment, en forçant une utilisation importante de l’héritage et de la délégation, ils suppriment certains problèmes de testabilité des programmes procéduraux, mais introduisent incidemment d’autres difficultés. Or, ces difficultés peuvent être décelées à partir d’un diagramme de classes et peuvent être évaluées avec le critère de test proposé.