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

Mutation testing with Humbug - TrueNorth PHP 2016

Marc Aubé
November 05, 2016

Mutation testing with Humbug - TrueNorth PHP 2016

Satisfied with your unit test code coverage? Are you sure that your code is thoroughly tested, and not merely executed by the tests? Learn what mutation testing is, and how Humbug can help you give your test suite a run for its money. Humbug is a tool that injects defects and regressions in your code and then checks if your tests noticed.

Marc Aubé

November 05, 2016
Tweet

More Decks by Marc Aubé

Other Decks in Programming

Transcript

  1. unit testing · prove the code works · catch regressions

    · drive away from bad design · short feedback loop
  2. unit testing · prove the code works · catch regressions

    · drive away from bad design · short feedback loop · mature tooling
  3. public function getPrice($tickets = 1, $hasCoupon = false) { $price

    = $tickets * 945.00; if ($tickets >= 10 || $hasCoupon) { $price *= 0.8; } return $price; }
  4. public function getPrice($tickets = 1, $hasCoupon = false) { $price

    = $tickets * 945.00; if ($tickets >= 10 || $hasCoupon) { $price *= 0.8; } return $price; }
  5. public function testCanCalculateThePriceOfARegularOrder() { $this->assertEquals(945.00, $calculator->getPrice()); } public function testAppliesADiscountForOrdersOfTenTicketsOrMore()

    { $this->assertEquals(11340.00, $calculator->getPrice(15)); } public function testAppliesADiscountForOrdersWithCoupon() { $this->assertEquals(756.00, $calculator->getPrice(1, true)); }
  6. mutation testing · identify weaknesses in unit tests · most

    effective for high coverage · complements unit testing
  7. Mutation Testing is commencing on 1 files... (.: killed, M:

    escaped, S: uncovered, E: fatal error, T: timed out) ..M.M... 8 mutations were generated: 6 mutants were killed 0 mutants were not covered by tests 2 covered mutants were not detected 0 fatal errors were encountered 0 time outs were encountered
  8. 2) \Humbug\Mutator\Number\IntegerValue Diff on \Confoo\PriceCalculator::getPrice() in src/PriceCalculator.php: --- Original +++

    New @@ @@ - if ($tickets >= 10 || $hasCoupon) { + if ($tickets >= 11 || $hasCoupon) { $price *= 0.8; } return $price; } }
  9. equivalent mutants (false positives) // ORIGINAL CODE // MUTANT $index

    = 0; $index = 0; while ($index != 10) { while ($index < 10) { // do stuff // do stuff $index++; $index++; } }
  10. Metrics: Mutation Score Indicator (MSI): 75% Mutation Code Coverage: 100%

    Covered Code MSI: 75% Remember that some mutants will inevitably be harmless (i.e. false positives). Time: 3.74 seconds Memory: 6.00MB Humbug results are being logged as TEXT to: humbuglog.txt
  11. Installing Humbug $ composer require --dev "humbug/humbug:^1.0@dev" ./composer.json has been

    updated Loading composer repositories with package information Updating dependencies (including require-dev) - Installing humbug/humbug (dev-master 06b1c05) Cloning 06b1c059e432dab8c22c36bc8b6e1ffc7e587c07 Writing lock file Generating autoload files
  12. Configuring Humbug $ vendor/bin/humbug configure _ _ _ | ||

    |_ _ _ __ | |__ _ _ __ _ | __ | || | ' \| '_ \ || / _` | |_||_|\_,_|_|_|_|_.__/\_,_\__, | |___/ Humbug version 1.0-dev Humbug configuration tool. It will guide you through Humbug configuration in few seconds.
  13. Program testing can be used to show the presence of

    bugs, but never to show their absence. — Edsger W. Dijkstra
  14. Another interesting testing tool you should def check out Eris

    <?php use Eris\Generator; class ReadmeTest extends \PHPUnit_Framework_TestCase { use Eris\TestTrait; public function testNaturalNumbersMagnitude() { $this->forAll( Generator\choose(0, 1000) ) ->then(function($number) { $this->assertTrue( $number < 42, "$number is not less than 42 apparently" ); }); } }