Определение фикстур
===================

Автоматические тесты необходимо выполнять неоднократно. Мы хотели бы выполнять
тесты в некоторых известных состояниях для гарантии повторяемости процесса
тестирования. Эти состояния называются *фикстуры*. Например, для тестирования
функции создания записи в приложении блога, каждый раз, когда мы выполняем
тесты, таблицы, хранящие соответствующие данные о записях (например, таблицы
`Post`, `Comment`), должны быть восстановлены к некоторому фиксированому
состоянию. [Документация по PHPUnit](http://www.phpunit.de/manual/current/en/fixtures.html)
хорошо описывает основную установку фикстур. В основном в этом разделе мы
описываем установку фикстур базы данных так, как мы только что описали в
примере.

Установка фикстур базы данных является, наверное, одной из наиболее
длительных частей в тестировании основанных на БД веб-приложений. Yii
вводит компонент приложения [CDbFixtureManager] для облегчения этой проблемы.
В основном он делает следующие вещи при выполнении ряда тестов:

 * Перед выполнением всех тестов сбрасывает все таблицы, относящиеся к тестам к некоторому известному состоянию.
 * Перед выполнением отдельного тестового метода сбрасывает определенные таблицы к некоторому известному состоянию.
 * Во время выполнения тестового метода обеспечивает доступ к строкам данных, которые вносятся в фикстуру.

Для использования компонента [CDbFixtureManager], мы настраиваем его в
[конфигурации приложения](/doc/guide/basics.application#application-configuration)
следующим образом:

~~~
[php]
return array(
	'components'=>array(
		'fixture'=>array(
			'class'=>'system.test.CDbFixtureManager',
		),
	),
);
~~~

Далее мы сохраняем данные фикстуры в директории `protected/tests/fixtures`. Эта
директория может быть настроена свойством [CDbFixtureManager::basePath]
конфигурации приложения. Данные фикстур организованы как коллекция PHP-файлов,
называемых файлами фикстур. Каждый файл фикстуры возвращает массив,
представляющий начальные строки данных для конкретной таблицы. Имя файла -
такое же, как название таблицы. Далее приведен пример данных фикстуры для
таблицы `Post`, сохраненной в файле `Post.php`:

~~~
[php]
<?php
return array(
	'sample1'=>array(
		'title'=>'Тестовая запись 1',
		'content'=>'Содержимое тестовой записи 1',
		'createTime'=>1230952187,
		'authorId'=>1,
	),
	'sample2'=>array(
		'title'=>'Тестовая запись 2',
		'content'=>'Содержимое тестовой записи 2',
		'createTime'=>1230952287,
		'authorId'=>1,
	),
);
~~~

Как видим, в коде выше возвращаются 2 строки данных. Каждая строка представлена
в виде ассоциативного массива, ключи которого — это имена столбцов, а значения
- значения соответствующих столбцов. Кроме того, каждая строка индексирована
строкой (например `sample1`, `sample2`), которую называют *псевдоним строки*.
Позже, когда мы пишем тестовые скрипты, мы можем легко обращаться к строке по
ее псевдониму. Мы опишем это подробно в следующем разделе.

Вы могли заметить, что мы не определяем значения столбца `id` в коде фикстуры
выше. Это потому, что столбец `id` — автоинкрементный первичный ключ, значение
которого будет заполнено при вставке новых строк.

При первом обращении к компоненту [CDbFixtureManager] он будет просматривать
каждый файл фикстуры и использовать его для сброса соответствующей таблицы. Он
сбрасывает таблицу, очищая её, сбрасывая значение первичного ключа, и затем
вставляя строки данных из файла фикстуры в таблицу.

Иногда мы не хотим сбрасывать каждую таблицу, имеющую файл фикстуры, прежде,
чем мы выполним ряд тестов, потому что сброс слишком многих файлов фикстур
может занять длительное время. В этом случае, мы можем написать PHP-скрипт для
возможности настройки работы инициализации. PHP-скрипт должен быть сохранен в
файле `init.php` в той же директории, что и файлы фикстур. Когда компонент
[CDbFixtureManager] обнаружит этот скрипт, он выполнит этот скрипт вместо того,
чтобы сбрасывать каждую таблицу.

Также возможно, что нам не нравится способ сброса таблицы по умолчанию, то
есть, очистка таблицы полностью и вставка данных фикстуры. Если дело обстоит
так, мы можем написать скрипт инициализации для определенного файла фикстуры.
Скрипт должен иметь имя, в начале которого идет имя таблицы, а далее -
`.init.php`. Например, скрипт инициализации для таблицы `Post` назывался бы
`Post.init.php`. Когда компонент [CDbFixtureManager] увидит этот скрипт, он
выполнит скрипт вместо того, чтобы использовать значение сброса таблицы по
умолчанию.

> Tip|Подсказка: Наличие большого количества файлов фикстур может сильно
увеличить время выполнения теста. Поэтому, Вы должны создавать файлы фикстур
только для тех таблиц, содержание которых может измениться во время теста.
Таблицы, которые служат для просмотра, не изменяются и, таким образом, не
нуждаются в файлах фикстур.

В следующих двух разделах мы опишем, как использовать фикстуры, которыми
управляет компонент [CDbFixtureManager], в модульных и функциональных тестах.