SlideShare a Scribd company logo
1 of 63
Improve your tests with Mutation
Testing
Nicolas Fränkel
Me, Myself and I
Developer & Architect
As Consultant
Teacher/trainer
Blogger
Speaker
Book Author
@nicolas_frankel 2
Shameless self-promotion
@nicolas_frankel 3
My job
@nicolas_frankel 4
Many kinds of testing
Unit Testing
Integration Testing
End-to-end Testing
Performance Testing
Penetration Testing
Exploratory Testing
etc.
@nicolas_frankel 5
Their only single goal
Ensure the Quality of the production
code
@nicolas_frankel 6
The problem
How to check the Quality of the testing
code?
@nicolas_frankel 7
Code coverage
“Code coverage is a measure used to
describe the degree to which the
source code of a program is tested”
--Wikipedia
http://en.wikipedia.org/wiki/Code_covera
ge
@nicolas_frankel 8
Measuring Code Coverage
Check whether a source code line is
executed during a test
Or Branch Coverage
@nicolas_frankel 9
Computing Code Coverage
CC =
Lexecuted
Ltotal
*100
CC: Code Coverage
(in percent)
Lexecuted: Number of
executed lines of code
Ltotal: Number of total
lines of code
@nicolas_frankel 10
Java Tools for Code Coverage
JaCoCo
Clover
Cobertura
etc.
@nicolas_frankel 11
100% Code Coverage?
“Is 100% code coverage realistic? Of
course it is. If you can write a line of
code, you can write another that
tests it.”
Robert Martin (Uncle Bob)
https://twitter.com/unclebobmartin/status/
55966620509667328
@nicolas_frankel 12
Assert-less testing
@Test
public void add_should_add() {
new Math().add(1, 1);
}
@nicolas_frankel 13
But, where is the
assert?
As long as the Code Coverage is
OK…
Code coverage as a measure of test quality
Any metric can be gamed!
Code coverage is a metric…
⇒ Code coverage can be gamed
On purpose
Or by accident
@nicolas_frankel 14
Code coverage as a measure of test quality
Code Coverage lulls you into a false
sense of security…
@nicolas_frankel 15
The problem still stands
Code coverage cannot ensure test
quality
Is there another way?
Mutation Testing to the rescue!
@nicolas_frankel 16
The Cast
@nicolas_frankel 17
William Stryker
Original Source Code
Jason Stryker
Modified Source Code
a.k.a “The Mutant”
public class Math {
public int add(int i1, int i2) {
return i1 + i2;
}
}
@nicolas_frankel 18
public class Math {
public int add(int i1, int i2) {
return i1 - i2;
}
}
Standard testing
@nicolas_frankel 19
✔Execute Test
Mutation testing
@nicolas_frankel 20
?Execute SAME Test
MUTATION
Mutation testing
@nicolas_frankel 21
✗
✔Execute SAME Test
Execute SAME Test
Mutant
Killed
Mutant Survived
Killed or Surviving?
Surviving means changing the source
code did not change the test result
It’s bad!
Killed means changing the source
code changed the test result
It’s good
@nicolas_frankel 22
Test the code
@nicolas_frankel 23
public class Math {
public int add(int i1, int i2) {
return i1 + i2;
}
}
@Test
public void add_should_add() {
new Math().add(1, 1);
}
✔Execute Test
Surviving mutant
@nicolas_frankel 24
public class Math {
public int add(int i1, int i2) {
return i1 - i2;
}
}
@Test
public void add_should_add() {
new Math().add(1, 1);
}
✔Execute SAME Test
Test the code
@nicolas_frankel 25
public class Math {
public int add(int i1, int i2) {
return i1 + i2;
}
}
@Test
public void add_should_add() {
int sum = new Math().add(1, 1);
Assert.assertEquals(sum, 2);
}
✔Execute Test
Killed mutant
@nicolas_frankel 26
public class Math {
public int add(int i1, int i2) {
return i1 - i2;
}
}
@Test
public void add_should_add() {
int sum = new Math().add(1, 1);
Assert.assertEquals(sum, 2);
}
✗Execute SAME Test
Mutation Testing in Java
PIT is a tool for Mutation testing
Available as
Command-line tool
Ant target
Maven plugin
@nicolas_frankel 27
Mutators
Mutators are patterns applied to
source code to produce mutations
@nicolas_frankel 28
PIT mutators sample
Name Example source Result
Conditionals Boundary > >=
Negate Conditionals == !=
Remove Conditionals foo == bar true
Math + -
Increments foo++ foo--
Invert Negatives -foo foo
Inline Constant static final FOO= 42 static final FOO =
43
Return Values return true return false
Void Method Call System.out.println("foo")
Non Void Method Call long t =
System.currentTimeMillis()
long t = 0
Constructor Call Date d = new Date() Date d = null;@nicolas_frankel 29
Important mutators
Conditionals Boundary
Probably a potential serious bug smell
if (foo > bar)
@nicolas_frankel 30
Important mutators
Void Method Call
Assert.checkNotNull()
connection.close()
@nicolas_frankel 31
Remember
It’s not because the IDE generates
code safely that it will never change
equals()
hashCode()
@nicolas_frankel 32
False positives
Mutation Testing is not 100%
bulletproof
Might return false positives
Be cautious!
@nicolas_frankel 33
Enough talk…
@nicolas_frankel 34
Drawbacks
Slow
Sluggish
Crawling
Sulky
Lethargic
etc.
@nicolas_frankel 39
Metrics (kind of)
On joda-money
mvn clean test-compile
mvn surefire:test
Total time: 2.181 s
mvn pit-test...
Total time: 48.634 s
@nicolas_frankel 40
Why so slow?
Analyze test code
For each class under test
For each mutator
Create mutation
For each mutation
Run test
Analyze result
Aggregate results
@nicolas_frankel 41
Workarounds
This is not acceptable in a normal test
run
But there are workarounds
@nicolas_frankel 42
Set mutators
<configuration>
<mutators>
<mutator>
CONSTRUCTOR_CALLS
</mutator>
<mutator>
NON_VOID_METHOD_CALLS
</mutator>
</mutators>
</configuration>
@nicolas_frankel 43
Set target classes
<configuration>
<targetClasses>
<param>ch.frankel.pit*</param>
</targetClasses>
</configuration>
@nicolas_frankel 44
Set target tests
<configuration>
<targetTests>
<param>ch.frankel.pit*</param>
</targetTests>
</configuration>
@nicolas_frankel 45
Dependency distance
@nicolas_frankel 46
1 2
Limit dependency distance
<configuration>
<maxDependencyDistance>
4
</maxDependencyDistance>
</configuration>
@nicolas_frankel 47
Limit number of mutations
<configuration>
<maxMutationsPerClass>
10
</maxMutationsPerClass>
</configuration>
@nicolas_frankel 48
Use MutationFilter
@nicolas_frankel 49
PIT extension points
Must be packaged in JAR
Have Implementation-Vendor and
Implementation-Title in
MANIFEST.MF that match PIT’s
Set on the classpath
Use Java’s Service Provider feature
@nicolas_frankel 50
Service Provider
Inversion of control
Since Java 1.3!
Text file located in META-
INF/services
Interface
Name of the file
Implementation class
Content of the file
@nicolas_frankel 51
Sample structure
@nicolas_frankel 52
JAR
ch.frankel.lts.Sample
Service Provider API
@nicolas_frankel 53
Service Provider sample
ServiceLoader<ISample> loaders =
ServiceLoader.load(ISample.class);
for (ISample sample: loaders) {
// Use the sample
}
@nicolas_frankel 54
Output formats
Out-of-the-box
HTML
XML
CSV
@nicolas_frankel 55
Output formats
<configuration>
<outputFormats>
<outputFormat>XML</outputFormat>
<outputFormat>HTML</outputFormat>
</outputFormats>
</configuration>
@nicolas_frankel 56
@nicolas_frankel 57
Mutation Filter
Remove mutations from the list of
available mutations for a class
@nicolas_frankel 58
@nicolas_frankel 59
@nicolas_frankel 60
Don’t bind to test phase!
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<executions>
<execution>
<goals>
<goal>mutationCoverage</goal>
</goals>
<phase>test</phase>
</execution>
</executions>
</plugin>
@nicolas_frankel 61
Use scmMutationCoverage
mvn 
org.pitest:pitest-maven:scmMutationCoverage 
-DtimestampedReports=false
@nicolas_frankel 62
Do use on Continuous Integration servers
mvn 
org.pitest:pitest-maven:mutationCoverage 
-DtimestampedReports=false
@nicolas_frankel 63
Is Mutation Testing the Silver Bullet?
Sorry, no!
It only
Checks the relevance of your unit tests
Points out potential bugs
@nicolas_frankel 64
What it doesn’t do
Validate the assembled application
Integration Testing
Check the performance
Performance Testing
Look out for display bugs
End-to-end testing
Etc.
@nicolas_frankel 65
Testing is about ROI
Don’t test to achieve 100% coverage
Test because it saves money in the
long run
Prioritize:
Business-critical code
Complex code
@nicolas_frankel 66
Q&A
@nicolas_frankel
http://blog.frankel.ch/
https://leanpub.com/integ
rationtest/
@nicolas_frankel 67

