free_mutant/README.md

162 lines
6.1 KiB
Markdown
Raw Normal View History

2012-07-26 13:38:17 -04:00
mutant
======
[![Build Status](https://secure.travis-ci.org/mbj/mutant.png?branch=master)](http://travis-ci.org/mbj/mutant)
[![Dependency Status](https://gemnasium.com/mbj/mutant.png)](https://gemnasium.com/mbj/mutant)
2013-02-07 19:40:19 -05:00
[![Code Climate](https://codeclimate.com/github/mbj/mutant.png)](https://codeclimate.com/github/mbj/mutant)
2012-07-26 13:38:17 -04:00
2013-07-21 12:59:13 -04:00
Mutant is a mutation testing tool for ruby.
2012-07-26 13:38:17 -04:00
2013-04-17 23:31:21 -04:00
The idea is that if code can be changed and your tests do not notice, either that code isn't being covered
2012-12-21 14:59:59 -05:00
or it does not have a speced side effect.
A more readable introduction can be found under: http://solnic.eu/2013/01/23/mutation-testing-with-mutant.html
2013-06-25 06:24:12 -04:00
Mutant supports MRI and RBX 1.9 and 2.0, while support for jruby is planned. It should also work under
any ruby engine that supports POSIX-fork(2) semantics.
2012-12-21 14:59:59 -05:00
Only rspec2 is supported currently. This is subject to change.
2013-06-15 11:41:12 -04:00
2013-07-20 17:47:38 -04:00
It is easy to write a mutation killer/strategy for other test/spec frameworks than rspec2.
2013-04-27 09:54:20 -04:00
Projects using Mutant
---------------------
2012-12-21 14:59:59 -05:00
2013-03-09 07:49:29 -05:00
The following projects adopted mutant, and aim 100% mutation coverage:
2012-12-21 14:59:59 -05:00
2013-04-13 04:56:28 -04:00
* [axiom](https://github.com/dkubb/axiom)
* [axiom-types](https://github.com/dkubb/axiom-types)
2013-06-25 10:51:44 -04:00
* [rom-mapper](https://github.com/rom-rb/rom-mapper)
* [rom-session](https://github.com/rom-rb/rom-session)
* [event_bus](https://github.com/kevinrutherford/event_bus)
2012-12-21 14:59:59 -05:00
* [virtus](https://github.com/solnic/virtus)
* [quacky](https://github.com/benmoss/quacky)
* [substation](https://github.com/snusnu/substation)
* [large_binomials](https://github.com/filipvanlaenen/large_binomials)
* [promise.rb](https://github.com/lgierth/promise.rb)
* [full_name](https://github.com/AGILiDEE/full_name)
2012-12-21 14:59:59 -05:00
* various small/minor stuff under https://github.com/mbj
Feel free to ping me to add your project to the list!
2012-07-26 13:38:17 -04:00
Installation
------------
2013-02-27 15:35:51 -05:00
Install the gem `mutant` via your preferred method.
2012-07-26 13:38:17 -04:00
2013-07-03 04:07:23 -04:00
The 0.2 series is stable but has outdated dependencies. The 0.3 series is in beta phase currently.
```ruby
gem install mutant --pre
```
2013-07-21 12:59:13 -04:00
Mutations
---------
2013-07-21 13:31:07 -04:00
Mutant supports a very wide range of mutation operators. Listing them all in detail would blow this document up.
2013-07-21 12:59:13 -04:00
2013-07-21 13:31:07 -04:00
It is planned to parse a list of mutation operators from the source. In the meantime please refer to the
2013-07-22 02:29:17 -04:00
[code](https://github.com/mbj/mutant/tree/master/lib/mutant/mutator/node) each subclass of `Mutant::Mutator::Node`
2013-07-21 12:59:13 -04:00
emits around 3-6 mutations.
2013-07-21 13:31:07 -04:00
Currently mutant covers the majority of ruby's complex nodes that often occur in method bodies.
2013-07-21 12:59:13 -04:00
Some stats from the [axiom](https://github.com/dkubb/axiom) library:
2013-07-21 12:59:13 -04:00
```
Subjects: 424 # Amount of subjects being mutated (currently only methods)
Mutations: 6760 # Amount of mutations mutant generated (~13 mutations per method)
Kills: 6664 # Amount of successfully killed mutations
Runtime: 5123.13s # Total runtime
Killtime: 5092.63s # Time spend killing mutations
Overhead: 0.60%
Coverage: 98.58% # Coverage score
Alive: 96 # Amount of alive mutations.
2013-07-21 12:59:13 -04:00
```
2013-07-22 02:29:17 -04:00
Nodes still missing a dedicated mutator are handled via the
2013-07-21 13:31:07 -04:00
[Generic](https://github.com/mbj/mutant/blob/master/lib/mutant/mutator/node/generic.rb) mutator.
The goal is to remove this mutator and have dedicated mutator for every type of node and removing
the Generic handler altogether.
2013-07-21 12:59:13 -04:00
2012-07-26 13:38:17 -04:00
Examples
--------
2012-12-07 05:52:53 -05:00
```
2012-12-08 09:12:52 -05:00
cd virtus
# Run mutant on virtus namespace
mutant --include lib --require virtus --rspec ::Virtus*
2013-04-17 23:31:21 -04:00
# Run mutant on specific virtus class
mutant --include lib --require virtus --rspec ::Virtus::Attribute
# Run mutant on specific virtus class method
mutant --include lib --require virtus --rspec ::Virtus::Attribute.build
# Run mutant on specific virtus instance method
mutant --include lib --require virtus --rspec ::Virtus::Attribute#type
2012-12-07 05:52:53 -05:00
```
2013-01-23 07:59:03 -05:00
2013-10-30 04:16:07 -04:00
Presentations:
--------------
There are some presentations about mutant in the wild:
* [Eurocamp-2013](http://2013.eurucamp.org/) / FrOSCon-2013 http://slid.es/markusschirp/mutation-testing
* [Cologne.rb](http://www.colognerb.de/topics/mutation-testing-mit-mutant) https://github.com/DonSchado/colognerb-on-mutant/blob/master/mutation_testing_slides.pdf
2013-10-30 04:16:07 -04:00
Subjects:
---------
Mutant currently mutates code in instance and singleton methods. It is planned to support mutation
of constant definitions and domain specific languages, DSL probably as plugins.
Test-Selection
--------------
Mutation testing is slow. The key to making it fast is selecting the correct set of tests to run.
Mutant currently supports the following built-in strategy for selecting tests/specs:
2013-08-04 19:17:14 -04:00
Mutant uses the "longest rspec example group descriptions prefix match" to select the tests to run.
Example for a subject like `Foo::Bar#baz` it will run all example groups with description prefixes in
`Foo::Bar#baz`, `Foo::Bar` and `Foo`. The order is important, so if mutant finds example groups in the
current prefix level, these example groups *must* kill the mutation.
2013-08-04 19:17:14 -04:00
This test selection strategy is compatible with the old `--rspec-dm2` and `--rspec-unit` strategy.
2013-08-04 19:18:04 -04:00
The old flags where removed. It allows to define very fine grained specs, or coarse grained - as you like.
2013-08-04 19:17:14 -04:00
2013-02-27 15:35:51 -05:00
Support
-------
I'm very happy to receive/answer feedback/questions and critism.
Your options:
2013-06-12 15:29:23 -04:00
* GitHub Issues https://github.com/mbj/mutant/issues
2013-04-17 23:31:21 -04:00
* Ping me on https://twitter.com/_m_b_j_
2013-07-30 05:22:02 -04:00
* #mutant channel on freenode, I hang around on CET daytimes. (nick mbj)
2013-07-29 16:06:33 -04:00
You'll also find others [ROM](https://github.com/rom-rb) team members here that can answer questions.
2013-02-27 15:35:51 -05:00
2012-07-26 13:38:17 -04:00
Credits
-------
2013-01-03 17:40:57 -05:00
* [Markus Schirp (mbj)](https://github.com/mbj)
* A [gist](https://gist.github.com/1065789) from [dkubb](https://github.com/dkubb) showing ideas.
2012-12-07 05:55:04 -05:00
* Older abandoned [mutant](https://github.com/txus/mutant). For motivating me doing this one.
* [heckle](https://github.com/seattlerb/heckle). For getting me into mutation testing.
2012-07-26 13:38:17 -04:00
Contributing
-------------
* Fork the project.
* Make your feature addition or bug fix.
* Add tests for it. This is important so I don't break it in a
future version unintentionally.
* Commit, do not mess with Rakefile or version
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
* Send me a pull request. Bonus points for topic branches.
License
-------
2012-12-21 14:59:59 -05:00
See LICENSE file.