PHPUnit: Как протестировать взаимодействие с базой данных на удаленном сервере Postgres?


Я пытаюсь провести модульное тестирование созданных мной классов, но большинство классов имеют дело с базой данных. Я получил классы, не связанные с базой данных, для тестирования локально, но я в тупике, когда дело доходит до работы с базой данных, особенно удаленно. В руководстве показано использование PDO для доступа к локальной базе данных, которая, похоже, сбрасывается в XML-файл, поэтому для меня это мало полезно, так как моя база данных находится в облаке Amazon и использует функции pg_* для подключения к Postgres база данных.

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

Заключение
Архитектор проекта и я провели расследование, и мы решили, что лучше всего было бы реализовать ORM, поскольку в базе данных не было абстракции. До тех пор тестирование базы данных будет приостановлено. Я уверен, что после того, как руководство PHPUnit будет введено в действие, оно будет иметь гораздо больше смысла.

Author: Jason Kaczmarsky, 2012-02-17

1 answers

Короткий ответ заключается в том, чтобы Прочитать Точную ручную запись о тестировании базы данных в руководстве PHPUnit.

А теперь длинный ответ...

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

Однако тестовый код, который взаимодействует с моделями, немного отличается. Обычно нецелесообразно или нецелесообразно вводить ваши модели в класс, в котором вам нужно получить к ним доступ. Ваши модели, как правило, представляют собой "тупые" структуры данных, которые предоставляют ограниченные возможности или вообще не предоставляют их. В результате, как правило, приемлемо (с точки зрения тестируемости) создавать экземпляры ваших моделей на лету внутри ваших классов, введенных в противном случае. К сожалению, это затрудняет тестирование кода базы данных, потому что, как отмечается в документации PHPUnit:

[T] база данных по сути является глобальной входной переменной для вашего кода

Итак, как вы изолируете и тестируете код, который взаимодействует с базой данных, если модели не вводятся напрямую? Самый простой способ сделать это - использовать тест приспособления пхпунит.

, поскольку вы наверняка уже используете PDO или библиотеку ОЗР, который строит PDO (верно?), настройка приспособления так же просто, как заполнение основной базе данных SQLite или XML-файл с данными, чтобы удовлетворить ваши тестовые случаи, и используя, что специальное соединение с базой данных при тестировании кода, который взаимодействует с базой данных. Вы могли бы указать это соединение в своем файле начальной загрузки PHPUnit, но, вероятно, оно более семантически подходит для настройки aТестовый набор базы данных PHPUnit пхпунит.

Общепринятые рекомендации по тестированию кода БД (они также отражены в документации PHPUnit по тестированию БД):

  1. Настройка приспособления
  2. Тестируемая Система Упражнений
  3. Проверить результат
  4. Демонтаж

Итак, подводя итог, все, что вам нужно сделать, это создать "фиктивное" приспособление базы данных и заставить ваш код взаимодействовать с этими известными данными вместо фактического база данных, которую вы будете использовать в производстве. Этот метод позволяет успешно изолировать тестируемый код, поскольку он имеет дело с известными данными, а это означает, что вы можете делать конкретные/проверяемые утверждения о результатах операций с базой данных.

ОБНОВЛЕНИЕ

Просто потому, что это чрезвычайно полезное руководство для того, что не делать в вашем коде, если вы хотите повысить тестируемость, я добавляю ссылку на Миско Хевери Как написать 3v1L, непроверяемый код. Это не связано, в частности, с тестированием базы данных, но, тем не менее, полезно. Счастливого тестирования!

ОБНОВЛЕНИЕ 2

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

Ваши модели не должны использовать PDO для реализации расширения DBUnit PHPUnit.

Это немного облегчит вашу жизнь, если вы используете PDO, но от вас это не требуется. Скажем, для например, вы создали свое приложение с помощью встроенных функций PHP pg_* PostgreSQL. PHPUnit по-прежнему позволяет вам указывать приспособления и по-прежнему может перестраивать их для каждого теста - вам просто нужно будет указать свое соединение при выполнении тестов на тот же ресурс, который расширение DBUnit использует для своего приспособления.

 5
Author: rdlowrey, 2012-02-21 18:56:38