Функциональное тестирование
Перед прочтением даного раздела рекомендуется прочитать документацию по 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.