SlideShare a Scribd company logo
1 of 56
Download to read offline
PIT: state of the art of mutation testing system
MUTANTS KILLER
by Tàrin Gamberìni - CC BY-NC-SA 4.0
Lavora da sempre con tecnologie
Java-based free e Open Source
presso la Regione Emilia-Romagna
Si interessa di Object Oriented Design,
Design Patterns, Build Automation,
Testing e Continuous Integration
TÀRIN GAMBERÌNI
Partecipa attivamente
al Java User Group
Padova
Unit Testing
Test-Driven
Development (TDD)
Continuous Integration
Code Coverage
Mutation Testing
DEVELOPMENT
UNIT TESTING & TDD
The proof of working code
Refactor with confidence (regression)
Improve code design
Living documentation
TDD extremely valuable in some context
CONTINUOUS INTEGRATION
Maintain a single source repository
Automate the build
Cheap statics for code quality
Automate unit & integration tests
Catch problems fast
LINE COVERAGE
Is a measure of tested source code
line, statement, branch, … , coverage
LINE COVERAGE 100%
Only able to identify not tested code
Doesn't check tests are able to detect faults
Measures only which code is executed by tests
WEAK TESTS
public static String foo( boolean b ) {
if ( b ) {
performVitallyImportantBusinessFunction();
return "OK";
}
return "FAIL";
}
@Test
public void shouldFailWhenGivenFalse() {
assertEquals("FAIL", foo( false ));
}
@Test
public void shouldBeOkWhenGivenTrue() {
assertEquals("OK", foo( true ));
}
The untested side effect
WEAK TESTS
public static String foo( boolean b ) {
if ( b ) {
performVitallyImportantBusinessFunction();
return "OK";
}
return "FAIL";
}
@Test
public void shouldFailWhenGivenFalse() {
assertEquals("FAIL", foo( false ));
}
@Test
public void shouldBeOkWhenGivenTrue() {
assertEquals("OK", foo( true ));
}
The untested side effect
WEAK TESTS
public static String foo( int i ) {
if ( i >= 0 ) {
return "foo";
} else {
return "bar";
}
}
@Test
public void shouldReturnBarWhenGiven1() {
assertEquals("bar", foo( 1 ));
}
@Test
public void shouldReturnFooWhenGivenMinus1() {
assertEquals("foo", foo( -1 ));
}
The missing boundary test
WEAK TESTS
public static String foo( int i ) {
if ( i >= 0 ) {
return "foo";
} else {
return "bar";
}
}
@Test
public void shouldReturnBarWhenGiven1() {
assertEquals("bar", foo( 1 ));
}
@Test
public void shouldReturnFooWhenGivenZero() {
assertEquals("foo", foo( 0 ));
}
@Test
public void shouldReturnFooWhenGivenMinus1() {
assertEquals("foo", foo( -1 ));
}
The missing boundary test
WEAK TESTS
public static String foo(Collaborator c, boolean b) {
if ( b ) {
return c.performAction();
}
return "FOO";
} @Test
public void shouldPerformActionWhenGivenTrue() {
foo(mockCollaborator,true);
verify(mockCollaborator).performAction();
}
@Test
public void shouldNotPerformActionWhenGivenFalse() {
foo(mockCollaborator,false);
verify(never(),mockCollaborator).performAction();
}
The myopic mockist
WEAK TESTS
public static String foo(Collaborator c, boolean b) {
if ( b ) {
return c.performAction();
}
return "FOO";
} @Test
public void shouldPerformActionWhenGivenTrue() {
String result = foo(mockCollaborator,true);
verify(mockCollaborator).performAction();
assertEquals("MOCK", result);
}
@Test
public void shouldNotPerformActionWhenGivenFalse() {
String result = foo(mockCollaborator,false);
verify(never(),mockCollaborator).performAction();
assertEquals("FOO", result);
}
The myopic mockist
WHO TESTS THE TESTS ?
MUTATION TESTING
●
originally proposed by Richard Lipton as a
student in 1971
●
1st implementation tool was a PhD work
in 1980
●
recent availability of massive computing
power has led to a resurgence
●
expose weaknesses in tests (quality)
MUTATION TESTING
●
originally proposed by Richard Lipton as a
student in 1971
●
1st implementation tool was a PhD work
in 1980
●
recent availability of massive computing
power has led to a resurgence
●
expose weaknesses in tests (quality)
MUTATION
Is a small change in your program
MUTANT
A
mutated
version of
your
program
MUTATION TESTING
generate lots of
mutants
run all tests against all mutants
check mutants:
killed or lived?
MUTANT KILLED
Proof of detected mutated code
Test is testing source code properly
If the unit test fails
MUTANT LIVED
Proof of not detected mutated code
If the unit test succeed
Test isn't testing source code
PIT: BASIC CONCEPTS
Applies a configurable set of mutators
Generates reports with test results
Manipulates the byte code generated
by compiling your code
PIT: MUTATORS
Conditionals Boundary
< → <=
<= → <
> → >=
>= → >
PIT: MUTATORS
Negate Conditionals
== → !=
!= → ==
<= → >
>= → <
< → >=
> → <=
PIT: MUTATORS
Math Mutator
+ → -
- → +
* → /
/ → *
% → *
& → |
| → &
^ → &
<< → >>
>> → <<
>>> → <<
PIT: MUTATORS
Remove Conditionals
if (a == b) {
// do something
}
if (true) {
// do something
}
→
PIT: MUTATORS
Void Method Call Mutator
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void
doSomething(int i) {
// does something
}
→
public int foo() {
int i = 5;
return i;
}
public void
doSomething(int i) {
// does something
}
PIT: MUTATORS
Many others
Activated by default
Conditionals Boundary Mutator - Increments Mutator -
Invert Negatives Mutator - Math Mutator - Negate
Conditionals Mutator - Return Values Mutator - Void
Method Calls Mutator
Deactivated by default
Constructor Calls Mutator - Inline Constant Mutator - Non
Void Method Calls Mutator - Remove Conditionals Mutator
- Experimental Member Variable Mutator - Experimental
Switch Mutator
HOW PIT WORKS
Running the tests
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
Your program
HOW PIT WORKS
Running the tests
PIT runs traditional line coverage analysis
HOW PIT WORKS
Running the tests
Generates mutant by applaying mutators
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
mutant 2
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
mutant 1
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
mutant 3
HOW PIT WORKS
Brute force
x = 9
100 tests x 1.2ms = 0.12s
100 tests x 1.2ms x 10000 mutants = 20min !!!
1000 class x 10 mutants per class = 10000 mutants
HOW PIT WORKS
Running the tests
PIT leverages line coverage to discard tests
that do not exercise the mutated line of code
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
public int foo() {
int i = 5;
doSomething(i);
return i;
}
public void doSomething(int i) {
// does something
}
mutant 3
HOW PIT WORKS
Extremely fast
x = 1
x = 1
x = 2 4 < 9
HOW PIT WORKS
Outcomes
● Killed, Lived
● No coverage: the same as Lived except there were no
tests that exercised the mutated line of code
● Non viable: bytecode was in some way invalid
● Timed Out: infinite loop
● Memory error: mutation that increases the amount of
memory used
● Run error: a large number of run errors probably
means something went wrong
PIT ECOSYSTEM
Tools
Command line
Other IDEs as a
Java application
( )
EXAMPLE: LINUXDAY2015
class Ticket
EXAMPLE: LINUXDAY2015
testGetPrice_withAge11
EXAMPLE: LINUXDAY2015
testGetPrice_withAge71
EXAMPLE: LINUXDAY2015
testGetPrice_withAge18
EXAMPLE: LINUXDAY2015
mvn org.pitest:pitest-maven:mutationCoverage
>> Generated 8 mutations Killed 6 (75%)
>> Ran 11 tests (1.38 tests per mutation)
=================================================================
- Mutators
=================================================================
> org.pitest...ConditionalsBoundaryMutator
>> Generated 2 Killed 0 (0%)
> KILLED 0 SURVIVED 2 TIMED_OUT 0 NON_VIABLE 0
> MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0
> NO_COVERAGE 0
-----------------------------------------------------------------
> org.pitest...ReturnValsMutator
>> Generated 3 Killed 3 (100%)
> KILLED 3 SURVIVED 0 TIMED_OUT 0 NON_VIABLE 0
> MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0
> NO_COVERAGE 0
EXAMPLE: LINUXDAY2015
EXAMPLE: LINUXDAY2015
EXAMPLE: LINUXDAY2015
testGetPrice_withAge12
EXAMPLE: LINUXDAY2015
mvn org.pitest:pitest-maven:mutationCoverage
>> Generated 8 mutations Killed 7 (88%)
>> Ran 10 tests (1.25 tests per mutation)
=================================================================
- Mutators
=================================================================
> org.pitest...ConditionalsBoundaryMutator
>> Generated 2 Killed 1 (50%)
> KILLED 1 SURVIVED 1 TIMED_OUT 0 NON_VIABLE 0
> MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0
> NO_COVERAGE 0
-----------------------------------------------------------------
> org.pitest...ReturnValsMutator
>> Generated 3 Killed 3 (100%)
> KILLED 3 SURVIVED 0 TIMED_OUT 0 NON_VIABLE 0
> MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0
> NO_COVERAGE 0
EXAMPLE: LINUXDAY2015
EXAMPLE: LINUXDAY2015
EXAMPLE: LINUXDAY2015
testGetPrice_withAge70
EXAMPLE: LINUXDAY2015
?!?!?!?!?
EXAMPLE: LINUXDAY2015
testGetPrice_withAge70
EXAMPLE: LINUXDAY2015
source code on GitHub
https://github.com/taringamberini/linuxday2015.git
QUESTIONS ?
CONTACTS
Tàrin Gamberìni
tarin.gamberini@jugpadova.it
www.taringamberini.com
CREDITS
Minion with gun - by jpartwork (no license available)
https://nanookofthenerd.wordpress.com/2015/01/30/the-magnificent-maddening-marvelous-
minion-episode-032/
Minion Hands on - by Ceb1031 (CC BY-SA 3.0)
http://parody.wikia.com/wiki/File:Bob_minions_hands.jpg
Canon XTi components after disassembly - by particlem (CC BY 2.0)
https://www.flickr.com/photos/particlem/3860278043/
Continuous Integration - by New Media Labs (no license available)
http://newmedialabs.co.za/approach
Rally car - by mmphotography.it (CC BY-NC 2.0)
https://www.flickr.com/photos/grantuking/9705677549/
Crash Test dummies for sale - by Jack French (CC BY-NC 2.0)
https://www.flickr.com/photos/jackfrench/34523572/
Minion (no license available)
http://thisandthatforkidsblog.com/2013/09/17/easy-to-make-diy-minion-halloween-pumpkin/
Images
Mutant - by minions fans-d6txvph.jpg (no license available)
http://despicableme.wikia.com/wiki/File:Evil_minions_by_minions_fans-d6txvph.jpg
Mutant killed - by Patricia Uribe (no license available)
http://weheartit.com/entry/70334753
Mutant lived - by Carlos Hernández (no license available)
https://gifcept.com/VUQrTOr.gif
PIT logo - by Ling Yeung (CC BY-NC-SA 3.0)
http://pitest.org/about/
Circled Minions - by HARDEEP BHOGAL - (no license available)
https://plus.google.com/109649247879792393053/posts/ghH6tiuUZni?
pid=6004685782480998482&oid=109649247879792393053
Finger puppets – by Gary Leeming (CC BY-NC-SA 2.0)
https://www.flickr.com/photos/grazulis/4754781005/
Questions - by Shinichi Izumi (CC BY-SA)
http://despicableme.wikia.com/wiki/File:Purple_Minion.png
CREDITS
Images

