Как протестировать веб-код?

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Способ проверки кода базы данных:

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

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

Ответ 10

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