Post hoe PHPunit op te zetten in Laravel + een eerste test maken.
Van plan om test-driven development (TDD) te introduceren in je project/team?
Standaard komt Laravel al met een feature en unit test functionaliteit, deze hoef je dus zelf niet meer op te zetten.
Er al een example unit en feature test in die je meteen kan uitvoeren. Dit doe je door naar de command line in de root van je Laravel project gaan.Typ daar in:
vendor/bin/phpunit
Laravel zal nu je testen uitvoeren.
SQLlite database
Wil je ook testen maken die database functionaliteit gaat testen, dan is het handig om daarvoor een andere database te gebruiken dan waar je op ontwikkeld.
Ook hiervoor heeft Laravel al een oplossing. Open het bestand ‘phpunit.xml’ in de root van je Laravel project.
Daar zie je dat de SQLlite tussen comments staan, haal deze weg om SQLlite te gebruiken.
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
Je eerste test maken
Standaard komt Laravel al met een voorbeeld feature test, deze kan je vinden in tests/Feature/ExampleTest.php
We gaan nu een test erbij maken in dit bestand. Ik ga er even vanuit dat je een standaard installatie van Laravel (versie 7) hebt.
Om een test werkend te maken moet de functie beginnen met test of moet de commend block
@test
bevatten.
Heb je dit niet dan zal deze test worden overgeslagen.
Maak van de functienaam een omschrijving. Dus niet test_een_link maar test_de_link_die_naar_de_laravel_docs_gaat.
Ze de volgende functie erbij:
/**
* @test
*/
public function find_link_to_the_laravel_docs_on_the_homepage() {
$this->get('/')
->assertSee('docs');
}
Heel basic maar we gaan kijken of we ‘docs’ kunnen terugvinden op de homepage.
Run in de CLI
vendor/bin/phpunit
Als het goed is gegaan, zou je ongeveer het volgende moeten zien.
Je test laten falen
In plaats van te zoeken naar ‘docs’, zet hier iets anders neer, bijvoorbeeld ‘hello world’.
Als het goed is zal je test nu falen.
Enkele test uitvoeren
Omdat je nu pas 3 testen hebt zal het snel gaan en nog geen foutmeldingen krijgen. Heb je straks meerdere testen en wil je alleen een enkele test uitvoeren dan kan dit met de optie
--filter
Per bestand, gebruik de naam van je testbestand voorbeeld:
vendor/bin/phpunit --filter ExampleTest
Alleen hebben zowel de unit als feature test dezelfde naam dus zullen nu alsnog alle testen worden uitgevoerd.
Per functie, bijvoorbeeld
vendor/bin/phpunit --filter find_link_to_the_laravel_docs_on_the_homepage
Unit test in Docker
Gebruik je docker, dan werkt
vendor/bin/phpunit
(uiteraard) niet.
gebruik dan het volgende om de test suite uit te voeren.
docker-compose exec php ./vendor/bin/phpunit
php is de naam van je php package, gebruik je een andere naam vul deze dan in.