Функциональное тестирование =========================== Перед прочтением даного раздела рекомендуется прочитать [документацию по Selenium](http://seleniumhq.org/docs/) и [документацию по PHPUnit](http://www.phpunit.de/wiki/Documentation). Дальше мы подытожим основные принципы написания функциональных тестов в Yii: * Как и модульный тест, функциональный тест пишется в классе `XyzTest`, наследующего класс [CWebTestCase], где `Xyz` — имя класса, подлежащего тестированию. Мы можем использовать все методы класса `PHPUnit_Extensions_SeleniumTestCase`, потому что он является предком класса [CWebTestCase]. * Класс функционального теста сохраняется в файле с именем `XyzTest.php`. По соглашению, файл функционального теста может храниться в директории `protected/tests/functional`. * Основное содержимое класса теста — набор тестовых методов с именами `testAbc`, где `Abc` — часто имя тестируемой особенности. Например, для тестирования особенности входа пользователя у нас есть метод `testLogin`. * Тестовый метод обычно содержит последовательность выражений, которые будут являться командами проверки для Selenium RC, показывающей ход и результаты тестирования веб-приложения. В нем также содержатся выражения утверждений для проверки, что веб-приложение отвечает именно так, как ожидалось. Перед описанием, как же писать функциональный тест, давайте глянем файл `WebTestCase.php`, сгенерированный командой `yiic webapp`. Этот файл определяет класс `WebTestCase`, который может служить базовым для всех классов функциональных тестов. ~~~ [php] 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`. Теперь мы опишем, как протестировать функцию отображения записи [демо-блога](http://www.yiiframework.com/demos/blog). Сначала мы пишем тестовый класс, как показано ниже. Отметим, что тестовый класс наследует от базового класса, который мы только что описали: ~~~ [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`. > Tip|Подсказка: Перед запуском функциональных тестов запустите сервер Selenium-RC. > Сделать это можно командой `java -jar selenium-server.jar`, выполненной в > директории, в которую установлен Selenium.