More Related Content

What's hot

What's hot (19)

MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - PIT: state of the art of mutation testing system MUTANTS KILLER - PIT: state of the art of mutation testing system
MUTANTS KILLER - 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
MUTANTS KILLER (Revised) - PIT: state of the art of mutation testing system
 
Mutation testing in Java
Mutation testing in JavaMutation testing in Java
Mutation testing in Java
 
3 j unit
3 j unit3 j unit
3 j unit
 
Mutation-Testing mit PIT
Mutation-Testing mit PITMutation-Testing mit PIT
Mutation-Testing mit PIT
 
An introduction to Google test framework
An introduction to Google test frameworkAn introduction to Google test framework
An introduction to Google test framework
 
Junit
JunitJunit
Junit
 
C++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing FrameworkC++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing Framework
 
Java Unit Testing
Java Unit TestingJava Unit Testing
Java Unit Testing
 
Sample Chapter of Practical Unit Testing with TestNG and Mockito
Sample Chapter of Practical Unit Testing with TestNG and MockitoSample Chapter of Practical Unit Testing with TestNG and Mockito
Sample Chapter of Practical Unit Testing with TestNG and Mockito
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
Beyond Testing: Specs and Behavior Driven Development
Beyond Testing: Specs and Behavior  Driven DevelopmentBeyond Testing: Specs and Behavior  Driven Development
Beyond Testing: Specs and Behavior Driven Development
 
