Как настроить тестирование базы данных с помощью фреймворка PHP SimpleTest

#php #database #unit-testing #tdd #simpletest

Вопрос:

Я использую SimpleTest, платформу модульного тестирования на основе PHP. Я тестирую новый код, который будет обрабатывать хранение и извлечение комментариев к веб-сайту из базы данных. Я не знаю, как структурировать проект для тестирования кода доступа к базе данных.

Я ищу любые предложения относительно лучших методов тестирования кода бд в приложении PHP. Примеры действительно замечательные. Сайты для дальнейшего чтения-это здорово.

Большое вам спасибо. 🙂

Комментарии:

1. Можете ли вы уточнить, с каким препятствием вы сталкиваетесь? Читая ваши вопросы и ответы, я действительно не могу понять, что мешает вам написать код?

Ответ №1:

Это старый вопрос, но я подумал, что хотел бы добавить некоторый конкретный опыт, который у нас был с этим.

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

У нас есть набор классов, которые являются самыми простыми для обеспечения этой функциональности. Это работает примерно так:

  • Инструкции по созданию каждой таблицы базы данных хранятся в файле по адресу tests/etc/schemas/table.sql . Он содержит данные схемы, а также вставки для всех сохраненных данных, которые, как ожидается, найдет тест.
  • Каждый тест, требующий наличия базы данных, расширяет Test_DbCase класс, предоставляющий функциональные возможности для построения таблиц.
  • Класс начальной загрузки заботится о создании и удалении базы данных при построении и уничтожении.
  • Во время выполнения тест вызывает loadTables('foo', 'bar') метод установки для выполнения команд sql в foo.sql и bar.sql .
  • Тесты выполняются на основе сохраненных данных … остальное очевидно.

Еще один инструмент, который у нас есть, — это скрипт bash, который упрощает создание table.sql файлов. Это действительно удобно, потому что в противном случае мы бы писали SQL вручную — вы можете взять существующий набор таблиц, настроить все свои данные в MySQL, а затем экспортировать их для создания тестовых файлов в основном.

Это действительно хорошо работает для нас, хотя в конечном итоге нам пришлось многое сделать самим.

Ответ №2:

У меня была локальная база данных, предназначенная для модульного тестирования, с известным именем и именем пользователя/паролем базы данных. Модульные тесты были жестко запрограммированы для этого места, но разные разработчики могли переопределить эти переменные, если бы захотели.

Затем перед каждым тестом вы TRUNCATE проверяете каждую таблицу. Это намного быстрее, чем удаление/создание таблиц или самой базы данных.

Примечание: Не усекайте после тестов! Таким образом, в случае сбоя теста у вас есть текущее состояние базы данных, которое часто помогает диагностировать проблему.

Ответ №3:

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

Ответ №4:

Тестирование с базой данных обычно указывает на плохие тесты, вероятно, из-за отсутствия инкапсуляции в тестируемом коде. Вы должны постараться максимально изолировать код, который взаимодействует с базой данных, от остальной части вашего кода, сохраняя этот уровень взаимодействия настолько простым, что вам сойдет с рук несколько очень простых тестов.

Другими словами, Код, который имеет дело с комментариями, не должен быть тем же кодом, который касается взаимодействия с базой данных. Вы могли бы, например, написать универсальный модуль таблицы, который ваша модель комментариев использует для доступа к базе данных. Вам все равно придется протестировать модуль таблицы, но это должно быть сделано отдельно от кода комментария.

Комментарии:

1. не знаю, почему за это так резко проголосовали. Строго говоря, тестирование взаимодействия с базой данных было бы интеграционными тестами, а не модульными тестами, так что трольскн прав. Конечно, вернемся в реальный мир…

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

Ответ №5:

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

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

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

Ответ №6:

Я бы посоветовал вам не пытаться протестировать код доступа к базе данных с помощью SimpleTest.

Вместо этого создайте функциональный тест для своего приложения, используя, например, Selenium: запишите тестовый случай, когда вы начинаете с известного состояния базы данных; затем добавьте комментарий и проверьте (используя утверждения Selenium), что содержимое действительно есть.

Таким образом, это: — проще в настройке и обслуживании — вы проверяете не только уровень базы данных, но и уровень представления

Тем не менее, если у вас есть хранимые процедуры в вашей БД, используйте SimpleTest — я сам успешно это сделал. В принципе, создайте простые тесты, которые начинаются с известного состояния БД, затем выполните несколько ВСТАВОК/ОБНОВЛЕНИЙ, затем запустите сохраненный процесс и убедитесь, что состояние БД соответствует ожидаемому.

Ответ №7:

Если вы действительно хотите протестировать базу данных, я бы рекомендовал импортировать данные/создавать таблицы перед каждым тестом. Таким образом, ваша база данных начинается с известного состояния при каждом тестировании. Поскольку это довольно дорого для производительности, вы можете запустить транзакцию (при условии, что ваша rdms поддерживает ее) setUp и выполнить откат tearDown . MySQL (который, скорее всего, является используемой вами СУБД) не поддерживает вложенные транзакции, поэтому, если в тестируемом коде используются транзакции, у вас могут возникнуть проблемы. Вы можете обойти это, используя точки сохранения. Настройте точку сохранения перед тестированием и выполните откат к точке сохранения после тестирования.

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

Ответ №8:

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

Поэтому я думаю, что это лучший способ, но если вы не хотите использовать ORM, вы можете создать тестовую базу данных и создать макет объекта подключения к базе данных (PDO). В этом случае вы можете создавать и удалять таблицы тестов в разделах «Настройка» и «Демонтаж» ваших тестовых наборов. Важно, чтобы это были интеграционные тесты, а не модульные тесты, поэтому вам не нужно запускать их всегда, только когда что-то изменилось между PHP и SQL server. После того как вы протестировали объекты доступа к данным с помощью интеграционных тестов, вам необходимо смоделировать их в своих модульных тестах.