More Related Content

Viewers also liked

MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system Tarin Gamberini
 
Commit messages - Good practices
Commit messages - Good practicesCommit messages - Good practices
Commit messages - Good practicesTarin Gamberini
 
Mutation Testing with PIT (Booster 2014, 2014-MAR-13)
Mutation Testing with PIT (Booster 2014, 2014-MAR-13)Mutation Testing with PIT (Booster 2014, 2014-MAR-13)
Mutation Testing with PIT (Booster 2014, 2014-MAR-13)Filip Van Laenen
 
أخطاء برمجية | programming errors
أخطاء برمجية | programming errorsأخطاء برمجية | programming errors
أخطاء برمجية | programming errorsnawal saad
 
Igor Popov: Mutation Testing at I T.A.K.E. Unconference 2015
Igor Popov: Mutation Testing at I T.A.K.E. Unconference 2015Igor Popov: Mutation Testing at I T.A.K.E. Unconference 2015
Igor Popov: Mutation Testing at I T.A.K.E. Unconference 2015Mozaic Works
 
Mutation Testing
Mutation TestingMutation Testing
Mutation TestingESUG
 
Kill the mutants - A better way to test your tests
Kill the mutants - A better way to test your testsKill the mutants - A better way to test your tests
Kill the mutants - A better way to test your testsRoy van Rijn
 
