• Aucun résultat trouvé

Opérateur de mutation concernant la création:

3.2 Opérateurs de mutation dédiés aux transformations de modèles

3.2.3 Opérateur de mutation concernant la création:

Ces opérateurs sont basés sur deux opérations abstraites : la création des éléments du modèle de sortie et la partie concernant la création pour l’opération de modification du modèle d'entrée.

a- Remplacement de la création d’une classe par une autre compatible (RCCC) :

Cet opérateur remplace la création d’un objet par la création d’un objet d’un type compatible. Il peut s’agir d’une instance d’une classe fille, d’une classe parente ou d’une classe

RCCC : Si une opération de la transformation crée un objet

δ

instance d’une classe C, si il existe une classe F tel que F et C appartiennent au même arbre d’héritage, alors la création de

δ

est remplacée par la création d’une instance de F. Tous les remplacements possibles sont effectués, chacun produisant un mutant.

P

de

hérite

C

ou

P

C

et

P

de

hérite

F

ou

P

F

que

telle

classe

une

P

si

seulement

et

si

héritage

d

arbre

même

au

ent

appartienn

C

et

F

classes

Les

=

=

'

Par exemple, si l’expression OCL let est utilisée pour illustrer la création d’un objet : Opération de création originale Opération de création mutante

let unObjet : Classifier let unObjet : Class let unObjet : Class let unObjet : Classifier

let unObjet : Class let unObjet : PrimitiveDataType

Tableau 3-8- Exemples d'application de RCCC

Cet opérateur est pertinent parce que la mauvaise classe créée et la bonne ont des propriétés héritées communes (relations, méthodes et attributs), donc le reste de la transformation peut être affecté tout en se poursuivant.

L’opérateur contraire qui consisterait à supprimer la création d’un objet a peu de sens. En effet, un objet créé est ensuite forcément utilisé. Il sera contenu par un autre objet, conteneur d’autres objets ou mis en relation avec d’autres objets. Ainsi l’absence de sa création serait systématiquement constatée dans la suite du développement ou dès la mise au point de la transformation de modèle. S’il est imaginable que son utilisation soit aussi absente par erreur, alors l’hypothèse du programmeur compétent n’est plus satisfaite et le cadre d’utilisation de l’analyse de mutation est dépassé.

b- Modification d’une mise en relation de classes avec retrait (MMRR) :

Cet opérateur supprime la création d’une association entre deux instances.

MMRR : Si une opération de la transformation affecte une relation

δ

entre une instance d’une classe C et une instance d’une classe D,

δ

étant une relation définie de C vers D, alors l’affectation est supprimée. Chaque suppression possible est effectuée, chacune produisant un mutant.

Par exemple, si uneClass, uneautreClass, uneTable, et uneColumn sont respectivement des instances de Class, Table, et Column :

Opération de création originale Opération de création mutante

uneClass.parent = uneautreClass //instruction supprimée

uneTable.cols.add(uneColumn) //instruction supprimée

Tableau 3-9- Exemples d'application de MMRR

Si l’affectation non créée concerne une relation définie avec une cardinalité 1 (ou une autre supérieure fixée) alors son absence peut affecter le reste de la transformation. En effet, il est probable qu’à un moment de la transformation cette affectation soit attendue pour être utilisée.

61 Opérateurs de mutation dédiés aux transformations de modèles

En revanche, si la cardinalité est n alors l’utilisation de l’ensemble reviendrait à naviguer la relation en obtenant un élément de moins ce qui n’est pas bloquant pour la poursuite de la transformation. Par exemple, un modèle peut avoir une instance de Table connectée à plusieurs instances de Column par la relation cols. Si une relation n’est pas créée, la navigation

aTable.cols retournera juste une collection privée d’un élément, sans conséquence systématiquement détectable.

c- Modification d’une mise en relation de classes avec ajout (MRCA) :

Cet opérateur ajoute une création inutile d’une relation entre deux instances existant dans modèle de sortie, quand le méta-modèle le permet.

MRCA : Si au cours de la transformation, deux instances a et b de classes A et B (pouvant être une même classe) sont disponibles et s’il existe une relation

δ

définie de A vers B, alors la relation

δ

est affectée entre a et b. Toutes les relations définies entre des classes dont des instances sont disponibles sont affectées, chaque création d’affectation produisant un mutant.

Par exemple, si uneClass, uneautreClass, uneTable, et uneColumn sont respectivement des instances de Class, Table, et Column :

Opération de création originale Opération de création mutante

let uneColumn : Column let uneautreColumn : Column let uneTable : Table

uneTable.cols.add(uneColumn)

let uneColumn : Column let uneautreColumn : Column let uneTable : Table

uneTable.cols.add(uneColumn) uneTable.cols.add(uneautreColumn)

let uneClass : Class let uneautreClass : Class

let uneAssociation : Association uneAssociation.src=uneClass

let uneClass : Class let uneautreClass : Class

let uneAssociation : Association uneAssociation.src =uneClass uneAssociation.src = uneautreClass

//l’écrasement ne pose pas problème

Tableau 3-10- Exemples d'application de MRCA

Dans notre exemple, le méta-modèle de Class (figure 2-7) permet deux relations différentes entre une instance de Class et une autre (parent, children). Si une seule instance de Class

existe alors deux mutants peuvent être créés, même si une telle relation existe déjà (la relation peut alors être écrasée).

Les erreurs injectées par cet opérateur ne sont pas systématiquement détectées en bloquant le déroulement de la transformation : des collections vont simplement avoir un élément supplémentaire, et les relations de cardinalité 1 seront simplement créées ou écrasées.

opération abstraite

opérateur

de mutation altération réalisée

RRMC Remplacement d’une relation vers une même classe RRAC Remplacement d’une relation vers une autre classe

MSNM Modification d’une succession de navigation avec manque navigation

MSNA Modification d’une succession de navigation avec ajout MFCP Modification du filtrage d’une collection avec perturbation MFCM Modification du filtrage d’une collection avec manque filtrage

MFCA Modification du filtrage d’une collection avec ajout

RCCC Remplacement de la création d’une classe par une autre compatible MMRR Modification d’une mise en relation de classes avec retrait

création

MRCA Modification d’une mise en relation de classes avec ajout

Tableau 3-11 - Liste des dix opérateurs de mutation proposés

Pour conclure sur ces opérateurs : toutes ces erreurs sont directement liées à la manière dont nous définissons les transformations de modèles qui sont divisées en quatre opérations abstraites (navigation, filtrage, création, modification). Ces opérateurs permettent de générer des mutants viables avec des erreurs pertinentes pour améliorer la valeur de l’analyse de mutation. Cela permet alors d’améliorer la capacité de l’ensemble de modèles de test à détecter les erreurs du programmeur. Le tableau 3-11 synthétise tous ces nouveaux opérateurs.