Testy funkcjonalne
Zanim przeczytasz ten rozdział, zaleca się abyś przeczytał najpierw dokumentację Selenium oraz dokumentację PHPUnit. W dalszej części streszczamy pokrótce podstawowe zasadu pisania testów funkcjonalnych w Yii.
Tak jak w testach jednostkowych, testy funkcjonalne są zapisywane jako klasy
XyzTest, które dziedziczą z CWebTestCase, gdzieXyzoznacza klasę, która będzie testowana. PonieważPHPUnit_Extensions_SeleniumTestCasejest rodzicem dla klasy CWebTestCase, możemy używac wszystkich metod dziedziczących z tej klasy.Klasa testu funkcjonalnego zachowana jest w pliku PHP o nazwie
XyzTest.php. Umownie, plik testu funkcjonalnego może być zapisany w kataloguprotected/tests/functional.Klasa testująca zawiera przede wszystkim zestaw metod testujących o nazwie
testAbc, gdzieAbcczęsto jest nazwą funkcjonalności, którą będziemy testować. Na przykład, aby przetestować funkcjonalność logowania użytkownika, możemy posiadać metodę o nazwietestLogin.Metoda testująca zazawyczaj zawiera sekwencję wyrażeń, które wydają komendy Selenium RC by oddziaływało ono z aplikacją sieciową, która jest testowana. Zawiera ona również
wyrażenia z asercjami w celu zweryfikowania, czy aplikacja sieciowa odpowiedziała zgodnie z tym jak oczekiwano.
Zanim opiszemy jak napisać test funkcjonalny, popatrzmy na plik WebTestCase.php
wygenerowany przez komendę yiic webapp. Plik ten definiuje WebTestCase,
który może służyć jako klasa bazowa dla testów funkcjonalnych wszystkich klas.
Klasa WebTestCase przede wszystkim ustawia adres bazowy URL strony, która będzie
testowana. Później, w metodach testujących, możemy używać relatywne adresy URL
w celu określenia, która strona powinna być przetestowana.
Powinniśmy też zwrócić uwagę, na to że w adresie bazowym URL używamy index-test.php
jako pliku wejściowego zamiast index.php. Jedyna różnica pomiędzy index-test.php a index.php
to ta, że pierwsza używa test.php jako pliku konfiguracji aplikacji, gdy druga
używa main.php.
Opiszemy teraz jak przetestować funkcjonalność wyświetlania postów w demo blogu. Najpierw napiszemy klasę testującą w następujący sposób, zauważając iż klasa testowa dziedziczy z klasy bazowej, którą przed chwilką opisaliśmy:
Tak jak pisząc klasy testów jednostkowych, tak i tutaj deklarujemy konfiguracje
testuów, które bedziemy używać podczas testowania. Tutaj wkazaliśmy, iż
konfiguracja testu Post będzie użyta. W metodzie testującej testShow,
najpierw poinstruowaliśmy Selenium RC aby otwarło adres URL post/1.
Zauważ, że jest to relatywny adres URL a kompletny adres URL jest utworzony
poprzez dołączenie do niego adresu bazowego URL, który ustawiliśmy w klasie
bazowej (np. http://localhost/yii/demos/blog/index-test.php/post/1).
Następnie weryfikujemy czy możemy znaleźć tytuł postu sample1 na aktualnej stronie.
Sprawdzamy również, czy strona zawiera tekst Zostaw komentarz.