Resources for veterans and career professionals
Resources for veterans and career professionalsResources for veterans and career professionals
Resources for veterans and career professionalsAmy Armstrong
 
JS-resume final
JS-resume finalJS-resume final
JS-resume finalJuan Silva
 
Entertainment on the pier
Entertainment on the pierEntertainment on the pier
Entertainment on the pier1066heritage
 
XMPP Hands-On
XMPP Hands-OnXMPP Hands-On
XMPP Hands-Oncodebits
 
Boletin aprender a aprender
Boletin aprender a aprenderBoletin aprender a aprender
Boletin aprender a aprenderLUISA1LEON
 
Máximos Goleadores de la historia
Máximos Goleadores de la historiaMáximos Goleadores de la historia
Máximos Goleadores de la historiajaimejcidead
 
фольклорні балади про робін гуда
фольклорні балади про робін гудафольклорні балади про робін гуда
фольклорні балади про робін гудаSnezhana Pshenichnaya
 
Entrevista a Mia Couto
Entrevista a Mia CoutoEntrevista a Mia Couto
Entrevista a Mia CoutoSandra Branco
 

Viewers also liked (20)

MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
 
Commit messages - Good practices
Commit messages - Good practicesCommit messages - Good practices
Commit messages - Good practices
 
Apache Maven
Apache MavenApache Maven
Apache Maven
 