Junit
JunitJunit
Junit
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
IntroTestMore
IntroTestMoreIntroTestMore
IntroTestMore
 
Building unit tests correctly
Building unit tests correctlyBuilding unit tests correctly
Building unit tests correctly
 
Unit testing patterns for concurrent code
Unit testing patterns for concurrent codeUnit testing patterns for concurrent code
Unit testing patterns for concurrent code
 
TDD reloaded - JUGTAA 24 Ottobre 2012
TDD reloaded - JUGTAA 24 Ottobre 2012TDD reloaded - JUGTAA 24 Ottobre 2012
TDD reloaded - JUGTAA 24 Ottobre 2012
 
Unit testing with java
Unit testing with javaUnit testing with java
Unit testing with java
 

Viewers also liked

Viewers also liked (15)

Java Day Lviv - Spring Boot under the hood
Java Day Lviv - Spring Boot under the hoodJava Day Lviv - Spring Boot under the hood
Java Day Lviv - Spring Boot under the hood
 
Geecon - Improve your Android-fu with Kotlin
Geecon - Improve your Android-fu with KotlinGeecon - Improve your Android-fu with Kotlin
Geecon - Improve your Android-fu with Kotlin
 
Jpoint - Refactoring
Jpoint - RefactoringJpoint - Refactoring
Jpoint - Refactoring
 
