Testy funkcjonalne ================== Zanim przeczytasz ten rozdział, zaleca się abyś przeczytał najpierw [dokumentację Selenium](http://seleniumhq.org/docs/) oraz [dokumentację PHPUnit](http://www.phpunit.de/wiki/Documentation). 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], gdzie `Xyz` oznacza klasę, która będzie testowana. Ponieważ `PHPUnit_Extensions_SeleniumTestCase` jest 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 katalogu `protected/tests/functional`. * Klasa testująca zawiera przede wszystkim zestaw metod testujących o nazwie `testAbc`, gdzie `Abc` często jest nazwą funkcjonalności, którą będziemy testować. Na przykład, aby przetestować funkcjonalność logowania użytkownika, możemy posiadać metodę o nazwie `testLogin`. * 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. ~~~ [php] define('TEST_BASE_URL','http://localhost/yii/demos/blog/index-test.php/'); class WebTestCase extends CWebTestCase { /** * Sets up before each test method runs. * This mainly sets the base URL for the test application. */ protected function setUp() { parent::setUp(); $this->setBrowserUrl(TEST_BASE_URL); } ...... } ~~~ 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](http://www.yiiframework.com/demos/blog). 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: ~~~ [php] class PostTest extends WebTestCase { public $fixtures=array( 'posts'=>'Post', ); public function testShow() { $this->open('post/1'); // sprawdź czy tytuł przykładowego postu istnieje $this->assertTextPresent($this->posts['sample1']['title']); // sprawdź czy formularz komentarza istnieje $this->assertTextPresent('Zostaw komentarz'); } ...... } ~~~ 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`.
$Id: test.functional.txt 1662 2010-01-04 19:15:10Z qiang.xue $