Mutation Testing with PIT (Booster 2014, 2014-MAR-13)
Mutation Testing with PIT (Booster 2014, 2014-MAR-13)Mutation Testing with PIT (Booster 2014, 2014-MAR-13)
Mutation Testing with PIT (Booster 2014, 2014-MAR-13)
 
أخطاء برمجية | programming errors
أخطاء برمجية | programming errorsأخطاء برمجية | programming errors
أخطاء برمجية | programming errors
 
Igor Popov: Mutation Testing at I T.A.K.E. Unconference 2015
Igor Popov: Mutation Testing at I T.A.K.E. Unconference 2015Igor Popov: Mutation Testing at I T.A.K.E. Unconference 2015
Igor Popov: Mutation Testing at I T.A.K.E. Unconference 2015
 
Mutation testing
Mutation testingMutation testing
Mutation testing
 
Mutation testing in Java
Mutation testing in JavaMutation testing in Java
Mutation testing in Java
 
Mutation Testing
Mutation TestingMutation Testing
Mutation Testing
 
تحليل النظم
تحليل النظمتحليل النظم
تحليل النظم
 
Kill the mutants - A better way to test your tests
Kill the mutants - A better way to test your testsKill the mutants - A better way to test your tests
Kill the mutants - A better way to test your tests
 
Resources for veterans and career professionals
Resources for veterans and career professionalsResources for veterans and career professionals
Resources for veterans and career professionals
 
JS-resume final
JS-resume finalJS-resume final
JS-resume final
 
Entertainment on the pier
Entertainment on the pierEntertainment on the pier
Entertainment on the pier
 
XMPP Hands-On
XMPP Hands-OnXMPP Hands-On
XMPP Hands-On
 
Promising Practices for Students Transitioning to Independent Schools
Promising Practices for Students Transitioning to Independent SchoolsPromising Practices for Students Transitioning to Independent Schools
Promising Practices for Students Transitioning to Independent Schools
 
Boletin aprender a aprender
Boletin aprender a aprenderBoletin aprender a aprender
Boletin aprender a aprender
 
Máximos Goleadores de la historia
Máximos Goleadores de la historiaMáximos Goleadores de la historia
Máximos Goleadores de la historia
 
фольклорні балади про робін гуда
фольклорні балади про робін гудафольклорні балади про робін гуда
фольклорні балади про робін гуда
 
Entrevista a Mia Couto
Entrevista a Mia CoutoEntrevista a Mia Couto
Entrevista a Mia Couto
 

Similar to MUTANTS KILLER - PIT: state of the art of mutation testing system