Voxxed Days Ticino - Spring Boot for Devops
Voxxed Days Ticino - Spring Boot for DevopsVoxxed Days Ticino - Spring Boot for Devops
Voxxed Days Ticino - Spring Boot for Devops
 
GeeCon - Cargo Culting and Memes in Java
GeeCon - Cargo Culting and Memes in JavaGeeCon - Cargo Culting and Memes in Java
GeeCon - Cargo Culting and Memes in Java
 
Javentura - Spring Boot under the hood
Javentura - Spring Boot under the hoodJaventura - Spring Boot under the hood
Javentura - Spring Boot under the hood
 
Voxxed Days Belgrade - Spring Boot & Kotlin, a match made in Heaven
Voxxed Days Belgrade - Spring Boot & Kotlin, a match made in HeavenVoxxed Days Belgrade - Spring Boot & Kotlin, a match made in Heaven
Voxxed Days Belgrade - Spring Boot & Kotlin, a match made in Heaven
 
Riga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous IntegrationRiga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous Integration
 
Java Day Kharkiv - Integration Testing from the Trenches Rebooted
Java Day Kharkiv - Integration Testing from the Trenches RebootedJava Day Kharkiv - Integration Testing from the Trenches Rebooted
Java Day Kharkiv - Integration Testing from the Trenches Rebooted
 
Morning at Lohika - Spring Boot Kotlin, a match made in Heaven
Morning at Lohika - Spring Boot Kotlin, a match made in HeavenMorning at Lohika - Spring Boot Kotlin, a match made in Heaven
Morning at Lohika - Spring Boot Kotlin, a match made in Heaven
 
Spring IO - Spring Boot for DevOps
Spring IO - Spring Boot for DevOpsSpring IO - Spring Boot for DevOps
Spring IO - Spring Boot for DevOps
 
The Dark Side of Microservices
The Dark Side of MicroservicesThe Dark Side of Microservices
The Dark Side of Microservices
 
I.T.A.K.E Unconference - Mutation testing to the rescue of your tests
I.T.A.K.E Unconference - Mutation testing to the rescue of your testsI.T.A.K.E Unconference - Mutation testing to the rescue of your tests
I.T.A.K.E Unconference - Mutation testing to the rescue of your tests
 
jDays - Spring Boot under the Hood
jDays - Spring Boot under the HoodjDays - Spring Boot under the Hood
jDays - Spring Boot under the Hood
 
DevExperience - The Dark Side of Microservices
DevExperience - The Dark Side of MicroservicesDevExperience - The Dark Side of Microservices
DevExperience - The Dark Side of Microservices
 

Similar to GeeCON - Improve your tests with Mutation Testing

Similar to GeeCON - Improve your tests with Mutation Testing (20)

Javantura v3 - Mutation Testing for everyone – Nicolas Fränkel
Javantura v3 - Mutation Testing for everyone – Nicolas FränkelJavantura v3 - Mutation Testing for everyone – Nicolas Fränkel
Javantura v3 - Mutation Testing for everyone – Nicolas Fränkel
 
Joker - Improve your tests with mutation testing
Joker - Improve your tests with mutation testingJoker - Improve your tests with mutation testing
Joker - Improve your tests with mutation testing
 
Java Dominicano - Mutation testing
Java Dominicano - Mutation testingJava Dominicano - Mutation testing
Java Dominicano - Mutation testing
 
