Testen met PHPunit in Laravel + je eerste test maken

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.

PHPunittest resultaat

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.

Docker PHP package naam