Как очистить и автоматически перенести базу данных для тестирования?

Я создаю API с Yii2, и у меня есть несколько тестов API кодирования, работающих с тестовой базой данных. Однако я хотел бы очистить и перенести базу данных в каждом раунде тестирования.

Как мне это сделать? Нигде не могу найти ответ.


person Dubby    schedule 27.03.2015    source источник
comment
Не знаю точно, как это должно работать, что вы делаете, но не будет ли это так же просто, как создать какое-то действие внутри контроллера, который будет запускать большой файл sql, который удаляет все таблицы и создает их снова? Затем перед вашими тестами вы просто вызываете эту страницу.   -  person Alexandru Trandafir Catalin    schedule 27.03.2015
comment
Я уверен, что должен быть лучший, менее хакерский способ сделать это. Кроме того, добавление действия контроллера для очистки базы данных звучит очень рискованно.   -  person Dubby    schedule 27.03.2015
comment
Другие идеи: для хакерского способа, чтобы обезопасить его, вы можете передать токен в URL-адресе или ограничиться локальным IP-адресом. Я видел, что Yii также имеет Fixtures, не уверен, что они вам пригодятся, и, наконец, поскольку вы упомянули здесь codeception, он описывает именно то, что вы хотите сделать: codeception.com/docs/09-Data   -  person Alexandru Trandafir Catalin    schedule 27.03.2015


Ответы (2)


Миграции Yii предназначены для того, чтобы делать именно то, что вы хотите. Полная документация по их созданию есть здесь. Недостатком является то, что вам нужен доступ к командной строке. Если у вас его нет, вы все равно можете использовать миграции, но вам нужно создать новый экземпляр консольного приложения. См. здесь для обсуждения именно этого проблема.

Что касается риска сброса базы данных действием контроллера, я согласен, что это может быть рискованно, но вы можете ограничить действие только пользователями-администраторами, использующими правила, и, возможно, даже использовать форму для инициации действия, чтобы вы могли использовать токены csrf для подтвердите отправку и разрешите действие только через метод публикации. Если вам нужно какое-то руководство по этому поводу, я могу обновить свой ответ.

person Joe Miller    schedule 27.03.2015
comment
Спасибо за ответ. Да, я использую (и люблю) миграции и хочу, чтобы они запускались автоматически при запуске тестов. Я работал над проектом Laravel несколько месяцев, и каждый тестовый файл начинался со свежей базы данных (заполненной определенными приборами). Я хотел бы воспроизвести это в Yii2, но не знаю, как. Я думаю, что сейчас я создам действие контроллера для удаления и переноса базы данных для каждого тестового файла. - person Dubby; 27.03.2015
comment
На самом деле, мне не нужно действие контроллера для этого. Я напишу собственный метод, который можно вызвать для достижения этой цели. - person Dubby; 27.03.2015

Независимо от тестирования API, вернуть содержимое базы данных в определенное состояние, безусловно, можно с помощью миграции, но я не думаю, что это лучшее решение, которое вы можете иметь, решением для этого должно быть использование Fixtures.

См. дополнительную информацию о фикстурах в официальной документации: http://www.yiiframework.com/doc-2.0/guide-test-fixtures.html

После того, как вы реализовали фикстуры (должно быть довольно простым, в противном случае просто откройте другой пост), вы, вероятно, поймете, что миграция в любом случае может понадобиться для синхронизации структуры базы данных.

Эта задача может быть выполнена разработчиком вручную перед созданием любого теста или автоматически, если у вас есть сервер CI.

Опять же, миграции не нужно запускать каждый раз, когда вы запускаете тест, только в начале. Фикстуры — это то, что вам нужно, чтобы привести базу данных в определенный статус во время любого типа теста.

person Mr Peach    schedule 30.03.2015
comment
Я намерен использовать фикстуры, но некоторые тесты требуют создания моделей для проверки рабочего процесса создания, аутентификации, авторизации и взаимосвязей. Если я добавлю пользователей в один тест, я не хочу, чтобы это влияло на другие тесты, которые могут ожидать, например, определенное количество пользователей (или другую модель). - person Dubby; 02.04.2015
comment
И когда я говорю о миграции, я имею в виду, что хочу, чтобы база данных автоматически обновлялась до последней миграции, а не выполнялась вручную. - person Dubby; 02.04.2015
comment
@Dubby Я думаю, что есть небольшая путаница: это действительно связано с тем, как вы организуете свою работу и кодовую базу. Разрабатываемые функции должны быть автономными, если вы хотите, чтобы тесты выполнялись отдельно и не влияли на чью-либо работу. Как я уже объяснял, вам нужны миграции, но они необходимы только в самом начале перед запуском тестов: в обычной системе непрерывной интеграции миграции будут выполняться автоматически. Codeception, который запускает тесты, не знает о Yii и его инфраструктуре миграций, так что такая ситуация вполне ожидаема. Надеюсь это поможет. - person Mr Peach; 02.04.2015
comment
Спасибо @The_Peach. Да, я понимаю это и, вероятно, добавлю некоторый код в тесты/_bootstrap.php для проверки миграции, надеясь, что он будет запускаться только один раз при выполнении тестов. Мне нравится термин self contained. Как мне этого добиться? Записи, добавленные в одном тесте, не удаляются в конце. Это мой тест API, который не очищает значения: gist.github.com/anonymous/fe05253bf0364cde349b - person Dubby; 04.04.2015
comment
Светильники @Dubby — это то, что вам нужно, см. ответ выше для получения дополнительной информации о том, как их настроить. Фикстуры — единственный способ контролировать содержимое БД для тестов. - person Mr Peach; 07.04.2015