Как вы (Unit) Проверьте схему базы данных?

Когда в проекте работает несколько человек, все, кто может изменить схему базы данных, какой самый простой способ unit test/проверить/проверить? Основное предложение, которое у нас было до сих пор, - написать тесты для каждой таблицы, чтобы проверить имена столбцов, ограничения и т.д.

Кто-нибудь еще сделал что-то подобное/проще? Мы используем С# с SQL Server, если это имеет какое-то значение.

Обновление:

  • Сегмент проекта, над которым мы работаем, использует пакеты SSIS для выполнения основной части работы, поэтому код С# очень мало, чтобы снова писать тесты модулей.
  • Код для создания таблиц/хранимых процедур распространяется по файлам SQL. Из-за системы сборки мы могли бы поддерживать отдельный файл проекта VS DB, но я не уверен, как это поможет нам проверить схему.

Ответ 1

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

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

Ответ 2

Ваша (реляционная) база данных делает две вещи, насколько мне известно: 1) Удерживайте данные и 2) Держите отношения между данными.

Сохранение данных не является поведением, поэтому вы не будете его тестировать

А для обеспечения отношений просто используйте ограничения. Множество ограничений. По всему месту.

Ответ 3

Мне приходилось делать это раньше, хотя и не на С#. Начнем с того, что я построил инструмент миграции схемы, основанный на обсуждении в "Ode to Code" (стр. 1 из 5) (есть также существующие инструменты делать подобные вещи). Важно отметить, что инструмент миграции, который я создал, позволил вам указать базу данных, в которую вы вносили изменения, и версию, которую вы хотели применить. Затем, после первой тестовой методологии, когда мне нужно было изменить схему, я бы написал тестовый script, который создавал бы тестовую базу данных, применял бы изменения к версии до моего целевого изменения script, добавлял некоторые данные, применял изменение script, и убедитесь, что данные находились в ожидаемом состоянии.

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

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

Ответ 4

Это интересный вопрос! Существует множество инструментов для тестирования хранимых процедур, но не для тестирования схемы базы данных.

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

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

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

Ответ 5

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

Ответ 6

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

Это предполагает, конечно, что ваши тесты проверяют все.

Ответ 7

Это старый вопрос, но кажется, что люди все еще приземляются здесь. Так что лучший инструмент, который я нашел на данный момент, - это "SQL Test" от Red Gate. Это позволяет создавать сценарии T-SQL, которые выполняются как транзакции. Позволяет запускать "песочницы" запросов для проверки состояния базы данных.