Как безопасно выполнить юнит-тестирование операций записи в Symfony 2? - PullRequest
4 голосов
/ 17 июля 2011

Я хочу создать тесты для всех моих CRUD.Но как мне установить для них отдельную базу данных?Это лучший способ?

Это еще один вопрос, но он связан с тем, стоит ли мне запускать тесты и на рабочем сервере?Иногда что-то может пойти не так в разных средах, так что я думаю, что должен.Но тогда мне нужна упомянутая отдельная база данных, верно?

Любой совет?

Ответы [ 3 ]

10 голосов
/ 17 июля 2011

Выполнение любого вида тестов на производственном сервере, как правило, плохая идея (если только это не производственное оборудование, которое еще не было введено в эксплуатацию).

Юнит-тест не затрагивает базу данных (или любую другую).другая внешняя система).Итак, чтобы создать модульный тест, вам необходимо удалить зависимость от базы данных.

То, что вы называете «модульным тестом», вероятно, является интеграционным тестом.Любой тест, использующий внешнюю систему (например, базу данных, файловую систему и т. Д.), Является интеграционным тестом.

Два общих решения вашей проблемы:

  1. Вв начале теста восстановите резервную копию базы данных, содержащей известные данные, в отдельную тестовую базу данных, а затем выполните ее тесты на ее основе.

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

(№ 1 часто предпочтительнее, так как база данных в (2) может стать «загрязненным»).

3 голосов
/ 29 августа 2011

У меня была похожая проблема сегодня, и я думаю, что нашел хорошее решение.

  • Сделайте копию вашей базы данных (также работает создание новой пустой базы данных).
  • Отредактируйте ваш config_test.yml, чтобы изменить имя базы данных.

Пример моей тестовой конфигурации (может отличаться в зависимости от того, есть ли у вас несколько БД и т. Д.)

doctrine:
    dbal:
        dbname: test_db
  • Обновите вашу базу данных, чтобы отразить сущности в вашем приложении, вызвав php app/console doctrine:schema:update --force --env=test (обязательно, если вы только что создали новую базу данных, а также каждый раз, когда меняете модель приложения).

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

Однако, как уже ясно сказано, это больше не модульные тесты, а интеграционные тесты.

3 голосов
/ 17 июля 2011

Я согласен с Митчем.Я бы добавил, что вы должны решить , хотите ли вы выполнить интеграционный тест или модульный тест (или оба, но не в одном тесте).Если, на самом деле, вы хотите выполнить модульное тестирование, понимайте:

  1. Ваш код имеет «зависимость» от внешней базы данных.
  2. При модульном тестировании у вас будетнайти способ «подделать» базу данных.Вы хотите протестировать «модуль», который означает одну вещь, а не две или более вещей (т. Е. Ваш код CRUD И ваше соединение с базой данных И сама база данных).
  3. Как правило, вам необходимо провести рефакторинг вашегокод, использующий что-то вроде внедрения зависимостей, чтобы при модульном тестировании вы могли имитировать то, от чего зависит ваш код.

Модульное тестирование - это не просто тестирование вашего кода.Это на самом деле самая легкая часть.Сложнее всего сделать , чтобы сделать ваш код тестируемым .

Я рекомендую перейти на http://artofunittesting.com/ и посмотреть бесплатные видео справа под заголовком «Видео для модульного тестирования».Забудьте тот факт, что он работает в .NET, так как важны его принципы.

Затем посмотрите GoogleTechTalks Миско Хевери, где он объясняет, почему вы хотите сделать внедрение зависимостей.

Design Tech Talk Series представляет: OO Design для тестируемости

The Clean Code Talks - Модульное тестирование

(У него тоже больше. Есть серия из шести GoogleTechTalks .)

...