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

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

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

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

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

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

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

5.08.2008 21:58:51
10 ОТВЕТОВ
РЕШЕНИЕ

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

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

6
5.08.2008 22:03:29
Очень интересно, мне непременно придется заняться этим. По этой причине я не совсем правильно пишу юнит-тесты, и это плохая практика, которую я должен устранить.
kaybenleroll 13.09.2008 10:38:28

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

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

1
5.08.2008 22:03:33

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

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

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

1
5.08.2008 22:08:11

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

3
6.08.2008 04:14:42

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

1
6.08.2008 12:06:28

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

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

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

2
6.08.2008 13:44:48

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

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

1
11.08.2008 13:30:32

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

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

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

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

1
19.08.2008 18:40:33

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

1
10.09.2008 11:31:15

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

2
10.09.2008 12:02:14