Kill the mutants and test your tests - Roy van Rijn
Kill the mutants and test your tests - Roy van RijnKill the mutants and test your tests - Roy van Rijn
Kill the mutants and test your tests - Roy van RijnNLJUG
 
Must.Kill.Mutants. Agile Testing Days 2017
Must.Kill.Mutants. Agile Testing Days 2017Must.Kill.Mutants. Agile Testing Days 2017
Must.Kill.Mutants. Agile Testing Days 2017Gerald Muecke
 
Must.kill.mutants. TopConf Tallinn 2016
Must.kill.mutants. TopConf Tallinn 2016Must.kill.mutants. TopConf Tallinn 2016
Must.kill.mutants. TopConf Tallinn 2016Gerald Muecke
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFXHendrik Ebbers
 
Google test training
Google test trainingGoogle test training
Google test trainingThierry Gayet
 
Никита Галкин "Testing in Frontend World"
Никита Галкин "Testing in Frontend World"Никита Галкин "Testing in Frontend World"
Никита Галкин "Testing in Frontend World"Fwdays
 
Unit Testing with JUnit4 by Ravikiran Janardhana
Unit Testing with JUnit4 by Ravikiran JanardhanaUnit Testing with JUnit4 by Ravikiran Janardhana
Unit Testing with JUnit4 by Ravikiran JanardhanaRavikiran J
 
Testes? Mas isso não aumenta o tempo de projecto? Não quero...
Testes? Mas isso não aumenta o tempo de projecto? Não quero...Testes? Mas isso não aumenta o tempo de projecto? Não quero...
Testes? Mas isso não aumenta o tempo de projecto? Não quero...Comunidade NetPonto
 
31b - JUnit and Mockito.pdf
31b - JUnit and Mockito.pdf31b - JUnit and Mockito.pdf
31b - JUnit and Mockito.pdfgauravavam
 
Do I need tests when I have the compiler - Andrzej Jóźwiak - TomTom Dev Day 2020
Do I need tests when I have the compiler - Andrzej Jóźwiak - TomTom Dev Day 2020Do I need tests when I have the compiler - Andrzej Jóźwiak - TomTom Dev Day 2020
Do I need tests when I have the compiler - Andrzej Jóźwiak - TomTom Dev Day 2020Andrzej Jóźwiak
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestSeb Rose
 
DSR Testing (Part 1)
DSR Testing (Part 1)DSR Testing (Part 1)
DSR Testing (Part 1)Steve Upton
 
Java Unit Testing Tool Competition — Fifth Round
Java Unit Testing Tool Competition — Fifth RoundJava Unit Testing Tool Competition — Fifth Round
Java Unit Testing Tool Competition — Fifth RoundAnnibale Panichella
 
Don't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksDon't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksVictor Rentea
 
Wix Automation - The False Positive Paradox
Wix Automation - The False Positive ParadoxWix Automation - The False Positive Paradox
Wix Automation - The False Positive ParadoxEfrat Attas
 
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...GlobalLogic Ukraine
 
TDD And Refactoring
TDD And RefactoringTDD And Refactoring
TDD And RefactoringNaresh Jain
 

Similar to MUTANTS KILLER - PIT: state of the art of mutation testing system (20)

Test driven development
Test driven developmentTest driven development
Test driven development
 
Kill the mutants and test your tests - Roy van Rijn
Kill the mutants and test your tests - Roy van RijnKill the mutants and test your tests - Roy van Rijn
Kill the mutants and test your tests - Roy van Rijn
 
Must.Kill.Mutants. Agile Testing Days 2017
Must.Kill.Mutants. Agile Testing Days 2017Must.Kill.Mutants. Agile Testing Days 2017
Must.Kill.Mutants. Agile Testing Days 2017
 
Must.kill.mutants. TopConf Tallinn 2016
Must.kill.mutants. TopConf Tallinn 2016Must.kill.mutants. TopConf Tallinn 2016
Must.kill.mutants. TopConf Tallinn 2016
 
Unit testing - A&BP CC
Unit testing - A&BP CCUnit testing - A&BP CC
Unit testing - A&BP CC
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFX
 
Google test training
Google test trainingGoogle test training
Google test training
 
Никита Галкин "Testing in Frontend World"
Никита Галкин "Testing in Frontend World"Никита Галкин "Testing in Frontend World"
Никита Галкин "Testing in Frontend World"
 
