Wodel: a domain-specific language for model mutation

Wodel is a Domain-Specific Language for the specification and generation of model mutants.

Wodel is domain-independent, as it can be used to generate mutants of models conforming to arbitrary meta-models.

Wodel provides nine mutation primitives for object creation and deletion, reference redirection, attribute modification, cloning, and retyping (change the type of an object to one of its siblings types), among others.

The engine verifies that each generated mutant is a valid model (i.e., it conforms to the domain meta-model and satisfies its integrity constraints).

Enhanced mutation features

Wodel includes a mechanism to identify and avoid the generation of duplicated mutants. By default, mutant equivalence is syntactic, but users can provide their own equivalence criteria (e.g., behavioural) through extension points.

The execution of a Wodel program generates a registry of the applied mutations and the objects affected by them.

The IDE provides several metrics that can help in assessing whether a set of mutations is complete or has been correctly implemented.

Also to facilitate the testing of Wodel programs, the IDE permits the automatic synthesis of seed models.

It's development environment is extensible, permitting the incorporation of post-processors for different applications.

To get started, you can access a Wodel tutorial here.

Current Wodel extensions

This repository contains two Wodel extensions: The first consisting in the automated generation of exercises for particular domains (automata, class diagrams, electronic circuits, etc.). We call this extension Wodel-Edu.

This is a sample of a Wodel program that mutates a transition target of a Finite Automaton model:

generate 2 mutants
in "data/out/"
from "data/model/"
metamodel "http://dfaAutomaton/1.0"

with commands {
     modify target tar from one Transition to other State
}
The second extensions consists in the automated generation of mutation testing tools for modelling and programming languages, that we call Wodel-Test.

Wodel usage

You can specify when mutants are going to be generated inside a Wodel program with the blocks directive.

Also, you can mutate mutant models generated in a previous block, instead of mutating the seed models.

Furthermore, you can specify OCL constraints that will apply to generated mutants:

generate mutants
in "data/out/"
from "data/model/exercise1.model"
metamodel "http://dfaAutomaton/1.0"

with blocks {
    first {
         modify target tar from one Transition to other State [3]             
    } [2]
    second from first repeat=no {
         modify one State with { name = random-string(4,6)}
    } [3]
}
constraints {
    context State connected:: "isInitial or Set{self}->
            closure(s | Transition.allInstances()->
            select(t | t.tar=s)->collect(src))->exists(s | s.isInitial)"
}

Video demos

This is a short video demo of the Wodel framework:

Video demo of the Wodel tool mutation operator footprints:

Video demo of the Wodel tool seed model synthesis:

Acknowledgements

This work has been funded by the Spanish Ministry of Science (RTI2018-095255-B-I00, project "MASSIVE") and the R&D programme of Madrid (P2018/TCS-4314, project "FORTE").