.NET TDD с базой данных и ADO.NET Entity Framework - интеграционные тесты - PullRequest
3 голосов
/ 13 июня 2010

Я использую инфраструктуру сущностей ADO.NET и использую базу данных AdventureWorks, подключенную к моему локальному серверу баз данных. Что касается модульного тестирования, какие подходы люди использовали для работы с базой данных?

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

Любой совет?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 14 июня 2010

Я столкнулся с подобной ситуацией.

Хранение данных в БД и их сохранение в прежнем состоянии не являются в идеале модульными тестами. Это интеграционные тесты.

Чтобы выполнить интеграционные тесты (операции вставки / обновления) без влияния на фактические данные , я бы предложил следующее

1. Используйте другую базу данных (измените имя фактической БД), и пусть схема останется такой же, как и фактическая БД.

2. Направьте юнит-тесты на вновь созданную БД.

3. Теперь, как нам создать новую БД для автоматизированного выполнения одних тестов?

Ответ. Перечислите сценарии SQL в пакетном файле, например, вот так (здесь я предполагаю, что вы используете SQL SERVER)

Например, sqlcmd -i c: \ data \ runcripts \ InventoryMonthEnd.sql

Укажите пакетный файл, который подает этот оператор SQL для выполнения в процессе MSBuild.

Пример задачи MSBuild.

<ItemGroup>
<StoredProcScripts Include="$(RelativeSPDir)/*.sql" />
</ItemGroup>

<Target>
<Exec Command="isql -E -n -b -d DBName -i %(StoredProcScripts.Identity)" Condition="'%(StoredProcScripts.Identity)' != ''"/>
</Target>
1 голос
/ 13 июня 2010

Лично у меня каждый тест создает свои собственные данные и удаляет их по завершении теста. Таким образом, данные, необходимые для теста, и сам тест хранятся близко друг к другу и могут поддерживаться как единое целое. Для данных, совместно используемых набором связанных тестов (в том же файле * Test.cs), я использую [TestInitialize] Start() и [TestCleanup] Finish().

У меня также есть служебная программа, которая заново создает пустую тестовую базу данных, поскольку код очистки модульного теста не будет запускаться, если я отлаживаю тест и завершаю его в отладчике. Чтобы заново создать базу данных, я использую метод ObjectContext.CreateDatabase () EF 4.

0 голосов
/ 16 января 2018

Действительно эффективным способом управления данными в ваших тестах является использование транзакции. Коллега рассказал мне об этом, и позже я увидел, что он использовался во многих местах (ГСНО)

В C #, если вы используете TransactionScope и не выполняете транзакцию, у вас есть действительно эффективный способ поддержания чистоты.

0 голосов
/ 13 июня 2010

Вот как мы решили это:

  1. Использование базы данных Sandbox на первом месте для разработки / тестирования
  2. Создание всех необходимых данных в тестах
  3. Удалитьвсе тестовые данные, созданные тестами после того, как они пройдут / не пройдут.Что-то вроде try...finally
0 голосов
/ 13 июня 2010

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

http://weblogs.asp.net/astopford/archive/2006/07/25/MbUnit-database-testing_2C00_-and-thanks-to-Roy.aspx

...