Unit Testing with JUnit4 by Ravikiran Janardhana
Unit Testing with JUnit4 by Ravikiran JanardhanaUnit Testing with JUnit4 by Ravikiran Janardhana
Unit Testing with JUnit4 by Ravikiran Janardhana
 
Testes? Mas isso não aumenta o tempo de projecto? Não quero...
Testes? Mas isso não aumenta o tempo de projecto? Não quero...Testes? Mas isso não aumenta o tempo de projecto? Não quero...
Testes? Mas isso não aumenta o tempo de projecto? Não quero...
 
31b - JUnit and Mockito.pdf
31b - JUnit and Mockito.pdf31b - JUnit and Mockito.pdf
31b - JUnit and Mockito.pdf
 
Do I need tests when I have the compiler - Andrzej Jóźwiak - TomTom Dev Day 2020
Do I need tests when I have the compiler - Andrzej Jóźwiak - TomTom Dev Day 2020Do I need tests when I have the compiler - Andrzej Jóźwiak - TomTom Dev Day 2020
Do I need tests when I have the compiler - Andrzej Jóźwiak - TomTom Dev Day 2020
 
Advanced Java Testing
Advanced Java TestingAdvanced Java Testing
Advanced Java Testing
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under Test
 
DSR Testing (Part 1)
DSR Testing (Part 1)DSR Testing (Part 1)
DSR Testing (Part 1)
 
Java Unit Testing Tool Competition — Fifth Round
Java Unit Testing Tool Competition — Fifth RoundJava Unit Testing Tool Competition — Fifth Round
Java Unit Testing Tool Competition — Fifth Round
 
Don't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksDon't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using Mocks
 
Wix Automation - The False Positive Paradox
Wix Automation - The False Positive ParadoxWix Automation - The False Positive Paradox
Wix Automation - The False Positive Paradox
 
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
 
TDD And Refactoring
TDD And RefactoringTDD And Refactoring
TDD And Refactoring
 

Recently uploaded

Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 

Recently uploaded (20)

Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 

