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