Codemotion Berlin - Improve your tests with Mutation Testing
Codemotion Berlin - Improve your tests with Mutation TestingCodemotion Berlin - Improve your tests with Mutation Testing
Codemotion Berlin - Improve your tests with Mutation Testing
 
Codemash - Mutation testing to the rescue of your tests
Codemash - Mutation testing to the rescue of your testsCodemash - Mutation testing to the rescue of your tests
Codemash - Mutation testing to the rescue of your tests
 
Craft-Conf - Improve your Tests with Mutation Testing
Craft-Conf - Improve your Tests with Mutation TestingCraft-Conf - Improve your Tests with Mutation Testing
Craft-Conf - Improve your Tests with Mutation Testing
 
ConFoo - Improve your tests with mutation testing
ConFoo - Improve your tests with mutation testingConFoo - Improve your tests with mutation testing
ConFoo - Improve your tests with mutation testing
 
TestCon Europe - Mutation Testing to the Rescue of Your Tests
TestCon Europe - Mutation Testing to the Rescue of Your TestsTestCon Europe - Mutation Testing to the Rescue of Your Tests
TestCon Europe - Mutation Testing to the Rescue of Your Tests
 
Voxxed Days Athens - Improve your tests with Mutation Testing
Voxxed Days Athens - Improve your tests with Mutation TestingVoxxed Days Athens - Improve your tests with Mutation Testing
Voxxed Days Athens - Improve your tests with Mutation Testing
 
DevExperience - Improve your tests with mutation testing
DevExperience - Improve your tests with mutation testingDevExperience - Improve your tests with mutation testing
DevExperience - Improve your tests with mutation testing
 
Mutation Testing.pdf
Mutation Testing.pdfMutation Testing.pdf
Mutation Testing.pdf
 
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
 
des mutants dans le code.pdf
des mutants dans le code.pdfdes mutants dans le code.pdf
des mutants dans le code.pdf
 
How to quickly add a safety net to a legacy codebase
How to quickly add a safety net to a legacy codebaseHow to quickly add a safety net to a legacy codebase
How to quickly add a safety net to a legacy codebase
 
Testing, Learning and Professionalism — 20171214
Testing, Learning and Professionalism — 20171214Testing, Learning and Professionalism — 20171214
Testing, Learning and Professionalism — 20171214
 
Mutation testing pixels camp 2019
Mutation testing   pixels camp 2019Mutation testing   pixels camp 2019
Mutation testing pixels camp 2019
 
Code coverage
Code coverageCode coverage
Code coverage
 
Test driven development
Test driven developmentTest driven development
Test driven development
 
SE2_Lec 21_ TDD and Junit
SE2_Lec 21_ TDD and JunitSE2_Lec 21_ TDD and Junit
SE2_Lec 21_ TDD and Junit
 
SE2018_Lec 20_ Test-Driven Development (TDD)
SE2018_Lec 20_ Test-Driven Development (TDD)SE2018_Lec 20_ Test-Driven Development (TDD)
SE2018_Lec 20_ Test-Driven Development (TDD)
 

More from Nicolas Fränkel

jLove - A Change-Data-Capture use-case: designing an evergreen cache
jLove - A Change-Data-Capture use-case: designing an evergreen cachejLove - A Change-Data-Capture use-case: designing an evergreen cache
jLove - A Change-Data-Capture use-case: designing an evergreen cache
Nicolas Fränkel
 
OSCONF Hyderabad - Shorten all URLs!
OSCONF Hyderabad - Shorten all URLs!OSCONF Hyderabad - Shorten all URLs!
OSCONF Hyderabad - Shorten all URLs!
Nicolas Fränkel
 
JOnConf - A CDC use-case: designing an Evergreen Cache
JOnConf - A CDC use-case: designing an Evergreen CacheJOnConf - A CDC use-case: designing an Evergreen Cache
JOnConf - A CDC use-case: designing an Evergreen Cache
Nicolas Fränkel
 

