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

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