Функциональное тестирование

Перед прочтением даного раздела рекомендуется прочитать документацию по Selenium и документацию по PHPUnit. Дальше мы подытожим основные принципы написания функциональных тестов в Yii:

  • Как и модульный тест, функциональный тест пишется в классе XyzTest, наследующего класс CWebTestCase, где Xyz — имя класса, подлежащего тестированию. Мы можем использовать все методы класса PHPUnit_Extensions_SeleniumTestCase, потому что он является предком класса CWebTestCase.

  • Класс функционального теста сохраняется в файле с именем XyzTest.php. По соглашению, файл функционального теста может храниться в директории protected/tests/functional.

  • Основное содержимое класса теста — набор тестовых методов с именами testAbc, где Abc — часто имя тестируемой особенности. Например, для тестирования особенности входа пользователя у нас есть метод testLogin.

  • Тестовый метод обычно содержит последовательность выражений, которые будут являться командами проверки для Selenium RC, показывающей ход и результаты тестирования веб-приложения. В нем также содержатся выражения утверждений для проверки, что веб-приложение отвечает именно так, как ожидалось.

Перед описанием, как же писать функциональный тест, давайте глянем файл WebTestCase.php, сгенерированный командой yiic webapp. Этот файл определяет класс WebTestCase, который может служить базовым для всех классов функциональных тестов.

define('TEST_BASE_URL','http://localhost/yii/demos/blog/index-test.php/');
 
class WebTestCase extends CWebTestCase
{
    /**
     * Метод выполняется перед запуском теста.
     * В основном, устанавливает базовый URL тестируемого приложения.
     */
    protected function setUp()
    {
        parent::setUp();
        $this->setBrowserUrl(TEST_BASE_URL);
    }}

Класс WebTestCase в основном устанавливает базовый URL тестируемых страниц. Далее, в тестовых методах, мы можем использовать относительные URL для определения тестируемых страниц.

Мы также должны обратить внимание, что согласно базового тестового URL в качестве входной точки используется файл index-test.php вместо файла index.php. Единственное различие между сценариями index-test.php и index.php то, что в качестве файла конфигурации приложения первый использует файл test.php, а второй — файл main.php.

Теперь мы опишем, как протестировать функцию отображения записи демо-блога. Сначала мы пишем тестовый класс, как показано ниже. Отметим, что тестовый класс наследует от базового класса, который мы только что описали:

class PostTest extends WebTestCase
{
    public $fixtures=array(
        'posts'=>'Post',
    );
 
    public function testShow()
    {
        $this->open('post/1');
        // проверяем наличие заголовка некой записи
        $this->assertTextPresent($this->posts['sample1']['title']);
        // проверяем наличие формы комментария
        $this->assertTextPresent('Leave a Comment');
    }}

Как и при написании класса модульного теста, мы объявляем фикстуры для использования этим тестом. Здесь мы показываем, что должна использоваться фикстура Post. В тестирующем методе testShow мы сначала поручаем Selenium RC открыть URL post/1. Заметим, что это относительный URL, а полный URL формируется путем добавления относительного к базовому URL (т.е. http://localhost/yii/demos/blog/index-test.php/post/1), который мы установили в базовом классе. Затем мы проверяем, что можем найти заголовок записи sample1 на данной странице. И мы также проверяем, что страница содержит текст Leave a comment.

Подсказка: Перед запуском функциональных тестов запустите сервер Selenium-RC. Сделать это можно командой java -jar selenium-server.jar, выполненной в директории, в которую установлен Selenium.

Be the first person to leave a comment

Please to leave your comment.