Log in
Seblog.nl

#code

Seb leert unittesten met PHP (deel 1)

Oké, dit wordt zo'n blogpost die ik voor mijn gevoel voor niemand schrijf, omdat het grootste deel van mijn lezers geen idee heeft van PHP en de lezers die wel een idee van PHP hebben naar mijn gevoel allang weten wat unittesten is. Maar hé, misschien ben jij ook wel zoiemand als ik, die wel z’n weg weet in PHP maar gewoon nooit aan unittesten is toegekomen. Bij dezen draag ik deze blogpost op aan jou.

Vorig jaar wist ik eigenlijk niet goed wat Git was, terwijl ik zag dat vrijwel iedereen dat gebruikte. Het was er gewoon nooit van gekomen, na HTML en CSS en PHP en MySQL en Javascript en al die duizend andere dingen die je moet leren als je een website wil bouwen. Dus leerde ik het afgelopen jaar Git (en Github) te gebruiken en daar ben ik heel blij mee. Het resulteerde in mijn eerste gemergede pull request, wat gewoon een knip-en-plakwerkje was, maar toch goed voelt.

Wie de PR leest ziet dat ik na mijn knip-en-plakwerkje nog werd gevraagd om ook even de test te knip-en-plakken. Spannend. Dus ik knipte en plakte en hoopte dat alles goed kwam. Ik hoorde er niets meer over en het werd gemerged, dus alles was blij en bloemetjes, maar er bleef wel een knagend gevoel over: hoe zit dat, geautomatiseerd testen?

Na enig research bleek dat zowel php-comments als Kirby (het CMS waar dit weblog op draait) hun tests uiteindelijk bestaan uit een class die PHPUnit_Framework_TestCase extend. Eén duckduckgo later vond ik phpunit.de, wat blijkbaar dé testsuite voor PHP is. Ik sloot alles af en besloot er later weer naar te kijken.

Later

Vandaag was ik dus vastbesloten om uit te zoeken hoe dit werkte. Of beter eigenlijk: ik kwam het weer tegen en raakte er langzaam in verzeild toen ik eigenlijk iets anders zou moeten doen.

Het begon allemaal heel simpel. Op de site van phpunit stond een link voor ‘Take the first steps’, die wel relevant leek. Daar stond het volgende stappenplan voor in de terminal:

$ wget https://phar.phpunit.de/phpunit.phar

$ chmod +x phpunit.phar

$ sudo mv phpunit.phar /usr/local/bin/phpunit

$ phpunit --version
PHPUnit 5.7.0 by Sebastian Bergmann and contributors.

Ik had al problemen bij stap 1 omdat mijn Mac kennelijk geen wget heeft. Ik probeerde nog wat met curl https://(…) -L | nano maar dat lukte ook niet geweldig. Uiteindelijk heb ik ‘m gewoon even via de browser gedownload. De overige stapjes werkten prima.

De volgende stap blijkt dan dus om in terminal naar de map te gaan waar het bestand phpunit.xml in zit, in mijn geval dus cd ~/code/php-comments/. Toen ik phpunit deed in die map, kreeg ik een foutmelding dat /vendor/autoload.php niet bestond. Dit los je op in de volgende twee stappen, die ik natuurlijk in de verkeerde volgorde deed:

  1. Roep phpunit aan met de bootstrap-vlag:

    $ phpunit --bootstrap vendor/autoload.php
  2. Installeer indien nodig eerst (!) de dependencies via composer.
    $ composer install

Toen ik nogmaals stap 1 uitvoerde kreeg ik het volgende:

$ phpunit --bootstrap vendor/autoload.php
PHPUnit 5.7.5 by Sebastian Bergmann and contributors.

.................................                                 33 / 33 (100%)

Time: 105 ms, Memory: 12.50MB

OK (33 tests, 82 assertions)

We kunnen dus gerust stellen dat mijn knip-en-plakwerkje alle tests haalt. Volgende stap is om zelf tests te gaan schrijven voor dingen die ik maak, maar dat bewaren we even voor een andere keer.

Vorig jaar was mijn (niet uitgesproken) goede voornemen op het gebied van code om meer te leren over Git, want dat leek iedereen die ik pro vond te gebruiken. En dat is gelukt! Ik snap hoe Git werkt, zowel via hun desktop-app als via de CLI, en ik doe dingen met commits, branches, repo's en gister is er zelfs een pull request van me gemerged.

Dit jaar wordt mijn (bij dezen uitgesproken) goede voornemen om te gaan unit-testen. Of in ieder geval iets van tests in mijn programmeren in te bouwen, cuz that's how the pro's do it! Op dit moment maak ik gewoon steeds allemaal wijzigingen en hoop ik dat het werkt – wat vaak niet het geval is op het eerste moment. Op naar een jaar meer secuur werken!