Выполнение отката - Интеграционные тесты репозитория
Я хочу реализовать интеграционные тесты моих репозиториев, управляемых 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;
}
}