Bij elke nieuwe functionaliteit die we voor een project opleveren zorgen we ervoor dat dit ook voldoende wordt gedekt door geautomatiseerde tests. Hierdoor waarborgen we dat de code functioneel doet wat het moet doen en ook in de toekomst blijft werken naar behoren (er mag geen regressie optreden). Dit kunnen unit tests, integration tests, feature tests, smoke tests, acceptance tests of een combinatie daarvan zijn waarbij we per functionaliteit bekijken welk soort test het meest geschikt is. We streven ernaar om de totale dekkingsgraad per project elke keer te verhogen. Maar hoe weet je wat er wel en niet gecovered wordt door tests? Zijn de edge cases ook voorzien van tests?

Om dit inzicht te verkrijgen hebben we een integratie met Codecov. Codecov haakt in op het code-review proces door inzicht te geven bij Pull Requests. Dit inzicht bevat onder andere een overzicht van de totale coverage (en daling of stijging ervan). Daarnaast toont de coverage van de code in je Pull Request. Heb je bijvoorbeeld tien regels code toegevoegd waarvan je er acht getest hebt met unit tests? Dan vertelt Codecov je feilloos dat de “diff coverage” van je Pull Request 80% is. Vervolgens kun je beslissen of dit afdoende is of dat je 100% coverage wilt.

Integratie

De integratie is heel eenvoudig. Een account aanmaken en eenmalig koppelen met ons versiebeheersysteem (wij gebruiken Atlassian Bitbucket) is genoeg. In ons Continuous Integration script zorgen we dat PHPUnit de juiste rapportages genereert en uploaden we dit naar Codecov.

#bitbucket-pipelines.yml
- php vendor/bin/phpunit --coverage-clover=build/test-reports/clover.xml
- bash <(curl -s https://codecov.io/bash)```

Dit script wordt uitgevoerd elke keer als er een Pull Request geopend wordt en elke keer als er gemerged is naar de develop branch.

Volledig inzicht

Nadat dit script is uitgevoerd kun je doorklikken naar de site van Codecov waarbij je de volledige source code van je Pull Request (en ook van de gehele repository, of van je commits) kunt inzien inclusief coverage. Vergelijkbaar met `—coverage-html` optie van PHPUnit. Die twee regels code die nog niet waren gedekt door unit tests kun je perfect terugvinden. Het toevoegen van een unit test voor die twee regels code zal zorgen voor 100% coverage.

Afb. 1: De coverage van één van onze projecten.

Bij je Pull Request zie je ook vrijwel direct wat voor effect jouw geschreven tests hebben. Schrijf je voldoende tests en verhoogd de coverage? Dan wordt je beloond met een stel groene vlakken (Die bestanden worden nu gecovered) en groene cijfers (de coverage is omhoog gegaan). Verzuim je tests te schrijven? Dan krijg je een aantal rode vlakken en rode cijfers te zien. Het viel mij op dat alleen dit al zorgde voor een positief psychologisch effect bij developers. Opeens werden er toch nog een paar extra testen bijgeschreven of werd dat ene stukje ongebruikte code opgeruimd.

Afb. 2: Bij een pull request ontvang je een comment met in één oogopslag alle informatie. Er zijn hier elf regels toegevoegd en alle elf worden gecovered door tests.

Overzicht

Ook als je meerdere repositories gekoppeld hebt met Codecov zie je in een oogopslag wat de coverage per repository is in een totaaloverzicht. Zo weet je welke repository meer aandacht voor testen nodig heeft.

Elke dag een beetje beter

Inmiddels zijn we zo ver dat we voor een aantal repositories de continue verhoging van coverage  afdwingen. Per repository kun je bijvoorbeeld aangeven dat de totale coverage niet mag dalen, of niet meer dan x% mag dalen. Daarnaast kun je ook aangeven dat de coverage niet onder x% mag komen. Legio mogelijkheden dus om de kwaliteit van ons werk te waarborgen.

Afb. 3: Ondergrens van 80% coverage ingesteld in deze repository. De coverage voor deze pull equest is 81.53%. Dus de check slaagt.

Geschreven door: Jeroen Schouten

Meer kennis bijspijkeren? Kom dan naar onze Meetup: Ode aan de Code!

Bekijk onze Meetups

Wij zijn altijd op zoek naar getalenteerde vakgenoten!

Bekijk onze vacatures