Definicja #
PHPUnit to framework do testowania jednostkowego w PHP, stworzony przez Sebastiana Bergmanna. Jest de facto standardem testowania w ekosystemie PHP — używany powszechnie w projektach Laravel, Symfony, Drupal i Magento.
Kluczowe elementy PHPUnit:
- Klasy testów — klasy dziedziczące po
PHPUnit\Framework\TestCase; metody testowe muszą zaczynać się od prefixutestlub mieć adnotację@test - Asercje — bogaty zestaw asercji:
assertEquals(),assertTrue(),assertInstanceOf(),assertCount(),assertThrows()i wiele innych - Data Providers — metody dostarczające zestawów danych testowych przez adnotację
@dataProvider; pozwala uruchomić ten sam test z wieloma wejściami - Mockowanie — wbudowany framework do tworzenia mocków i stubów:
$this->createMock(),expects(),willReturn() - Test Doubles — mock, stub, spy, fake — izolacja jednostki testowanej od zewnętrznych zależności
- Code Coverage — raport pokrycia kodu testami generowany przez Xdebug lub pcov; wizualizacja w HTML lub Clover XML
- Test Suite i konfiguracja — plik
phpunit.xmllubphpunit.xml.distkonfiguruje zestawy testów, bootstrap i raportowanie
PHPUnit jest ściśle zintegrowany z frameworkami PHP: Laravel dostarcza własną klasę bazową Tests\TestCase z helpersami do testowania aplikacji (HTTP tests, database transactions, mocking facades). Symfony integruje PHPUnit przez WebTestCase i KernelTestCase.
Zastosowania #
- Testy jednostkowe logiki biznesowej — izolowane testowanie serwisów, repozytoriów i obiektów domenowych PHP
- Testy integracyjne w Laravel i Symfony — testowanie kontrolerów, middleware i warstwy bazy danych z test database
- Testy HTTP w Laravel —
$this->get(),$this->post(),assertStatus()do testowania endpointów API - TDD w PHP — cykl red-green-refactor z PHPUnit jako narzędziem weryfikującym każdy krok
- CI/CD pipeline — uruchamianie PHPUnit automatycznie przy każdym commicie (GitHub Actions, GitLab CI)
Ścieżka nauki #
PHPUnit jest obowiązkowym elementem zestawu umiejętności każdego PHP developera pracującego w projektach profesjonalnych.
Zacznij od:
- Instalacja:
composer require --dev phpunit/phpunit - Pierwszy test: klasa dziedzicząca po
TestCase, metodatestNazwa()z asercją - Uruchamianie:
./vendor/bin/phpunitlubphp artisan testw Laravel - Asercje:
assertEquals,assertTrue,assertNull,expectException
Następnie pogłębiaj:
- Data Providers — parametryzowane testy z wieloma zestawami danych wejściowych
- Mockowanie — izolacja zależności przez
createMock()icreateStub() - Code Coverage — konfiguracja Xdebug i generowanie raportów HTML
- Laravel Testing —
RefreshDatabase, factory, HTTP tests,actingAs() - Integracja z CI: konfiguracja GitHub Actions do uruchamiania testów przy PR
FAQ #
- Czym jest PHPUnit i do czego służy?
- PHPUnit to framework do automatycznego testowania kodu PHP. Pozwala pisać testy sprawdzające poprawność działania klas i metod PHP. Jest standardem w ekosystemie PHP — używany w projektach Laravel, Symfony, Drupal. Automatyczne testy wykrywają regresje i dają pewność, że zmiany kodu nie psują istniejącej funkcjonalności.
- Jak działa mockowanie w PHPUnit?
- PHPUnit tworzy mock obiekt zastępujący prawdziwą zależność (np. bazę danych, zewnętrzne API). Mock pozwala określić: jakie metody zostaną wywołane, ile razy, z jakimi argumentami i co mają zwrócić. Dzięki temu test jest izolowany — nie wymaga działającej bazy ani zewnętrznego serwisu.
- Czym różni się phpunit.xml od phpunit.xml.dist?
- phpunit.xml.dist to plik konfiguracji dostarczany z projektem (commitowany do repozytorium) — zawiera domyślne ustawienia. phpunit.xml to lokalne nadpisanie (w .gitignore) — każdy developer może dostosować konfigurację do swojego środowiska. PHPUnit preferuje phpunit.xml jeśli istnieje, w przeciwnym razie używa phpunit.xml.dist.
- Jak mierzyć pokrycie kodu testami w PHPUnit?
- PHPUnit generuje raport Code Coverage przez Xdebug lub pcov. Uruchomienie: <code>./vendor/bin/phpunit --coverage-html coverage/</code>. Raport HTML pokazuje które linie i gałęzie kodu są pokryte testami. Pokrycie 80%+ jest dobrym celem dla nowych modułów, ale jakość testów ważniejsza niż metryka pokrycia.