Функціональне тестування
========================

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