Автоматичні тести необхідно виконувати неодноразово. Ми хотіли б виконувати тести у деяких відомих станах для гарантії повторюваності процесу тестування. Ці стани називаються фікстури. Наприклад, для тестування функції створення запису в додатку блога, кожен раз, коли ми виконуємо тести, таблиці, що зберігають відповідні дані про записи (наприклад, таблиці Post
, Comment
), повинні бути відновлені до деякого фіксованого стану. Документація по PHPUnit (https://www.phpunit.de/manual/current/en/fixtures.html) добре описує основне встановлення фікстур. В основному в цьому розділі ми описуємо установку фікстур бази даних так, як ми тільки що описали у прикладі.
Установка фікстур бази даних є, напевно, однією з найбільш тривалих частин у тестуванні, заснованих на БД веб-додатків. Yii вводить компонент додатка CDbFixtureManager для полегшення цієї проблеми. В основному він робить наступні речі при виконанні ряду тестів:
Для використання компонента CDbFixtureManager, ми налаштовуємо його в конфігурації додатка наступним чином:
return array(
'components'=>array(
'fixture'=>array(
'class'=>'system.test.CDbFixtureManager',
),
),
);
Далі ми зберігаємо дані фікстури в директорії protected/tests/fixtures
. Ця директорія може бути налаштована властивістю CDbFixtureManager::basePath конфігурації додатка. Дані фікстур організовані як колекція PHP-файлів, які називаються файлами фікстур. Кожен файл фікстури повертає масив, що представляє початкові рядки даних для конкретної таблиці. Імʼя файлу — таке ж, як назва таблиці. Далі наведено приклад даних фікстури для таблиці Post
, збереженої у файлі Post.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 побачить цей скрипт, він виконає скрипт замість того, щоб використовувати значення скидання таблиці за замовчуванням.
Підказка: Наявність великої кількості файлів фікстур може сильно збільшити час виконання тесту. Тому, Ви повинні створювати файли фікстур тільки для тих таблиць, вміст яких може змінитися під час тесту. Таблиці, які служать для перегляду, не змінюються і, таким чином, не потребують файлів фікстур.
У наступних двох розділах ми опишемо, як використовувати фікстури, якими управляє компонент CDbFixtureManager, в модульних і функціональних тестах.