Всем привет, вводим на проекте api тесты и встал вопрос наполнения БД данными. Варианта собтвенно два: 1) фикстуры, 2) дамп БД, который при старте тестов сбрасывается в начальное состояине.
С дампом дела не имел, но был опыт работы с фикстурами на довольно крупном пректе - поддержка на фикстурах не самая простая в том плане, что имея большую цепочку вложенных связей на один кейс нужно "помнить" всю эту цепочку, т.е. грузить по 10-20 фикстур за тест, плюс есть некое неудобство при создании массивов данных и связей между этими данными, в том плане, что есть вероятность накосячить с на этапе их создания.
Вопрос выборки начальных данных на старте теста прмерно одинаков, т.е. в варианте с фикстурами провайдером данных является фикстура, а в варианте с БД провайдером является либо чистый коннекшн либо его обертка в виде, например, репозиторя.
В варианте с дампом БД можно спокойно добавлять/удалять через какой нибудь дружелюбный UI.
Как-то побольше плюсов в содержании дампа БД получается.
Что скажете?
Дамп или не дамп
Re: Дамп или не дамп
Всмысле самому что ли помнить?
Нужно создавать фикстуру которая будет уже от остальных 10 фикстур зависеть.
А ваши дампы вы хотите иметь много разных, для разных окружений-ситуаций, и выбирать какой грузить?
Вопрос в том как и где поддерживать такие дампы.
Фикстуры то в гите хранятся и их меняешь когда структура БД изменяется.
Один раз для одной таблицы.
А у вас если будет куча разных дампов то в них все надо вносить изменения.
Вы еще коннекшены переключать собрались? Но все равно грузить данные туда сначала с дампа?а в варианте с БД провайдером является либо чистый коннекшн
Re: Дамп или не дамп
Фикстуры загружаются свои для каждого отдельного теста с нужными только этому тесту данными.
А дамп обычно загружают только один раз перед запуском всех тестов и потом перед каждым тестом не сбрасывают.
Поэтому в варианте с дампом могут быть проблемы, что изменения, записанные тестами для экшенов create, update и delete будут влиять на результат теста экшена index.
Так что с фикстурами тесты получаются полностью изолированными. Одну и ту же строку можно загружать в тесты create, update и delete.
А с дампом данные общие на всех. Для изоляции для каждого теста надо будет делать свою отдельную строку в таблице. Или запускать тесты в транзакции со параметром cleanup: true. Но это не сработает для приёмочных тестов.
А дамп обычно загружают только один раз перед запуском всех тестов и потом перед каждым тестом не сбрасывают.
Поэтому в варианте с дампом могут быть проблемы, что изменения, записанные тестами для экшенов create, update и delete будут влиять на результат теста экшена index.
Так что с фикстурами тесты получаются полностью изолированными. Одну и ту же строку можно загружать в тесты create, update и delete.
А с дампом данные общие на всех. Для изоляции для каждого теста надо будет делать свою отдельную строку в таблице. Или запускать тесты в транзакции со параметром cleanup: true. Но это не сработает для приёмочных тестов.
Re: Дамп или не дамп
В любом случае нужно создать 10 файлов фикстур + 10 файлов с данными для этих фикстур.
Не проще ли через UI к БД надобавлять данных при этом так же соблюдая изоляцию данных для каждого кейса/теста?
дамп полный аналог данным в файле данных фикстур, поэтому
точно так же, как и файлы данных фикстур
Почему куча? один дамп.
Коннекшн один, зачем его переключать.
Re: Дамп или не дамп
Вот проблема изоляци данных м/у тестами, что в БД, что в файлах фикстур как мне кажется одинаковый?
Например у меня есть UserFixture, PostFixture и данные которые лежат в файлах users.php и posts.php:
Код: Выделить всё
// users.php
<?php
return [
// тест для обновления
[
'id' => 1,
'login' => 'Jon',
'state' => 'ENABLED',
],
// тест для удаления
[
'id' => 2,
'login' => 'Michael',
'state' => 'ENABLED',
],
// тест для перевода в статус ENABLED
[
'id' => 3,
'login' => 'Michael',
'state' => 'DISABLED',
],
// тест возможности редактирования поста создателем
[
'id' => 4,
'login' => 'Denis',
'state' => 'ENABLED',
],
];
// posts.php
<?php
return [
// тест возможности редактирования поста создателем
[
'user_id' => 4,
'body' => 'текст',
]
];
Например для теста редактирования поста я в любом случае подгружу все данные из файла users и мне в любом случае конфликты и целостность нужно контролировать указывая корректные id и связи на эти id из других файлов, т.е. точно так же как если бы эти данные у меня лежали в БД.
Т.е. для меня это пока полный аналог БД без каких либо преимуществ.
PS: Я не "топлю" за дамп, просто хочу разобраться)
Re: Дамп или не дамп
Для такого теста индекса я б добавил в users.php данные
Код: Выделить всё
[
// для тестирования получения пользователей
'id' => 5,
'login' => 'Vasia',
]
Т.е. для теста index у меня гарантированно будет минимум одна запись, чего достаточно для проверки.