Co używać i jak - kilka przykładów z praktyki.
PHPUnit
PHPUnit chyba nie ma liczącej się konkurencji w testowaniu skryptów ciągle niechcącego umrzeć PHP od ponad 5 lat. Obecnie PHPUnit jest w wersji 9.5. Zgodnie z najnowszą dokumentacją istnieje 60 metod asercji, których możesz użyć w testach PHPUnit ale przecież nie wszystkie trzeba znać żeby sobie radzić ;-)
Najpopularniejsze asercje dla małych, średnich i dużych projektów
To co na pewno musisz znać dla małych projektów to assertEquals
, assertSame
, assertCount
. Rzadziej skorzystasz z assertArrayHasKey
, assertNotEmpty
czy AssertNull
. Ponad połowa przypadków użycia asercji zamyka się najczęściej w dwóch typach: assertEquals
i assertSame
.
W średnich projektach, np. REST API zbudowanym z wykorzystaniem Symfony, najpopularniejsze bywają assertSame
, assertEquals
, assertTrue
i assertCount
. Co najciekawsze w dużych projektach, z API i interfejsem użytkownika, assertEquals
także wygrywa popularnością. Dopiero potem są assertTrue
, assertInstanceOf
czy assertSame
.
Naprawdę nie musisz więc dogłębnie znać wszystkich możliwości PHPUnit aby dobrze testować swoje „słonikowe” projekty.
Asercje w praktyce
Testy asercji w PHPUnit składają się z trzech elementów: expected, actualn i message (ten ostatni jest opcjonalny i oznacza komunikat wyświetlany w razie niepowodzenia testu). Na przykład $this->assertEquals('1', '0', 'check if 1 is 1');
sprawdza czy 1 jest równe 0 i w efekcie otrzymamy oczywiście błąd:
There was 1 failure:
1)FCQN::testAssertEqualsFail
check if 1 is 1
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'1'
+'0'
Asercje mniej popularne a przydatne
assertJsonStringEqualsJsonString pozwala wygodnie testować odpowiedzi API – umożliwia sprawdzenie czy otrzymany ciąg JSON odpowiada temu co chcieliśmy otrzymać. Na przykład:
$this->assertJsonStringEqualsJsonString(
'{"message": "ok"}',
json_encode(["message" => "ok"]),
'Check message ok json'
);
assertMatchesRegularExpression oraz assertRegExp (stara nazwa w PHPUnit 8.5) badają ciąg znaków z użyciem wyrażenia regularnego co przydaje się na przykład przy testach poprawności wyświetlanych komunikatów o błędach, które mają ustaloną strukturę. Załóżmy, że chcemy sprawdzić czy podany komunikat zawiera w sobie liczbę 40 i dowolną kolejną cyfrę (czyli np. błąd 404):
$this->assertRegExp(
'/Exception 40\d/',
'Exception 501',
'Check if it is exception 40x'
);
Sprawdź oferty pracy na TeamQuest
assertStringContainsString testuje string pod kątem obecności w nim innego stringa. Jeśli chcesz ignorować wielkość znaków użyjesz assertStringContainsStringIgnoringCase. Przykład:
$this->assertStringContainsString(
'Error',
'Error id is required, the quote is required',
'Check if word Error is present'
);
Gdy chcesz testować wartość liczbową w zaokrągleniu, tj. z jakąś tolerancją na odstępstwa, posłuż się assetEqualsWithDelta:
$this->assertEqualsWithDelta(34.3, 34.1, 0.5, '0.5 degree variance in temperature is allowed');
Wreszcie assertArrayHasKey – jeżeli zwracanym typem jest tablica to ta asercja powoli Ci sprawdzić czy tablica zawiera określony klucz, przed sprawdzeniem wartości. Na przykład:
public function testAssertArrayHasKey()
{
$exchangeRates = ['usd' => 0.77, 'euro' => 0.63];
$this->assertArrayHasKey('usd', $exchangeRates, 'Check if USD is available');
$this->assertEquals(0.77, $exchangeRates['usd'], 'Test if USD rate is 0.77');
}