Ik ben aan het proberen mijn code beter te testen met PHPUnit. Ik maak nu gebruik van verschillende soorten tests:
- Functionele tests voor het hele globaal testen van pagina’s van de website. Bijvoorbeeld “zie ik een blogpost op de homepage en kan ik doorklikken naar de volledige tekst?”.
- Integratie tests om te controleren of mijn repositories de juiste data teruggeven. Bijvoorbeeld “geeft mijn repository alleen maar blogposts terug die gepubliceerd zijn?”.
- Unit tests om elke functie individueel te testen, los van andere code. Bijvoorbeeld “Geeft de UserPresenter de volledige naam van een gebruiker op de juiste manier terug?”.
Best practices
Om dit allemaal een beetje netjes op te zetten ben ik zoek gegaan naar de best practices voor het gebruik van PHPUnit. Als snel kwam ik, zoals zo vaak, terecht op PHPUnit best practices to organize tests.
Een korte samenvatting:
- Deel je map met tests op in
/functional
,/integration
en/unit
. - Binnen
/unit
kopieer je de mappenstructuur van je eigen applicatie. - Ook alle bestandsnamen zet je over maar je zet er Test achter, dus
/Users/User.php
wordt/tests/Users/UserTest.php
. - Functienamen beginnen
test
en maak je zo beschrijvend mogelijk. Als je een functiegenerateSlug()
hebt dan noem je je unit testtestGenerateSlugReturnsCorrectSlug()
, of iets vergelijkbaars.
Het kan natuurlijk zijn dat je verschillende dingen aan een functie wilt unit testen. Maak dan verschillende tests met goed beschrijvende namen of lees de documentatie over data providers.
Aliases
Om het geheel nog wat makkelijker te maken heb ik een aantal aliases aangemaakt in ~/.bash_aliases
. Dit is een beetje afgekeken van Jeffrey Way maar maakt het leven wel zo makkelijk.
Neem de onderstaande aliases over en roep in het vervolg je tests aan met t
om alle tests uit te voeren of met tu
om alleen de unit tests te doen.
alias t='vendor/bin/phpunit'
alias tf='vendor/bin/phpunit tests/functional'
alias ti='vendor/bin/phpunit tests/integration'
alias tu='vendor/bin/phpunit tests/unit'