Откат - Интеграционные тесты репозитория - PullRequest
17 голосов
/ 21 августа 2010

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

Ответы [ 5 ]

23 голосов
/ 21 августа 2010

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

public class IntegrationTestsBase
{
    private TransactionScope scope;

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

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

Удачи.

5 голосов
/ 21 августа 2010

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

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

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

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

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

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

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

4 голосов
/ 03 мая 2011

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

2 голосов
/ 21 августа 2010

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

0 голосов
/ 17 февраля 2018

Лучший способ - это транзакционный подход.Ссылка, которую я предоставил, содержит краткий обзор.Почти каждое корпоративное решение, с которым я сталкивался, использует транзакционный подход.Не забудьте также взглянуть на ссылки внизу статьи, в которых есть ссылки на документацию 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;
  }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...