Фікстура - тестування - повне керівництво по yii 2

Фікстура (англ. Fixtures) - це важлива складова тестування. Їх основне завдання полягає в підготовці оточення з заздалегідь фіксованим / відомим станом для гарантії повторюваності процесу тестування. Yii надає фреймворк, який дозволяє легко і точно визначати фікстура і використовувати їх в ваших тестах.

Ключовим поняттям в фреймворку фікстур Yii є так званий об'єкт фікстура. Об'єкт фікстура являє собою особливий аспект тестового оточення, який успадковується від yii \ test \ Fixture або його спадкоємців. Наприклад, ви можете використовувати UserFixture для того, щоб бути впевненим, що таблиця користувачів містить відомий набір даних. Ви завантажуєте один або кілька об'єктів фікстур перед запуском тесту і вивантажує їх після його завершення.

Фікстура може залежати від інших фікстур, заданих через властивість yii \ test \ Fixture :: $ depends. Коли фікстура завантажується, фікстура від яких вона залежить будуть автоматично завантажені ДО неї, а коли вона вивантажується все залежні фікстура будуть вивантажені ПІСЛЯ неї.

Наступний код показує як оголосити фікстур для моделі ActiveRecord User. яка відповідає таблиці користувачів.

Tip: кожна ActiveFixture призначена для підготовки таблиці бази даних для тестування. Ви можете вказати таблицю як через властивість yii \ test \ ActiveFixture :: $ tableName. так і через властивість yii \ test \ ActiveFixture :: $ modelClass. Якщо останнє, то в цьому випадку ім'я таблиці буде взято з моделі ActiveRecord. зазначеної в modelClass.

Note: yii \ test \ ActiveFixture використовується тільки для реляційних баз даних. Для NoSQL рішень Yii надає наступні класи ActiveFixture:

Дані для фікстура ActiveFixture як правило знаходяться в файлі FixturePath / data / TableName.php,
де FixturePath вказує на директорію в якій розташовується файл класу фікстура, а TableName ім'я таблиці з якої вона асоціюється. Для прикладу вище, дані повинні повинні бути в файлі @ app / tests / fixtures / data / user.php. Даний файл повинен повернути масив даних для рядків, які будуть вставлені в таблицю користувачів. наприклад

Ви можете задати псевдонім рядку для того, щоб в майбутньому ви могли посилатися на неї в ваших тестах. В наведеному вище прикладі 2 рядки мають псевдоніми user1 і user2. відповідно.

Також вам не потрібно вказувати дані для стовпців з авто-инкрементом. Yii автоматично заповнить значення даних стовпців в момент завантаження фікстура.

Tip: ви можете вказати свій шлях до файлу даних через властивість yii \ test \ ActiveFixture :: $ dataFile. Ви також можете перевизначити метод yii \ test \ ActiveFixture :: getData (). щоб надати дані.

Як ми описали раніше, фікстура може залежати від інших фікстур. Наприклад, для UserProfileFixture можливо буде потрібно залежність від UserFixture так як таблиця профілів містить зовнішній ключ, який вказує на таблицю користувачів. Залежність вказується через властивість yii \ test \ Fixture :: $ depends. як в наступному прикладі

Залежність також гарантує, що фікстура завантажуються і вивантажуються в певному порядку. У попередньому прикладі UserFixture буде автоматично завантажена до UserProfileFixture. тим самим гарантуючи існування всіх зовнішніх ключів, і буде вивантажено після того як вивантажиться UserProfileFixture з тих же причин.

Використання фікстур

Якщо ви використовуєте Codeception для тестування вашого коду, вам слід розглянути питання про використання розширення yii2-codeception. яке має вбудовану підтримку завантаження фікстур і доступу до них. Якщо ви використовуєте інший фреймворк для тестування, ви можете використовувати yii \ test \ FixtureTrait в ваших тестах для цих цілей.

Далі ми опишемо як написати клас модульного тестування для моделі UserProfile з використанням розширення yii2-codeception.

Оголосіть які фікстура ви хочете використовувати в методі fixtures () вашого класу модульного тестування, успадкованого від yii \ codeception \ DbTestCase або yii \ codeception \ TestCase. наприклад,

Фікстура перераховані в методі fixtures () будуть автоматично завантажені перед виконанням кожного методу тестування тест-кейса і вивантажені після завершення кожного методу тестування. І, як ми описали раніше, коли фікстура завантажується, всіх залежних від неї фікстура будуть автоматично завантажені в першу чергу. У наведеному вище прикладі, при виконанні будь-якого методу тестування в тест-кейсі послідовно будуть завантажені дві фікстура: UserFixture і UserProfileFixture. оскільки UserProfileFixture залежить від UserFixture.

Для визначення фікстур в методі fixtures () ви можете використовувати або ім'я класу, або масив налаштувань. За допомогою масиву налаштувань ви можете налаштувати властивості фікстура, які будуть встановлені при її завантаженні.

Ви також можете призначити фікстур псевдонім. В наведеному вище прикладі, profiles є псевдонімом фікстура UserProfileFixture. За допомогою псевдоніма ви можете отримати об'єкт фікстура в ваших методах тестування. Наприклад, $ this-> profiles поверне об'єкт UserProfileFixture.

Оскільки UserProfileFixture успадковується від ActiveFixture. ви можете також використовувати наступний синтаксис для доступу до даних фікстура:

