Chris de Kok 223548 TDI 3
Vak: Software Architectuur Datum: 21-01-2008 Docent: Fons van Kesteren
Inhoud Inleiding................................................................................................................................................... 3 Black box / White box ............................................................................................................................. 3 XP ............................................................................................................................................................ 3 SimpleTest ............................................................................................................................................... 3 Eclipse plugin .......................................................................................................................................... 4 GroupTest ............................................................................................................................................... 6 Versiebeheer ........................................................................................................................................... 6 Mock objects ........................................................................................................................................... 6 Conclusie ................................................................................................................................................. 7
2
Unit testing Inleiding Ik heb een kort onderzoek gedaan naar unit testing in software ontwikelling, unit testing is een procedure om individuele stukjes code te testen of ze goed werken. Normaal gesproken bestaat dit uit een method (functie) binnen een class. Unit testing is maar een onderdeel van alle test methode's bij een software project, normaal gesproken zou deze moeten bestaan uit: 1. Unit Testing (Test elk stukje code) 2. System / Integration testing (Test de code op de omgeving waarin het gebruikt gaat worden.) 3. Acceptance testing (Test de applicatie vanuit een eindgebruikers perspectief.)
Black box / White box Er zijn twee methodes voor unit testing, black box teting en white box testing. Black box testing werkt buiten de code, er wordt gebruik gemaakt van de API en er wordt gecontroleerd wat er wordt teruggegeven. White box testing bestaat uit het controleren binnen de code, dit kan zelfs als zijn het geven van een echo of print command om de waardes in de code te bekijken.
XP Unit testing is een belangrijk onderdeel van XP (http://www.extremeprogramming.org). Hier worden eerst de unit tests geschreven en pas daarna de code die erbij hoort, in plaats van andersom eerst de code en dan de test. Hierdoor wordt Hierbij wordt de code zo simpel mogelijk gehouden om alleen de test te laten slagen, en kan hier worden refactored, waarna de test weer gedraaid wordt voor regressie testing.
SimpleTest Als test framework heb ik gebruik gemaakt van SimpleTest (http://simpletest.sourceforge.net/). Hiermee kan automatisch getest worden, de lijst met basis assertions waarop je kan controleren is als volgt. assertTrue(\$x) Fail if \$x is false assertFalse(\$x)Fail if \$x is true assertNull(\$x) Fail if \$x is set assertNotNull(\$x)
3
Fail if \$x not set
assertIsA(\$x, \$t)
Fail if \$x is not the class or type \$t
assertEqual(\$x, \$y)
Fail if \$x == \$y is false
assertNotEqual(\$x, \$y)
Fail if \$x == \$y is true
assertIdentical(\$x, \$y)
Fail if \$x === \$y is false
assertNotIdentical(\$x, \$y)
Fail if \$x === \$y is true
assertReference(\$x, \$y)
Fail unless \$x and \$y are the same variable
assertCopy(\$x, \$y)
Fail if \$x and \$y are the same variable
assertWantedPattern(\$p, \$x) Fail unless the regex \$p matches \$x assertNoUnwantedPattern(\$p, \$x)
Fail if the regex \$p matches \$x
assertNoErrors()
Fail if any PHP error occoured
assertError(\$x)
Fail if no PHP error or incorrect message
Eclipse plugin Er valt een pakket te downloaden als los PHP script en er is ook een Eclipse plugin, hierbij moet je eerst de instellingen invoeren.
4
En daarna kan je een script als simpletest runnen.
Als je de tests draait, dan zie je in het result view of de tests geslaagd zijn of niet.
5
GroupTest Het is ook mogelijk om meerdere test te groupen en tegelijkertijd te draaien.
Versiebeheer Het is handig om gebruik te maken van versiebeheer zoals SVN of CVS bij de code, zodat als een test niet meer werkt, er terug kan worden gegaan naar een oude versie en kijken wat er mis is gegaan.
Mock objects Een onderdeel van unit testing is het testen van stukjes code die afhankelijk zijn van andere obecten, of data vanaf buitenaf zoals een database. Het is belangrijk de units te isoleren zodat afhankelijkheden zo min mogelijk voor fouten kunnen zorgen, externe data zoals een database hoort meer bij Integration tests de volgende stap in de testfase. Om dit probleem op te lossen kan er gebruik worden gemaakt van Mock objecten, Mock objecten zijn objecten die het gedrag van het echte object simuleren. De API is hetzelfde als het echte object het is mogelijk om test data op te zetten welke het mock object moet returnen. Het genereren van een Mock object gaat als volgt: Mock::generate('ClassName'); SimpleTest maakt dan een kopie van de class welke je kan aanroepen als volgt: 6
$class = new MockClassName($this); Je kan dan een return waarde voor een method in de class aangeven: $class->setReturnValue('methodName', 'Value');
Conclusie Door middel van unit testing in je project te gebruiken kan je fouten in je applicatie voorkomen en snel oplossen. Het komt vooral van pas in grotere applicaties waar meerdere mensen aan meewerken, maar ook bij kleinere projecten kan het veel kopzorgen voorkomen. Vooral de regressie testen zullen van pas komen bij het onderhouden en uitbreiden van de applicatie in de toekomst. Het gebruik van TDD (Test Driven Development) heeft sowieso het voordeel dat je als ontwikkelaar een beter overzicht op de API heb omdat je als eerste deze gebruik maakt bij het opzetten van de testen nog voordat je de daadwerkelijke code gaat schrijven. Hierdoor is het mogelijk om nog in de beginfase wijzigingen in de API aan te brengen waar je misschien eerder nog niet aan had gedacht.
7