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, 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.

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

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 $

Be the first person to leave a comment

Please to leave your comment.