MUTANTS KILLER - PIT: state of the art of mutation testing system

  • 1. PIT: state of the art of mutation testing system MUTANTS KILLER by Tàrin Gamberìni - CC BY-NC-SA 4.0
  • 2. Lavora da sempre con tecnologie Java-based free e Open Source presso la Regione Emilia-Romagna Si interessa di Object Oriented Design, Design Patterns, Build Automation, Testing e Continuous Integration TÀRIN GAMBERÌNI Partecipa attivamente al Java User Group Padova
  • 3. Unit Testing Test-Driven Development (TDD) Continuous Integration Code Coverage Mutation Testing DEVELOPMENT
  • 4. UNIT TESTING & TDD The proof of working code Refactor with confidence (regression) Improve code design Living documentation TDD extremely valuable in some context
  • 5. CONTINUOUS INTEGRATION Maintain a single source repository Automate the build Cheap statics for code quality Automate unit & integration tests Catch problems fast
  • 6. LINE COVERAGE Is a measure of tested source code line, statement, branch, … , coverage
  • 7. LINE COVERAGE 100% Only able to identify not tested code Doesn't check tests are able to detect faults Measures only which code is executed by tests
  • 8. WEAK TESTS public static String foo( boolean b ) { if ( b ) { performVitallyImportantBusinessFunction(); return "OK"; } return "FAIL"; } @Test public void shouldFailWhenGivenFalse() { assertEquals("FAIL", foo( false )); } @Test public void shouldBeOkWhenGivenTrue() { assertEquals("OK", foo( true )); } The untested side effect
  • 9. WEAK TESTS public static String foo( boolean b ) { if ( b ) { performVitallyImportantBusinessFunction(); return "OK"; } return "FAIL"; } @Test public void shouldFailWhenGivenFalse() { assertEquals("FAIL", foo( false )); } @Test public void shouldBeOkWhenGivenTrue() { assertEquals("OK", foo( true )); } The untested side effect
  • 10. WEAK TESTS public static String foo( int i ) { if ( i >= 0 ) { return "foo"; } else { return "bar"; } } @Test public void shouldReturnBarWhenGiven1() { assertEquals("bar", foo( 1 )); } @Test public void shouldReturnFooWhenGivenMinus1() { assertEquals("foo", foo( -1 )); } The missing boundary test
  • 11. WEAK TESTS public static String foo( int i ) { if ( i >= 0 ) { return "foo"; } else { return "bar"; } } @Test public void shouldReturnBarWhenGiven1() { assertEquals("bar", foo( 1 )); } @Test public void shouldReturnFooWhenGivenZero() { assertEquals("foo", foo( 0 )); } @Test public void shouldReturnFooWhenGivenMinus1() { assertEquals("foo", foo( -1 )); } The missing boundary test
  • 12. WEAK TESTS public static String foo(Collaborator c, boolean b) { if ( b ) { return c.performAction(); } return "FOO"; } @Test public void shouldPerformActionWhenGivenTrue() { foo(mockCollaborator,true); verify(mockCollaborator).performAction(); } @Test public void shouldNotPerformActionWhenGivenFalse() { foo(mockCollaborator,false); verify(never(),mockCollaborator).performAction(); } The myopic mockist
  • 13. WEAK TESTS public static String foo(Collaborator c, boolean b) { if ( b ) { return c.performAction(); } return "FOO"; } @Test public void shouldPerformActionWhenGivenTrue() { String result = foo(mockCollaborator,true); verify(mockCollaborator).performAction(); assertEquals("MOCK", result); } @Test public void shouldNotPerformActionWhenGivenFalse() { String result = foo(mockCollaborator,false); verify(never(),mockCollaborator).performAction(); assertEquals("FOO", result); } The myopic mockist
  • 14. WHO TESTS THE TESTS ?
  • 15. MUTATION TESTING ● originally proposed by Richard Lipton as a student in 1971 ● 1st implementation tool was a PhD work in 1980 ● recent availability of massive computing power has led to a resurgence ● expose weaknesses in tests (quality)
  • 16. MUTATION TESTING ● originally proposed by Richard Lipton as a student in 1971 ● 1st implementation tool was a PhD work in 1980 ● recent availability of massive computing power has led to a resurgence ● expose weaknesses in tests (quality)
  • 17. MUTATION Is a small change in your program
  • 19. MUTATION TESTING generate lots of mutants run all tests against all mutants check mutants: killed or lived?
  • 20. MUTANT KILLED Proof of detected mutated code Test is testing source code properly If the unit test fails
  • 21. MUTANT LIVED Proof of not detected mutated code If the unit test succeed Test isn't testing source code
  • 22.
  • 23. PIT: BASIC CONCEPTS Applies a configurable set of mutators Generates reports with test results Manipulates the byte code generated by compiling your code
  • 24. PIT: MUTATORS Conditionals Boundary < → <= <= → < > → >= >= → >
  • 25. PIT: MUTATORS Negate Conditionals == → != != → == <= → > >= → < < → >= > → <=
  • 26. PIT: MUTATORS Math Mutator + → - - → + * → / / → * % → * & → | | → & ^ → & << → >> >> → << >>> → <<
  • 27. PIT: MUTATORS Remove Conditionals if (a == b) { // do something } if (true) { // do something } →
  • 28. PIT: MUTATORS Void Method Call Mutator public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } → public int foo() { int i = 5; return i; } public void doSomething(int i) { // does something }
  • 29. PIT: MUTATORS Many others Activated by default Conditionals Boundary Mutator - Increments Mutator - Invert Negatives Mutator - Math Mutator - Negate Conditionals Mutator - Return Values Mutator - Void Method Calls Mutator Deactivated by default Constructor Calls Mutator - Inline Constant Mutator - Non Void Method Calls Mutator - Remove Conditionals Mutator - Experimental Member Variable Mutator - Experimental Switch Mutator
  • 30. HOW PIT WORKS Running the tests public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } Your program
  • 31. HOW PIT WORKS Running the tests PIT runs traditional line coverage analysis
  • 32. HOW PIT WORKS Running the tests Generates mutant by applaying mutators public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } mutant 2 public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } mutant 1 public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } mutant 3
  • 33. HOW PIT WORKS Brute force x = 9 100 tests x 1.2ms = 0.12s 100 tests x 1.2ms x 10000 mutants = 20min !!! 1000 class x 10 mutants per class = 10000 mutants
  • 34. HOW PIT WORKS Running the tests PIT leverages line coverage to discard tests that do not exercise the mutated line of code public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } public int foo() { int i = 5; doSomething(i); return i; } public void doSomething(int i) { // does something } mutant 3
  • 35. HOW PIT WORKS Extremely fast x = 1 x = 1 x = 2 4 < 9
  • 36. HOW PIT WORKS Outcomes ● Killed, Lived ● No coverage: the same as Lived except there were no tests that exercised the mutated line of code ● Non viable: bytecode was in some way invalid ● Timed Out: infinite loop ● Memory error: mutation that increases the amount of memory used ● Run error: a large number of run errors probably means something went wrong
  • 37. PIT ECOSYSTEM Tools Command line Other IDEs as a Java application ( )
  • 42. EXAMPLE: LINUXDAY2015 mvn org.pitest:pitest-maven:mutationCoverage >> Generated 8 mutations Killed 6 (75%) >> Ran 11 tests (1.38 tests per mutation) ================================================================= - Mutators ================================================================= > org.pitest...ConditionalsBoundaryMutator >> Generated 2 Killed 0 (0%) > KILLED 0 SURVIVED 2 TIMED_OUT 0 NON_VIABLE 0 > MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0 > NO_COVERAGE 0 ----------------------------------------------------------------- > org.pitest...ReturnValsMutator >> Generated 3 Killed 3 (100%) > KILLED 3 SURVIVED 0 TIMED_OUT 0 NON_VIABLE 0 > MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0 > NO_COVERAGE 0
  • 46. EXAMPLE: LINUXDAY2015 mvn org.pitest:pitest-maven:mutationCoverage >> Generated 8 mutations Killed 7 (88%) >> Ran 10 tests (1.25 tests per mutation) ================================================================= - Mutators ================================================================= > org.pitest...ConditionalsBoundaryMutator >> Generated 2 Killed 1 (50%) > KILLED 1 SURVIVED 1 TIMED_OUT 0 NON_VIABLE 0 > MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0 > NO_COVERAGE 0 ----------------------------------------------------------------- > org.pitest...ReturnValsMutator >> Generated 3 Killed 3 (100%) > KILLED 3 SURVIVED 0 TIMED_OUT 0 NON_VIABLE 0 > MEMORY_ERROR 0 NOT_STARTED 0 STARTED 0 RUN_ERROR 0 > NO_COVERAGE 0
  • 52. EXAMPLE: LINUXDAY2015 source code on GitHub https://github.com/taringamberini/linuxday2015.git
  • 55. CREDITS Minion with gun - by jpartwork (no license available) https://nanookofthenerd.wordpress.com/2015/01/30/the-magnificent-maddening-marvelous- minion-episode-032/ Minion Hands on - by Ceb1031 (CC BY-SA 3.0) http://parody.wikia.com/wiki/File:Bob_minions_hands.jpg Canon XTi components after disassembly - by particlem (CC BY 2.0) https://www.flickr.com/photos/particlem/3860278043/ Continuous Integration - by New Media Labs (no license available) http://newmedialabs.co.za/approach Rally car - by mmphotography.it (CC BY-NC 2.0) https://www.flickr.com/photos/grantuking/9705677549/ Crash Test dummies for sale - by Jack French (CC BY-NC 2.0) https://www.flickr.com/photos/jackfrench/34523572/ Minion (no license available) http://thisandthatforkidsblog.com/2013/09/17/easy-to-make-diy-minion-halloween-pumpkin/ Images
  • 56. Mutant - by minions fans-d6txvph.jpg (no license available) http://despicableme.wikia.com/wiki/File:Evil_minions_by_minions_fans-d6txvph.jpg Mutant killed - by Patricia Uribe (no license available) http://weheartit.com/entry/70334753 Mutant lived - by Carlos Hernández (no license available) https://gifcept.com/VUQrTOr.gif PIT logo - by Ling Yeung (CC BY-NC-SA 3.0) http://pitest.org/about/ Circled Minions - by HARDEEP BHOGAL - (no license available) https://plus.google.com/109649247879792393053/posts/ghH6tiuUZni? pid=6004685782480998482&oid=109649247879792393053 Finger puppets – by Gary Leeming (CC BY-NC-SA 2.0) https://www.flickr.com/photos/grazulis/4754781005/ Questions - by Shinichi Izumi (CC BY-SA) http://despicableme.wikia.com/wiki/File:Purple_Minion.png CREDITS Images