Советы по процессу разработки SSDT и лучшие практики в отношении автоматизированных модульных / интеграционных тестов

Я ищу несколько дней на нескольких форумах, блогах, MSDN и т. Д., Но пока мне не удалось найти никаких указаний по этой теме. Я попытаюсь объяснить этот пост более подробно, потому что я думаю, что информация и документация по разработке SSDT недостаточно документированы, и не существует документа с лучшими практиками, такого как проекты баз данных VS 2010 (http://vsdatabaseguide.codeplex.com/).

Я разработчик C # (без администратора базы данных), и мы находимся в начале фазы разработки проекта с нуля (10-15 разработчиков), и в настоящее время мы определяем наш процесс разработки, включая обработку разработки баз данных.

Технологии и цепочка инструментов, которые мы хотим использовать:

  • EF 5 (сначала модель, возможно, мы сначала изменим это на базу данных, потому что с такими проблемами, как представления, индексы и т. Д., Намного проще справиться)
  • SSDT (инструменты данных SQL Server)
  • VS 2012 / TFS 2012
  • MS Test для автоматизированных модульных / интеграционных тестов

Процесс разработки основан на разработке через тестирование и выглядит так:

  1. Каждая функция разрабатывается одним разработчиком в отдельной ветке функций.
  2. Разработка и реализация модульных тестов (= реализация функции)
  3. Если для функции требуется доступ к базе данных, разработчик должен: а) создать / обновить модель EF; б) создать базу данных localDB с помощью функции EF «Создать базу данных из модели»; в) создать / обновить проект SSDT с помощью сравнения схем; г) создать модульные тесты с методом инициализации теста, который создает новую базу данных и соответствующие тестовые данные для каждого теста
  4. Слить функциональную ветку обратно с интеграционной веткой
  5. После проверки слияния сборка CI выполняет модульные / интеграционные тесты.

Итак, есть некоторые моменты, которые я не уверен на 100% в том, как их решить (особенно обработка базы данных с помощью модульных тестов), и я был бы признателен, если бы вы могли направить меня в правильном направлении:

  1. Как решить создание базы данных для автоматизированных модульных тестов:

    a) Выполнить сценарий создания базы данных SQL (который может быть создан вручную ранее с помощью функции публикации SSDT) ​​для каждого выполненного метода тестирования? Я бы предпочел этот вариант, потому что каждый тест имеет чистое и согласованное состояние базы данных для каждого теста. Есть ли проблема с производительностью при создании базы данных localdb для каждого теста?

    б) Или использовать задачу msbuild «SQLPublish» или «sqlPackage.exe»? Я думаю, что это не вариант, потому что это будет одноразовая вещь, и я хочу создать новую тестовую базу данных для каждого модульного теста.

    c) Или создать тестовую базу данных вручную и сохранить файл * .mdf в корень папки управления версиями и создать копию для каждого теста? Но это я бы не предпочел, потому что разработчик A мог переопределить файл, который мог иметь изменения от другого разработчика B, который ранее проверил свои изменения. А это значит, что разработчик

  2. Как решить создание тестовых данных для автоматизированных модульных тестов:

    a) Выполнить сценарий SQL для конкретного теста, который вставляет соответствующие тестовые данные для каждого теста. Я думаю, это также означает создание новой базы данных, как указано в пункте 1. Опять же, это мой предпочтительный вариант.

    б) Или использование EF для создания тестовых данных кажется не очень чистым способом, потому что это зависит от реализации модели EF, которая на самом деле должна быть протестирована неявно с помощью функциональных модульных тестов.

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

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

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


person donttellya    schedule 02.06.2013    source источник
comment
Первоначальный инстинкт - сначала используйте DB, а не чистые модели EF. У вас будет меньше шансов получить объектно-ориентированную структуру таблицы в реляционной БД. Сколько времени потребуется БД для полного создания с нуля, зависит от того, сколько данных вы загружаете. Для №1 я бы склонился к A, но помните, что вы можете изменить экземпляр Debug с (localdb) на настоящий SQL Server, если хотите. Вы также можете каждый раз публиковать новую БД, если хотите. C - плохой выбор. # 2 - Я бы здесь тоже склонился к А. Может изучить TSQLUnit или аналогичный вариант.   -  person Peter Schott    schedule 03.06.2013
comment
возможно, этот вопрос следует задать на programmers.stackexchange.org или dba.stackexchange.org. Хотя там бродит меньше глаз.   -  person knb    schedule 19.06.2013
comment
Мой первый инстинкт состоит в том, что вам следует нанять специалиста по базам данных. Я бы не позволил специалисту по базам данных разрабатывать мое приложение, безответственно позволять разработчику приложения разрабатывать базу данных. И никогда не используйте EF rto для создания базы данных !!!!!!!!!   -  person HLGEM    schedule 21.11.2014
comment
Просто примечание, а не ответ: я использую SSDT в Visual Studio 2013 для модульных тестов. Я создаю данные, необходимые для каждого теста, в сценарии предварительного тестирования для теста. Тестовый проект настроен на развертывание базы данных перед тестированием, поэтому я получаю обновленную базу данных, а затем необходимые тестовые данные. Я начал использовать операторы MERGE, чтобы убедиться, что данные соответствуют требованиям.   -  person John Saunders    schedule 12.12.2014


Ответы (1)


Когда вам нужна база данных, это не модульный тест. Для модульного тестирования в сочетании с entity framework вы должны использовать поддельный dbcontext.

person Manuel R. Wenk    schedule 16.03.2015
comment
Не правда. SSDT предоставляет функцию, которая позволяет выполнять истинное модульное тестирование модулей базы данных - функций и хранимых процедур. Вы должны узнать об этом, прежде чем публиковать плохие ответы. - person John Saunders; 16.03.2015
comment
Функция SSDT Unit Test не может инициализировать базу данных? - person Manuel R. Wenk; 17.03.2015