Blog IT, Blog Marketing

Asercje w PHPUnit

Asercje w PHPUnit

Marcin Sarna , 26.03.2021 r.

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: assertEqualsassertSame.

W średnich projektach, np. REST API zbudowanym z wykorzystaniem Symfony, najpopularniejsze bywają assertSame, assertEquals, assertTrueassertCount. 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, actualnmessage (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');
}

Najnowsze oferty pracy:

Polecane wpisy na blogu IT:

Szukasz pracownika IT?

Dostarczymy Ci najlepszych specjalistów z branży IT. Wyślij zapytanie

Wyrażam zgodę TeamQuest Sp. z o.o. na przetwarzanie moich danych osobowych w celu marketingu produktów i usług własnych TeamQuest, w tym na kontaktowanie się ze mną w formie połączenia telefonicznego lub środkami elektronicznymi.
Administratorem podanych przez Ciebie danych osobowych jest TeamQuest Sp. z o.o., z siedzibą w Warszawie (00-814), ul. Miedziana 3a/21, zwana dalej „Administratorem".
Jeśli masz jakiekolwiek pytania odnośnie przetwarzania przez nas Twoich danych, skontaktuj się z naszym Inspektorem Ochrony Danych (IOD). Do Twojej dyspozycji jest pod adresem e-mail: office@teamquest.pl.
W jakim celu i na jakiej podstawie będziemy wykorzystywać Twoje dane? Dowiedz się więcej