Выполнение отката - Интеграционные тесты репозитория

Я хочу реализовать интеграционные тесты моих репозиториев, управляемых Entity Framework. Проблема заключается в том, как откатить состояние базы данных после выполнения тестов. В данный момент я планирую запустить транзакцию в тестовом SetUp и откатить ее в тестовом TearDown. Существуют ли другие решения, кроме очистки базы данных вручную?

5 ответов

Решение

Мы делаем это в наших интеграционных тестах при использовании MSTest. Мы используем TransactionScope и реализовать тестовую настройку и разборку в базовом классе. Это позволяет вам запускать все интеграционные тесты внутри транзакции. Базовый класс выглядит так:

public class IntegrationTestsBase
{
    private TransactionScope scope;

    [TestInitialize]
    public void Initialize()
    {
        this.scope = new TransactionScope();
    }

    [TestCleanup]
    public void TestCleanup()
    {
        this.scope.Dispose();
    }
}

Удачи.

Я думаю, что вы на правильном пути....

Вот пример того же Линк To SQL, который вы можете настроить самостоятельно.

Эта ссылка описывает три варианта:

  • операции
  • Перестройте БД
  • Используйте снимки SQL Server

Пост продолжает описывать, что транзакции, в то время как самые быстрые связаны с одним сеансом и могут создавать некоторые реальные проблемы / ограничения. Используйте, если можете....

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

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

Проблема с открытием TransactionScope в настройках и удалением в TearDown заключается в том, что вы НЕ тестируете коммит!

Это, вероятно, самый простой способ, другой способ - перестроить базу данных в SetUp.

Лучший способ - это транзакционный подход. Ссылка, которую я предоставил, содержит краткий обзор. Почти каждое корпоративное решение, с которым я сталкивался, использует транзакционный подход. Не забудьте также взглянуть на ссылки внизу статьи, в которых есть ссылки на документацию Microsoft по транзакциям с платформой сущностей. Другие варианты, перечисленные выше, являются чрезмерным излишним в простой концепции очистки тестовой транзакции. Построение базы данных или использование нескольких снимков - это полное излишество этой проблемы. TransactionScope даже не выполняет транзакцию, оставляя интеграционный тест незавершенным.

Реализация транзакций

Это создаст транзакцию перед началом каждого теста и откатит транзакцию после окончания каждого теста.

[TestClass]
public class TransactionTest
{
  protected EntitiesV3 context;
  protected DbContextTransaction transaction;

  [AssemblyInitialize]
  public static void AssemblyStart(TestContext testContext)
  {
    RetryDbConfiguration.SuspendExecutionStrategy = true;
  }

  [TestInitialize]
  public void TransactionTestStart()
  {
    context = new EntitiesV3();
    transaction = context.Database.BeginTransaction();
  }

  [TestCleanup]
  public void TransactionTestEnd()
  {
    transaction.Rollback();
    transaction.Dispose();
    context.Dispose();
  }

  [AssemblyCleanup]
  public static void AssemblyEnd()
  {
    RetryDbConfiguration.SuspendExecutionStrategy = false;
  }
}

Отличный быстрый переход к транзакционному откату / очистке

Другие вопросы по тегам