Testy i debugowanie w PHP

1. Wprowadzenie

Testowanie i debugowanie w PHP jest kluczowe, aby tworzone aplikacje działały poprawnie, były stabilne i bezpieczne. Testowanie pozwala wykrywać błędy logiczne i nieprawidłowe dane, a debugowanie ułatwia analizę problemów i ich szybkie naprawienie.


2. Wyświetlanie błędów

a) Konfiguracja PHP

  • W pliku php.ini można włączyć wyświetlanie błędów:
  • W kodzie PHP można to zrobić dynamicznie:

b) Typowe funkcje do debugowania

  • var_dump($zmienna) – wyświetla typ i wartość zmiennej.
  • print_r($zmienna) – bardziej czytelny podgląd tablic i obiektów.
  • debug_backtrace() – pokazuje ścieżkę wywołań funkcji w momencie błędu.
  • get_defined_vars() – wyświetla wszystkie aktualnie zdefiniowane zmienne.

Przykład:


3. Logowanie błędów

a) Logi PHP

Można logować błędy do pliku zamiast wyświetlać je użytkownikowi:

b) Zalety

  • Bezpieczne – użytkownik nie widzi wewnętrznych informacji.
  • Ułatwia analizę problemów w środowisku produkcyjnym.

4. Debugowanie krok po kroku

a) xdebug

Xdebug to rozszerzenie PHP, które pozwala na:

  • debugowanie krok po kroku w IDE (np. PhpStorm, VSCode),
  • śledzenie stosu wywołań i wartości zmiennych,
  • profilowanie aplikacji i analizę wydajności.

Przykład użycia w VSCode:

  • Zainstaluj Xdebug.
  • Skonfiguruj IDE do nasłuchiwania portu Xdebug.
  • Ustaw breakpointy i uruchom debugowanie w przeglądarce.

5. Testy jednostkowe (Unit Testing)

a) PHPUnit

PHPUnit to standardowa biblioteka do testów jednostkowych w PHP.

  • Pozwala testować funkcje, klasy i metody w izolacji.
  • Ułatwia wykrywanie regresji i błędów logicznych.

Przykład prostego testu:

Podstawowe asercje w PHPUnit:

  • $this->assertEquals($expected, $actual) – sprawdza równość.
  • $this->assertTrue($condition) – sprawdza, czy warunek jest prawdziwy.
  • $this->assertFalse($condition) – sprawdza, czy warunek jest fałszywy.
  • $this->assertNull($variable) – sprawdza, czy zmienna jest null.

6. Testowanie funkcjonalne i integracyjne

  • Testy funkcjonalne sprawdzają, czy cała funkcja aplikacji działa zgodnie z oczekiwaniami (np. logowanie użytkownika).
  • Testy integracyjne sprawdzają współpracę wielu komponentów (np. PHP + baza danych).

W tym celu można używać:

  • PHPUnit + narzędzia do testów HTTP (np. Guzzle),
  • narzędzi do symulowania środowiska (Docker + testowe bazy danych).

7. Debugowanie w praktyce

a) Najczęstsze techniki:

  • Print Debugging: var_dump() i print_r() w miejscach, gdzie spodziewany jest błąd.
  • Breakpoints w IDE: pozwala zatrzymać program i sprawdzić wartości zmiennych.
  • Logowanie błędów: używanie error_log() w krytycznych punktach kodu.
  • Try / Catch: obsługa wyjątków i ich logowanie:

8. Dobre praktyki

  • W środowisku produkcyjnym wyłącz wyświetlanie błędów (display_errors = Off) i loguj je do pliku.
  • Stosuj testy jednostkowe i integracyjne dla krytycznych funkcji.
  • Używaj Xdebug w środowisku developerskim.
  • Nie zostawiaj var_dump ani print_r w kodzie produkcyjnym.
  • Wprowadzaj kontrolowane wyjątki (try/catch) i czytelne komunikaty błędów.