Difference between revisions of "Tests"

From A-Eskwiki
Jump to: navigation, search
(Created page with "We hebben een systeem voor testing zelf gebouwd omdat alle standaard PHP-oplossingen niet bepaald gebruiksvriendelijk zijn. Tests worden uitgevoerd op de vm-www-debug, dus ze...")
 
(Om tests te maken: Tests voor pagina's zelf toevoegen.)
 
(3 intermediate revisions by the same user not shown)
Line 4: Line 4:
  
 
Als je code hebt geschreven, is het de bedoeling dat je test dat er niets stukging. Dit doe je met <code>./manage test</code> in je <code>wwwdebug/www</code>-map.
 
Als je code hebt geschreven, is het de bedoeling dat je test dat er niets stukging. Dit doe je met <code>./manage test</code> in je <code>wwwdebug/www</code>-map.
 +
 +
Ook kun je naar <code>https://$bla-debug.a-eskwadraat.nl/Service/Intern/Test/</code> gaan om een mooie grafische webinterface te zien.
  
 
== Om tests te maken ==
 
== Om tests te maken ==
  
Maak in <code>scripts/test</code> een php-bestand waarvan de naam begint met <code>test</code>, zoals bijvoorbeeld <code>test_periodes.php</code>. Stop hier functies in die code executeren (bijvoorbeeld <code>function test_voorbeeld() { ... }</code>, en een statement daaronder <code>new FunctieTest('test_voorbeeld');</code>. Een test telt als gefaald dan en slechts dan als er een error / exception is gebeurd. (Overigens telt die()/exit() ook als error, want dat wil je ook gewoon niet gebruiken ☺).
+
Maak in <code>scripts/test</code> een php-bestand waarvan de naam begint met <code>test</code>, zoals bijvoorbeeld <code>test_periodes.php</code>. <!-- Dit is uitgecomment in de veronderstelling dat https://git.a-eskwadraat.nl/webcie/website/pulls/24 gemerged wordt: Stop hier functies in die code executeren (bijvoorbeeld <code>function test_voorbeeld() { ... }</code>, en een statement daaronder <code>new FunctieTest('test_voorbeeld');</code>. -->
 +
Een simpele test kun je maken door een aanroep als <code>$runner->def('testvoorbeeld', function () { ... });</code>, waarin je dan de te teste aanroepen neerzet. Voor meer configuratie kun je een TestFactory gebruiken, zoals bijvoorbeeld: <code>$runner->nieuw('uitgebreid testvoorbeeld')->fixture(new VoorbeeldFixture())->uitgesteld()->doet(function() { ... })->registreer();</code>. (Zie die class voor alle opties.)
 +
 
 +
Een test telt als gefaald dan en slechts dan als er een error / exception is gebeurd. (Overigens telt die()/exit() ook als error, want dat wil je ook gewoon niet gebruiken ☺).
 +
 
 +
=== Fixtures ===
 +
 
 +
[https://en.wikipedia.org/wiki/Test_fixture Fixtures] zorgen ervoor dat benodigdheden voor een test opgezet en afgebroken worden. Denk hier bijvoorbeeld aan chdir'en naar de juiste locatie of objecten aanmaken. Je kan voor het testhuis een fixture maken door de interface <code>Fixture</code> te implementeren. De methode <code>erin</code> wordt aangeroepen vlak voordat de test begint, en kan bijvoorbeeld een object in de database stoppen. De methode <code>eruit</code> wordt net na de (geslaagde of gefaalde) test en kan bijvoorbeeld dit object weer uit de database halen. De returnwaarde van <code>erin</code> wordt aan de geteste functie meegegeven, op volgorde van declaratie. Bijvoorbeeld:
 +
 
 +
<code language="php">
 +
<pre>
 +
$runner
 +
    ->nieuw('testvoorbeeld van fixtures')
 +
    ->fixture(new ActiviteitMakerFixture())
 +
    ->fixture(new CommissieMakerFixture())
 +
    ->doet(function ($act, $cie) { ... })
 +
    ->registreer();
 +
</pre>
 +
</code>
 +
 
 +
=== Pagina's testen ===
 +
 
 +
<!-- TODO: als feature-responses gemerged is, haal deze disclaimer weg -->(Dit werkt alleen op de branch feature-responses!)
 +
In <code>test_benamite_contents.php</code> staat code om alle "gewone" (dus zonder variabele entries) pagina's in Benamite automatisch te testen. Ongeveer de helft van alle pagina's in Benamite worden dus automatisch getest.
 +
Je hebt ook de mogelijkheid om tests op pagina's uit te voeren op basis van hun URL. Dit wil je dus doen als je een PHP-haak of variabele entry in je pad naar de pagina hebt. Hiervoor gebruik je de <code>urlDiscovery</code>-functie. Dat ziet er ongeveer als volgt uit:
  
Geavanceerdere testopzet kun je doen met behulp van klasses als <code>UitgesteldeTest</code>, zie de inhoud van <code>scripts/test/init.php</code> voor allemaal (TODO: stop dit ook in Doxygen).
+
<code language="php">
 +
<pre>
 +
<?php
 +
require_once('test/support/vfsEntry.php');
 +
use WhosWho4\TestHuis;
 +
urlDiscovery($this, TSJAK_BASE . "37/index.html");
 +
urlDiscovery($this, TSJAK_BASE . "37/Wijzig");
 +
</pre>
 +
</code>
  
 
== Hoe de code werkt ==
 
== Hoe de code werkt ==

Latest revision as of 21:21, 17 March 2018

We hebben een systeem voor testing zelf gebouwd omdat alle standaard PHP-oplossingen niet bepaald gebruiksvriendelijk zijn. Tests worden uitgevoerd op de vm-www-debug, dus ze passen ook de debugdatabase aan.

Om tests te runnen

Als je code hebt geschreven, is het de bedoeling dat je test dat er niets stukging. Dit doe je met ./manage test in je wwwdebug/www-map.

Ook kun je naar https://$bla-debug.a-eskwadraat.nl/Service/Intern/Test/ gaan om een mooie grafische webinterface te zien.

Om tests te maken

Maak in scripts/test een php-bestand waarvan de naam begint met test, zoals bijvoorbeeld test_periodes.php. Een simpele test kun je maken door een aanroep als $runner->def('testvoorbeeld', function () { ... });, waarin je dan de te teste aanroepen neerzet. Voor meer configuratie kun je een TestFactory gebruiken, zoals bijvoorbeeld: $runner->nieuw('uitgebreid testvoorbeeld')->fixture(new VoorbeeldFixture())->uitgesteld()->doet(function() { ... })->registreer();. (Zie die class voor alle opties.)

Een test telt als gefaald dan en slechts dan als er een error / exception is gebeurd. (Overigens telt die()/exit() ook als error, want dat wil je ook gewoon niet gebruiken ☺).

Fixtures

Fixtures zorgen ervoor dat benodigdheden voor een test opgezet en afgebroken worden. Denk hier bijvoorbeeld aan chdir'en naar de juiste locatie of objecten aanmaken. Je kan voor het testhuis een fixture maken door de interface Fixture te implementeren. De methode erin wordt aangeroepen vlak voordat de test begint, en kan bijvoorbeeld een object in de database stoppen. De methode eruit wordt net na de (geslaagde of gefaalde) test en kan bijvoorbeeld dit object weer uit de database halen. De returnwaarde van erin wordt aan de geteste functie meegegeven, op volgorde van declaratie. Bijvoorbeeld:

$runner
    ->nieuw('testvoorbeeld van fixtures')
    ->fixture(new ActiviteitMakerFixture())
    ->fixture(new CommissieMakerFixture())
    ->doet(function ($act, $cie) { ... })
    ->registreer();

Pagina's testen

(Dit werkt alleen op de branch feature-responses!) In test_benamite_contents.php staat code om alle "gewone" (dus zonder variabele entries) pagina's in Benamite automatisch te testen. Ongeveer de helft van alle pagina's in Benamite worden dus automatisch getest. Je hebt ook de mogelijkheid om tests op pagina's uit te voeren op basis van hun URL. Dit wil je dus doen als je een PHP-haak of variabele entry in je pad naar de pagina hebt. Hiervoor gebruik je de urlDiscovery-functie. Dat ziet er ongeveer als volgt uit:

<?php
require_once('test/support/vfsEntry.php');
use WhosWho4\TestHuis;
urlDiscovery($this, TSJAK_BASE . "37/index.html");
urlDiscovery($this, TSJAK_BASE . "37/Wijzig");

Hoe de code werkt

Manage ssh't naar de vm-www-debug en roept scripts/runTests.php aan. Dit is een wrapper om scripts/test/init.php, die allerlei testinitialisatie doet, zoals WhosWho4 inladen en de testklassen. Vervolgens worden alle bestanden in script/test/ ingeladen die aan het bovengenoemde formaat voldoen, en dan een voor een de tests uitgevoerd. Met behulp van een hoop PHP-magie worden alle excepties en errors opgevangen door de TestRunner-klasse, en aan het einde van alle tests wordt een mooi overzicht van testresultaten gegenereerd.