mutation testing€¦ · • unit testing + code coverage. unit testing. unit testing int sum(int...

75
Mutation Testing Leaving the Stone Age 2017

Upload: others

Post on 14-Oct-2020

78 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation TestingLeaving the Stone Age

2017

Page 2: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

whoami• iOS Developer by day

• compiler hacker by night

• https://twitter.com/1101_debian

• https://lowlevelbits.org

• https://systemundertest.org

Page 3: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Outline• Quality of Software

• Unit Testing

• Mutation Testing

• Mull

• Showcase: LLVM Test Suite

Page 4: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Quality of Software

Page 5: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Quality of Software

• Formal Verification

Page 6: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Quality of Software

• Formal Verification

• Fuzz Testing

Page 7: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Quality of Software

• Formal Verification

• Fuzz Testing

• Unit Testing + Code Coverage

Page 8: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Quality of Software

• Formal Verification

• Fuzz Testing

• Unit Testing + Code Coverage

Page 9: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Unit Testing

Page 10: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Unit Testingint sum(int a, int b) { return a + b; }

Page 11: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Unit Testingint sum(int a, int b) { return a + b; }

void test() { assert(sum(5, 10) > 0); }

Page 12: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Unit Testingint sum(int a, int b) { return a + b; }

void test() { assert(sum(5, 10) > 0); }

Failed Tests: 0

Code Coverage: 100%

Passed Tests: 1

Page 13: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

run_test(program, test)

Page 14: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

run_test(program, test) mutant = mutate(program)

Page 15: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

run_test(program, test) mutant = mutate(program) result = run_test(mutant, test)

Page 16: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

run_test(program, test) mutant = mutate(program) result = run_test(mutant, test) if (result == Failed) report_killed_mutant(mutant, test)

Page 17: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

run_test(program, test) mutant = mutate(program) result = run_test(mutant, test) if (result == Failed) report_killed_mutant(mutant, test) else report_survived_mutant(mutant, test)

Page 18: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testingint sum(int a, int b) { return a + b; }

void test() { assert(sum(5, 10) > 0); }

Page 19: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testingint sum(int a, int b) { return a + b; }

void test() { assert(sum(5, 10) > 0); }

int sum'(int a, int b) { return a * b; }

Page 20: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testingint sum(int a, int b) { return a + b; }

void test() { assert(sum(5, 10) > 0); }

int sum'(int a, int b) { return a * b; }

int sum''(int a, int b) { return a - b; }

Page 21: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testingint sum(int a, int b) { return a + b; }

void test() { assert(sum(5, 10) > 0); }

int sum'(int a, int b) { return a * b; }

int sum''(int a, int b) { return a - b; }

test passed -> mutant survived

Page 22: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testingint sum(int a, int b) { return a + b; }

void test() { assert(sum(5, 10) > 0); }

int sum'(int a, int b) { return a * b; }

int sum''(int a, int b) { return a - b; }

test passed -> mutant survived

test failed -> mutant killed

Page 23: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

Killed Mutants: 1

Mutation Score = killed / total * 100%

Survived Mutants: 1

Total Mutants: 2

Mutation Score: 50%

Page 24: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

• First proposed by Richard Lipton in 1971

Page 25: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

• First proposed by Richard Lipton in 1971

• First implemented by Timothy Budd in 1980

Page 26: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

• First proposed by Richard Lipton in 1971

• First implemented by Timothy Budd in 1980

• Studies say that MT was able to detect 70%-90% of real faults

Page 27: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

• Generates lots of data

Page 28: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

• Generates lots of data

• Time consuming

Page 29: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

• Generates lots of data

• Time consuming

• Languages are not mutation-testing-friendly

Page 30: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

• Generates lots of data

• Time consuming

• Languages are not mutation-testing-friendly

• Problem of a Human Test Oracle

Page 31: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Testing

• Generates lots of data

• Time consuming

• Languages are not mutation-testing-friendly

• Problem of a Human Test Oracle

• "Excuse me, but I write good tests"

Page 32: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mull

Page 33: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mull

• Smart mutant selection

Page 34: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mull

• Smart mutant selection

• Control over data generation

Page 35: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mull

• Smart mutant selection

• Control over data generation

• Runtime compilation

Page 36: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mull

• Smart mutant selection

• Control over data generation

• Runtime compilation

• Operates on LLVM IR level

Page 37: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mull

• Smart mutant selection

• Control over data generation

• Runtime compilation

• Operates on LLVM IR level

• Language agnostic*

Page 38: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutant Selection

Page 39: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutant Selection

Page 40: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutant Selection

Page 41: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutant Selection

Page 42: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutant Selection

Page 43: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutant Selection

Page 44: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

IRTests: 238 testsBefore:

391 modules

85 minutes

Page 45: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

IRTests: 238 testsBefore:

391 modules

After:

85 minutes

124 modules

48 minutes

Page 46: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Control

Page 47: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutation Control

Page 48: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

IRTests: 238 testsDistance: 2 Number of mutants: ~1.5k Real execution time: ~1 hour

Page 49: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

IRTests: 238 testsDistance: 2 Number of mutants: ~1.5k Real execution time: ~1 hour

Distance: 29 Number of mutants: ~18k Approximate execution time: ~11 days

Page 50: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Mutant Control

Page 51: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

System Design

Page 52: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

System Design

Mull

Page 53: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

System Design

Core

• Driver

• Reporter

• MutationOperators

Page 54: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

System Design

Core

• Driver

• Reporter

• MutationOperators

Toolchain

• JIT Compiler

• Object Cache

Page 55: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

System Design

Core

• Driver

• Reporter

• MutationOperators

Toolchain

• JIT Compiler

• Object Cache

Test Framework

• Test Finder

• Test Runner

Page 56: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

System Design

Core

• Driver

• Reporter

• MutationOperators

Toolchain

• JIT Compiler

• Object Cache

Test Framework

• Test Finder

• Test Runner

• Test Finder

• Test Runner

Google Test

Page 57: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

System Design

Core

• Driver

• Reporter

• MutationOperators

Toolchain

• JIT Compiler

• Object Cache

Test Framework

• Test Finder

• Test Runner

• Test Finder

• Test Runner

Google Test

• Test Finder

• Test Runner

XCTest

Page 58: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Showcase

• IRTests

• ADTTests

Page 59: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

IRTests

Number of tests: 238

Number of mutants: 1.5k

Mutation score: 43%

https://lowlevelbits.org/IRTests/

Page 60: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

ADTTests

Number of tests: 465

Number of mutants: 1.5k

Mutation score: 66%

http://lowlevelbits.org/ADTTests/

Page 61: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

TripleTests.*

Number of tests: 13

Number of mutants: 624

Mutation score: 83%

Page 62: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

TripleTests.*

T.setArch(Triple::mips64); EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());