More from Nicolas Fränkel (20)

SnowCamp - Adding search to a legacy application
SnowCamp - Adding search to a legacy applicationSnowCamp - Adding search to a legacy application
SnowCamp - Adding search to a legacy application
 
Un CV de dévelopeur toujours a jour
Un CV de dévelopeur toujours a jourUn CV de dévelopeur toujours a jour
Un CV de dévelopeur toujours a jour
 
Zero-downtime deployment on Kubernetes with Hazelcast
Zero-downtime deployment on Kubernetes with HazelcastZero-downtime deployment on Kubernetes with Hazelcast
Zero-downtime deployment on Kubernetes with Hazelcast
 
jLove - A Change-Data-Capture use-case: designing an evergreen cache
jLove - A Change-Data-Capture use-case: designing an evergreen cachejLove - A Change-Data-Capture use-case: designing an evergreen cache
jLove - A Change-Data-Capture use-case: designing an evergreen cache
 
BigData conference - Introduction to stream processing
BigData conference - Introduction to stream processingBigData conference - Introduction to stream processing
BigData conference - Introduction to stream processing
 
ADDO - Your own Kubernetes controller, not only in Go
ADDO - Your own Kubernetes controller, not only in GoADDO - Your own Kubernetes controller, not only in Go
ADDO - Your own Kubernetes controller, not only in Go
 
OSCONF Jaipur - A Hitchhiker's Tour to Containerizing a Java application
OSCONF Jaipur - A Hitchhiker's Tour to Containerizing a Java applicationOSCONF Jaipur - A Hitchhiker's Tour to Containerizing a Java application
OSCONF Jaipur - A Hitchhiker's Tour to Containerizing a Java application
 
GeekcampSG 2020 - A Change-Data-Capture use-case: designing an evergreen cache
GeekcampSG 2020 - A Change-Data-Capture use-case: designing an evergreen cacheGeekcampSG 2020 - A Change-Data-Capture use-case: designing an evergreen cache
GeekcampSG 2020 - A Change-Data-Capture use-case: designing an evergreen cache
 
JavaDay Istanbul - 3 improvements in your microservices architecture
JavaDay Istanbul - 3 improvements in your microservices architectureJavaDay Istanbul - 3 improvements in your microservices architecture
JavaDay Istanbul - 3 improvements in your microservices architecture
 
OSCONF Hyderabad - Shorten all URLs!
OSCONF Hyderabad - Shorten all URLs!OSCONF Hyderabad - Shorten all URLs!
OSCONF Hyderabad - Shorten all URLs!
 
Devclub.lv - Introduction to stream processing
Devclub.lv - Introduction to stream processingDevclub.lv - Introduction to stream processing
Devclub.lv - Introduction to stream processing
 
OSCONF Koshi - Zero downtime deployment with Kubernetes, Flyway and Spring Boot
OSCONF Koshi - Zero downtime deployment with Kubernetes, Flyway and Spring BootOSCONF Koshi - Zero downtime deployment with Kubernetes, Flyway and Spring Boot
OSCONF Koshi - Zero downtime deployment with Kubernetes, Flyway and Spring Boot
 
JOnConf - A CDC use-case: designing an Evergreen Cache
JOnConf - A CDC use-case: designing an Evergreen CacheJOnConf - A CDC use-case: designing an Evergreen Cache
JOnConf - A CDC use-case: designing an Evergreen Cache
 
London In-Memory Computing Meetup - A Change-Data-Capture use-case: designing...
London In-Memory Computing Meetup - A Change-Data-Capture use-case: designing...London In-Memory Computing Meetup - A Change-Data-Capture use-case: designing...
London In-Memory Computing Meetup - A Change-Data-Capture use-case: designing...
 
JUG Tirana - Introduction to data streaming
JUG Tirana - Introduction to data streamingJUG Tirana - Introduction to data streaming
JUG Tirana - Introduction to data streaming
 
