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.