Info: $ this-> profiles продовжує бути об'єктом класу UserProfileFixture. Зазначені особливості доступу реалізуються через магічні методи PHP.

Визначення і використання глобальних фікстур

Фікстура, описані вище, в основному використовуються в рамках певних тест-кейсів. У більшості випадків, вам також потрібні глобальні фікстри, які застосовуються у ВСІХ або більшості тест-кейсів. Прикладом є фікстура yii \ test \ InitDbFixture. яка робить 2 речі:

  • Запускає скрипт @ app / tests / fixtures / initdb.php для виконання ряду спільних завдань ініціалізації тестового оточення;
  • Відключає перевірку цілісності даних перед завантаженням інших фікстур, і включає її назад після того як всі інші фікстура будуть вивантажені.

Використання глобальних фікстур схоже з використанням не глобальне. Єдина відмінність в тому, що ви повинні оголосити ці фікстура в методі yii \ codeception \ TestCase :: globalFixtures (). а не fixtures (). Коли тест-кейс завантажує фікстура, спочатку завантажуються глобальні фікстура, потім всі інші.

За замовчуванням, фікстура InitDbFixture вже обя'влена ​​в методі globalFixtures () класу yii \ codeception \ DbTestCase. Це означає, що ви повинні працювати тільки з файлом @ app / tests / fixtures / initdb.php. якщо ви хочете щоб перед кожним тестом виконувалися певні підготовчі роботи. В іншому випадку ви просто можете сфокусуватися на розробці конкретних тест-кейсів і відповідних фікстур.

Організація класів фікстур і файлів з даними

Таким чином ви уникнете колізій файлів даних фікстур між тестами і будете використовувати їх, як вам потрібно.

Note: в прикладі вище файли даних фікстур названі так тільки в якості прикладу. У реальних життя вам слід називати їх відповідно до того від якого класу успадковується ваш клас фікстура. Наприклад, при спадкуванні від yii \ test \ ActiveFixture для фікстур БД вам слід використовувати ім'я таблиці в якості імені файлу даних; при спадкуванні від yii \ mongodb \ ActiveFixture для фікстур MongoDB вам слід використовувати ім'я колекції в якості імені файлу.

Ви можете використовувати схожу ієрархію для організації файлів класів фікстур. Щоб уникнути конфлікту з файлами даних ви можете використовувати в якості кореневої директорії fixtures замість data.

резюме

Note: Цей розділ знаходиться в розробці.

Вище ми описали як оголошувати і використовувати фікстура. Нижче наведено типовий сценарій виконання модульних тестів, пов'язаних з БД:

  1. Використовуйте команду yii migrate для поновлення тестової БД до останньої версії;
  2. Виконати тест-кейс:
    • Завантаження фікстур: очищення відповідних таблиць БД і заповнення їх даними фікстур;
    • Виконання тесту;
    • Вивантаження фікстур.
  3. Повторення кроку 2 до тих пір, поки не виконаються всі тести.

Note: Даний розділ знаходиться в розробці.

todo: даний розділ може бути об'єднаний з попередніми частинами test-fixtures.md

Фікстура є важливою складовою тестування. Їх основне завдання в наданні набору даних, необхідного для тестування різних сценаріїв роботи вашого додатка. З цими даними використання ваших тестів стають більш ефективним і корисним.

Yii підтримує фікстура через утиліту командного рядка yii fixture. Ця утиліта підтримує:

  • Завантаження фікстур в різні сховища, такі як: RDBMS, NoSQL і інші;
  • Вивантаження фікстур різними способами (як правило очищає сховище);
  • Автоматичну генерацію фікстур і наповнення їх випадковими даними

формат фікстура

Фікстура - це об'єкти з різними методами і конфігурацією, з якими ви можете ознайомитися в офіційній документації.

Давайте припустимо, що у нас є наступний набір даних фікстура для завантаження:

Завантаження фікстур

Клас фікстур повинні містити суфікс Fixture. За замовчуванням пошук фікстур виконується в просторі імен tests \ unit \ fixtures. але ви можете змінити цю поведінку через конфігураційний файл або параметри команди. Ви можете виключити деякі фікстура з завантаження або вивантаження додавши - перед їх ім'ям, наприклад -User.

Щоб завантажити фікстур, виконайте наступну команду ::

Обов'язковий параметр fixture_name вказуємо на ім'я фікстура, яка повинна бути завантажена. Ви можете завантажити декілька фікстур за раз. Нижче вказані приклади коректного використання даної команди:

вивантаження фікстур

Для вивантаження фікстур виконайте наступну команду:

При вивантаженні фікстур ви також можете використовувати параметри namespace і globalFixtures.

Глобальна настройка команди

Хоча параметри командного рядка і дозволяють нам налаштовувати команду міграції на льоту, іноді нам може знадобитися налаштувати команду один раз для всіх сценаріїв запуску. Наприклад, ви можете налаштувати різні шляхи до файлів з фікстур як в прикладі нижче:

Автоматична генерація фікстур

Yii також може автоматично генерувати для вас фікстура на основі деякого шаблону. Ви можете генерувати фікстура з різним набором даних на різних мовах і в різних форматах. Дана можливість заснована на використанні бібліотеки Faker і розширення yii2-faker.

Для отримання додаткової інформації ознайомтеся з керівництвом.

Схожі статті