Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mutation Testing - Quality Talks, May 2019

Mutation Testing - Quality Talks, May 2019

Mutation testing has been evolving into a real candidate to become the de facto metric for assessing the quality of a test suite, defying the throne that has been occupied by code coverage until now.

The concept of mutation testing is quite simple: mutations are introduced on the codebase and the test suite is run against the mutated code. If your test suite is strong, then it should catch the mutation, by having at least one test failing.

In this talk I plan to show how coverage by itself doesn't guarantee quality on the test suite, and how mutation testing can effectively find bugs on your code and tests.

Pedro Rijo

May 23, 2019
Tweet

More Decks by Pedro Rijo

Other Decks in Programming

Transcript

  1. 1 An intro to Mutation Testing - or why coverage

    sucks Pedro Rijo Quality Talks May 23rd, 2019
  2. 5 • We catch the bad guys on e-commerce fraud

    • State of the art AI and Machine Learning About Feedzai • Real time processing • Used by biggest banks, payment processors, and retailers across the globe
  3. • All our code has Unit Tests (BE and FE)

    • Many Integration tests (selenium) • Many System Tests (docker) • Failure Model (http://bit.ly/feedzai-failure-model) 11 High Quality Code
  4. 14 Code Coverage is a measurement of the percentage of

    code lines executed during the test suite.
  5. 15 • Line coverage • Statement coverage • Branch coverage

    • Method coverage Code Coverage • Data coverage • Path coverage • Modified condition coverage • etc https://en.wikipedia.org/wiki/Code_coverage#Coverage_criteria
  6. 20 • MT is a way to check the strength

    of our tests • CC is not reliable as we have seen • 1971 by Richard Lipton • Basic idea: introduce small bugs and check if test suite finds those bugs ◦ Netflix Chaos Monkey anyone? Mutation Testing
  7. 21 public boolean isOldEnough(int age) { return age >= 18;

    } public boolean isOldEnough(int age) { return age > 18; } Mutation Testing
  8. 22 • MT simulates easy bugs - competent programmer hypothesis

    According to this hypothesis, programmers write programs that are almost perfect. The competent programmer hypothesis says that program faults are syntactically small and can be corrected with a few keystrokes. • MT should be included in the development lifecycle (should be run before commit/push/PR) Mutation Testing
  9. 24 • Mutation Operators/mutators • Mutants • Killed mutation •

    Survived mutation • Equivalent Mutations Mutation Testing - Basic Concepts
  10. 27 • Mutations in dead/useless code • Mutations that affect

    only performance • Mutations that can’t be triggered due to logic elsewhere in the program • Mutations that alter only internal state Mutation Testing - Equivalent Mutations
  11. 34 • Easy to use • Maven support: http://pitest.org/quickstart/maven/ •

    Very efficient • multi module support: https://github.com/STAMP-project/pitmp-maven-plugin • Generates mutants and runs test suite automatically PIT - Java Mutation Testing Framework
  12. 38

  13. 39 • MT score threshold to fail builds • skip

    methods (toString, equals, hashcode) • skip full classes • skip test classes PIT - Java Mutation Testing Framework
  14. 41 • PoC using smaller repos ◦ OpenML ▪ https://github.com/feedzai/feedzai-openml/pull/33

    ▪ https://github.com/feedzai/feedzai-openml/pull/34 • internal libs Using MT at Feedzai
  15. 43 • Redundant logic in code • Missing test cases

    ◦ boundary values ◦ null checks ◦ etc Using MT at Feedzai
  16. 49 • Common complaints with MT ◦ Equivalent mutations ◦

    MT is slow ▪ compile code and run tests ▪ PIT is very efficient (bytecode manipulation and coverage info) ▪ incremental analysis • Doesn’t work with mocks ◦ PIT supports JMock, EasyMock, Mockito, PowerMock and JMockit Using MT at Feedzai
  17. 50 • Replace full method logic by “nullable” statement •

    Much less mutants • good preliminary analysis • https://github.com/STAMP-project/pitest-descartes Extreme Mutation
  18. 52 Conclusion • Keeping code base bug-free is hard •

    We need to know our tests strength • Code coverage has flaws • Mutation Testing is a better metric • MT is computational heavy... • ...but seems the right path :)
  19. 53 • https://pedrorijo.com/blog/intro-mutation/ • https://github.com/mbj/mutant for Ruby • http://stryker-mutator.io/ for

    Javascript, Scala, and C# • https://github.com/sugakandrey/scalamu for Scala Resources