Download the PHP package uglide/db-fixture-manager without Composer
On this page you can find all versions of the php package uglide/db-fixture-manager. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download uglide/db-fixture-manager
More information about uglide/db-fixture-manager
Files in uglide/db-fixture-manager
Package db-fixture-manager
Short Description DbFixture manager for functional tests
License MIT
Homepage https://github.com/uglide/db-fixture-manager
Informations about the package db-fixture-manager
DbFixtureManager
DbFixtureManager- создан с целью упростить управление фикстурами БД и подготовку тестового окружения для выполнения тестов.
Проблематика
Для лучшего понимания происходящего, рассмотрим следующий тривиальный пример:
Предположим, что в нашей системе разработан некий модуль shops, функционал которого покрыт различными тестами (модульными и функциональными):
Допустим, что наша текущая задача - добавить тест для этого модуля, который нуждается в фикстуре магазина добавленной в БД. Смотря на файловую структуру тестов для shops модуля, мы можем сделать предположение, что фикстура магазина и код, который добавляет ее в БД уже есть в каком-то из тестов.
Проблема № 1 - Необходимо просмотреть все тесты данного модуля, для того, чтобы определить есть ли необходимый код для подготовки тестового окружения или нет. Проблема № 2 - Проблема №1 влечет за собой дублирование кода в тестах, что существенно увеличивает их хрупкость и делает более сложным добавление новых тестов.
После титанических усилий мы все таки находим некий код, который добавляет фикстуру магазина, например:
public static function setUpShop() { $shop = $shops->createRow(self::$fixtures['shop']); $shop->save(); return $shop; }
Мы добавляем его вызов в тест, и должны не забыть удалить фикстуру из БД после окончания теста
Проблема № 3 - Необходимость "ручного" контроля очистки фикстур
Но в ходе написания тестов очень часто возникает необходимость подготовить несколько связанных сущностей в БД и тут возникает следующая проблема:
Проблема № 4 - Неявные зависимости между тест кейсами за счет перекрестного использования методов для подготовки БД
Решение
Использование DbFixtureManager :)
Для начала необходимо создать класс - контейнер для фикстур:
Класс наследуется от uglide\DbFixtureManager\ContainerAbstract:
В данном классе необходимо определить методы для подготовки окружения, в данном случае это будет setUpShop()
! Метод, который поднимает фикстуру обязательно должен регистрировать сборщик мусора (cleaner). Cleaner - это метод, который будет вызван автоматически для удаления поднятой фикстуры.
Также необходимо определить загрузчик контейнеров фикстур, например его можно определить в bootstrap.php:
Далее необходимо унаследовать абстрактный класс тест кейса, и реализовать метод получения объекта для работы с Бд
Все тест-кейсы с фикстурами будут наследоваться от этого класса
Как использовать в тестах:
Использование фикстур из контейнера
Как вы уже догадываетесь из заголовка, в данном менеджере фикстур есть возможность использовать фикстуры непосредственно из контейнера.
Предположим, у нас есть следующий контейнер с фикстурами:
Данную фикстуру мы можем использовать в тестах следующим образом:
Но зачем это, если можно просто вызвать в тесте статическую переменную контейнера?!
Работая с фикстурами через менеджер у вас есть возможность получать динамически созданные фикстуры:
Преимущества
- автоматическое удаление фикстур, об организации которого нужно побеспокоиться только 1 раз на этапе создания метода, для подъема фикстуры
- тесты не захламляются большим количеством кода для поднятия фикстур и за счет этого мы получаем более чистые и понятные тесты
- фикстуры для БД каждого модуля собраны в одном месте и ими проще управлять
- получение динамически созданных фикстур