JarnoVogelzang

Hoe test je PHP webapplicaties? Deel 2: Unit testing.

In mijn vorige artikel schreef ik over acceptance testing. Dit is een testtechniek waarbij je vereisten direct vertaalt naar testcode. Deze vertaling is te begrijpen voor zowel jouw opdrachtgever als jouzelf (de ontwikkelaar). In dit artikel ga ik verder in op de andere vorm van testing: Unit testing. Wat is het en hoe werkt het?

Unit testing?

Wat is unit testing eigenlijk? Een unit is niks anders dan een klein stukje functionaliteit in jouw software. Bijvoorbeeld een PHP functie. Door deze tests uit te voeren, check je of deze kleine stukjes functionaliteit werken. Je test dus niet of de hele applicatie als geheel werkt. Dit doe je namelijk door acceptance testing.

Een goed voorbeeld van een unit test is de test die ik schreef in een van mijn vorige artikelen. In deze applicatie had ik een PHP class die een decimaal getal omzette in een Romeins cijfer. De unit test ging vervolgens na of deze class werkte of niet. Dat zag er zo uit:

Dit is een klassiek voorbeeld van een PHPUnit test. Deze functie bouwt een instantie op van mijn class. Vervolgens roept het de method ‘for’ aan met parameter 5. Daarna test het of de output van die method gelijk is aan ‘V’. Het test dus of de functie het getal 5 omzet in het Romeinse cijfer ‘V’. Dit is een heel simpel voorbeeld van een unit test: het test of deze method doet wat hij moet doen.

Dat is dan ook de essentie van unit testing: kleine stukjes functionaliteit worden afzonderlijk getest. Het grote verschil met acceptance testing is dan ook dat unit testing afzonderlijke stukjes code test, terwijl acceptance tests de hele applicatie testen.

Hoe dan?

Hoe werkt dat schrijven van deze tests dan? Eigenlijk is dat best simpel. Ik maak hierbij altijd gebruik van Test Driven Development. Dit is een techniek waarbij je eerst de test schrijft, voordat je de code schrijft die deze functionaliteit implementeert. Neem nu bovenstaande test. Om deze test te laten slagen, zou ik de volgende code schrijven:

De meest simpele code die bovenstaande test doet slagen.

De method checkt of de parameter $number gelijk is aan 5. Zo ja, dan returnt die ‘V’. Nu is mijn eerste test dus geslaagd. Vervolgens schrijf ik de volgende test: Verifieer dat deze method ‘VIII’ returnt, wanneer ik het het getal 8 geef:

De volgende test die de code doet falen.

Deze test doet de code ‘falen’. Het returnt op dit moment namelijk niets, wanneer je het het getal 8 geeft. Nu schrijf je dus de code die deze test doet slagen:

De meest simpele code die bovenstaande nieuwe test en de oude test doet slagen.

En zo ga je incrementief door, totdat je alles hebt geimplementeerd wat je wilde implementeren. Dit is de essentie van TDD: incrementief tests schrijven en vervolgens de code schrijven die deze functionaliteit implementeert. Ben je nu klaar met het schrijven van de tests? Dan refactor je de code zodat het simpeler. Het eindresultaat is in mijn geval dan het volgende:

Het resultaat van TDD.

Deze class zet alle decimale getalen om in Romeinse cijfers. Het is, zoals je ziet, simpele code en makkelijk te begrijpen. En dat is de kracht van TDD: je schrijft alleen de code die je nodig hebt. Niets meer, niets minder!

Wil je nu meer weten over dit onderwerp? Dan raad ik je aan te starten met Codeception. Codeception is een testing framework waarmee je zowel acceptance tests als unit tests kunt maken. Tot volgende week!

Leave a Comment