0 follower

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 testów, które bedziemy używać podczas testowania. Tutaj wkazaliśmy, iż użyta będzie konfiguracja testu Post. 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.

Found a typo or you think this page needs improvement?
Edit it on github !