Java.IL - Your own Kubernetes controller, not only in Go!
Java.IL - Your own Kubernetes controller, not only in Go!Java.IL - Your own Kubernetes controller, not only in Go!
Java.IL - Your own Kubernetes controller, not only in Go!
 
vJUG - Introduction to data streaming
vJUG - Introduction to data streamingvJUG - Introduction to data streaming
vJUG - Introduction to data streaming
 
London Java Community - An Experiment in Continuous Deployment of JVM applica...
London Java Community - An Experiment in Continuous Deployment of JVM applica...London Java Community - An Experiment in Continuous Deployment of JVM applica...
London Java Community - An Experiment in Continuous Deployment of JVM applica...
 
OSCONF - Your own Kubernetes controller: not only in Go
OSCONF - Your own Kubernetes controller: not only in GoOSCONF - Your own Kubernetes controller: not only in Go
OSCONF - Your own Kubernetes controller: not only in Go
 
vKUG - Migrating Spring Boot apps from annotation-based config to Functional
vKUG - Migrating Spring Boot apps from annotation-based config to FunctionalvKUG - Migrating Spring Boot apps from annotation-based config to Functional
vKUG - Migrating Spring Boot apps from annotation-based config to Functional
 

Recently uploaded

+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
anilsa9823
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
anilsa9823
 

Recently uploaded (20)

Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
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
 
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
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
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
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
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
 
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
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
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
 

GeeCON - Improve your tests with Mutation Testing

Editor's Notes

  1. All are integrated in Maven JaCoCo is also integrated into Sonar out-of-the-box
  2. There are also experimental mutators http://pitest.org/quickstart/mutators/
  3. skinparam dpi 300 class Test class Mutant1 class Dependency class Mutant2 Test .up.> Mutant1 Test .right.> Dependency Dependency .up.> Mutant2 hide members
  4. skinparam dpi 300 hide empty attributes hide empty methods package java.util { interface Iterable<T> class ServiceLoader<T> { {static} load(service:Class<T>, loader:ClassLoader):ServiceLoader<T> {static} load(service:Class<T>):ServiceLoader<T> {static} loadInstalled(service:Class<T>):ServiceLoader<T> reload(); } } ServiceLoader .up.|> Iterable
  5. hide attributes package org.pitest { package plugin { interface ToolClasspathPlugin { {abstract} description():String } } package mutationtest { interface MutationResultListenerFactory { {abstract} name():String {abstract} getListener(args:ListenerArguments):MutationResultListener } interface MutationResultListener { {abstract} runStart() {abstract} handleMutationResult(results:ClassMutationResults) {abstract} runEnd() } class ListenerArguments { + getOutputStrategy():ResultOutputStrategy + getCoverage():CoverageDatabase + getStartTime():long + getLocator():SourceLocator + getEngine():MutationEngine } class ClassMutationResults { + getFileName():String + getMutations():Collection<MutationResult> + getMutatedClass():ClassName + getPackageName():String } } MutationResultListenerFactory -up-|> ToolClasspathPlugin MutationResultListenerFactory .right.> MutationResultListener MutationResultListenerFactory .down.> ListenerArguments MutationResultListener .down.> ClassMutationResults
  6. hide attributes hide empty methods package org.pitest { package plugin { interface ToolClasspathPlugin { {abstract} description():String } } package mutationtest { package filter { interface MutationFilterFactory { {abstract} createFilter(code:CodeSource, maxMutationsPerClass:int):MutationFilter } interface MutationFilter { {abstract} filter(mutations:Collection<MutationDetails>):Collection<MutationDetails> } } package engine { class MutationDetails } } package classpath { class CodeSource } } MutationFilterFactory -up-|> ToolClasspathPlugin MutationFilterFactory .right.> MutationFilter MutationFilterFactory .down.> CodeSource MutationFilter .down.> MutationDetails