mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-10 01:56:54 +01:00
109 lines
8.3 KiB
Plaintext
109 lines
8.3 KiB
Plaintext
Определение фикстур
|
||
===================
|
||
|
||
Автоматические тесты необходимо выполнять неоднократно. Мы хотели бы выполнять
|
||
тесты в некоторых известных состояниях для гарантии повторяемости процесса
|
||
тестирования. Эти состояния называются *фикстуры*. Например, для тестирования
|
||
функции создания записи в приложении блога, каждый раз, когда мы выполняем
|
||
тесты, таблицы, хранящие соответствующие данные о записях (например, таблицы
|
||
`Post`, `Comment`), должны быть восстановлены к некоторому фиксированому
|
||
состоянию. [Документация по PHPUnit](http://www.phpunit.de/wiki/Documentation)
|
||
хорошо описывает основную установку фикстур. В основном в этом разделе мы
|
||
описываем установку фикстур базы данных так, как мы только что описали в
|
||
примере.
|
||
|
||
Установка фикстур базы данных является, наверное, одной из наиболее
|
||
длительных частей в тестировании основанных на БД веб-приложений. 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], в модульных и функциональных тестах.
|
||
|
||
<div class="revision">$Id: test.fixture.txt 1148 2009-06-18 22:06:22Z qiang.xue $</div>
|