Page 63: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }
Page 64: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

TripleTests.*

T.setArch(Triple::mips64); EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch());

T.setArch(Triple::tce); EXPECT_EQ(Triple::tcele, T.getLittleEndianArchVariant().getArch());

r294095, r294096

Page 65: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

TripleTests.*

Triple T = Triple(""); T.setObjectFormat(Triple::ELF); EXPECT_EQ(Triple::ELF, T.getObjectFormat());

Page 66: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

TripleTests.*

Triple T = Triple(""); // T.setObjectFormat(Triple::ELF); EXPECT_EQ(Triple::ELF, T.getObjectFormat());

Page 67: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

TripleTests.*

Triple T = Triple(""); T.setObjectFormat(Triple::ELF); EXPECT_EQ(Triple::ELF, T.getObjectFormat());

T.setObjectFormat(Triple::MachO); EXPECT_EQ(Triple::MachO, T.getObjectFormat());

r294104

Page 68: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

IRTests

if (foobar) { fastVersion(); } else { slowVersion(); }

Page 69: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Open Questions

Page 70: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Open Questions

• Integration

Page 71: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Open Questions

• Integration

• UX

Page 72: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Open Questions

• Integration

• UX

• Next Language

Page 73: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Open Questions

• Integration

• UX

• Next Language

• Many unknowns

Page 74: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Project: https://github.com/mull-project/mull

Contact: [email protected]

Updates: https://twitter.com/1101_debian

Page 75: Mutation Testing€¦ · • Unit Testing + Code Coverage. Unit Testing. Unit Testing int sum(int a, int b) { return a + b; } Unit Testing int sum(int a, int b) { return a + b; }

Project: https://github.com/mull-project/mull

Contact: [email protected]

Updates: https://twitter.com/1101_debian

Questions?