Вопрос

Есть ли у кого-нибудь хорошие советы по написанию тестового кода для разработки на базе базы данных, где существует сильная зависимость от состояния?

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

Обычно ли люди создают отдельную систему разработки с "замороженной" базой данных, чтобы любая данная функция всегда возвращала точно такой же набор результатов?

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

Есть ли хорошие статьи, в которых обсуждается этот вопрос веб-разработки в целом?

Обычно я пишу PHP-код, но я бы ожидал, что все эти проблемы в значительной степени зависят от языка и фреймворка.

Это было полезно?

Решение

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

Обновить:Быстрый поиск в Google показал Расширение блока DB для PHPUnit.

Другие советы

Если вы в основном занимаетесь тестированием на уровне данных, возможно, вам захочется ознакомиться с этой книгой: Тестовые шаблоны xUnit:Рефакторинг Тестового кода.Я сам всегда не был уверен в этом, но эта книга проделывает огромную работу, помогая перечислить такие проблемы, как производительность, воспроизводимость и т.д.

Я думаю, это зависит от того, какую базу данных вы используете, но Red Gate (www.red-gate.com) создает инструмент под названием SQL Data Generator.Это можно настроить для заполнения вашей базы данных разумно выглядящими тестовыми данными.Вы также можете сказать ему, чтобы он всегда использовал одно и то же начальное значение в своем генераторе случайных чисел, чтобы ваши "случайные" данные каждый раз были одинаковыми.

Затем вы можете написать свои модульные тесты, чтобы использовать эти надежные, воспроизводимые данные.

Что касается тестирования веб-стороны вещей, я в настоящее время изучаю Selenium (selenium.openqa.org).Похоже, это кроссбраузерный тестовый набор, который поможет вам протестировать функциональность.Однако, как и во всех этих инструментах тестирования веб-сайтов, нет реального способа проверить, насколько хорошо эти вещи работают посмотри во всех браузерах, не обращая на них внимания человека!

Мы используем базу данных в памяти (hsql : http://hsqldb.org/).Впасть в спящий режим (http://www.hibernate.org/) позволяет нам легко направлять наши модульные тесты на базу данных тестирования, с дополнительным бонусом в том, что они выполняются молниеносно..

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

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

Если вы сможете настроить базу данных с известным количеством данных перед запуском тестов и завершить их в конце, тогда вы будете знать, с какими данными работаете.

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

Определенно стоит настроить либо тестовую версию базы данных, либо заставить ваши тестовые скрипты заполнять базу данных известными данными в рамках тестов.

Ты мог бы попробовать http://selenium.openqa.org/ это скорее для тестирования графического интерфейса, чем для приложения для тестирования уровня данных, но оно записывает ваши действия, которые затем могут быть воспроизведены для автоматизации тестов на разных платформах.

Вот моя стратегия (я использую JUnit, но я уверен, что есть способ сделать эквивалент в PHP):

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

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

Одним из способов тестирования кода базы данных является:

  1. Вставьте несколько строк (используя SQL) для инициализации состояния
  2. Запустите функцию, которую вы хотите протестировать
  3. Сравните ожидаемые результаты с фактическими.Здесь вы могли бы использовать свой обычный фреймворк модульного тестирования
  4. Очистите строки, которые были изменены (чтобы при следующем запуске не было видно предыдущего запуска).

Очистка может быть выполнена стандартным способом (разумеется, только в тестируемой базе данных) с помощью DELETE * FROM table.

В целом я согласен с Питером, но для создания и удаления тестовых данных я бы не стал использовать SQL напрямую.Я предпочитаю использовать какой-нибудь CRUD API, который используется в продукте для создания данных, максимально похожих на производственные...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top