Что я получаю, пытаясь изолировать мой код C # от базовой БД при тестировании? - PullRequest
2 голосов
/ 11 марта 2012

Я сейчас переписываю приложение базы данных и использую Entity Framework для доступа к БД. В настоящее время я использую MSTest и копию базы данных в качестве части этих тестов. Мой MSTest включает в себя следующий код в качестве части каждого теста:

    [TestInitialize()]
    public void MyTestInitialize()
    {
        transScope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { Timeout = new TimeSpan(0, 10, 0) });
    }

    [TestCleanup()]
    public void MyTestCleanup()
    {
        Transaction.Current.Rollback();
        transScope.Dispose();
    }

Теперь, похоже, это очень хорошо работает для тестирования и сбрасывает БД между тестами. Мои тесты используют контекст БД, чтобы выполнять операции CRUD с тестовой БД, а затем откатывать их позже.

Я немного читал об изоляции библиотеки C # от базовой БД для тестирования, но мне интересно, что это на самом деле меня покупает. Как часть этого переписывания, большая часть (но не весь) кода, который был в хранимых процедурах, была перемещена в слой C #, но осталось несколько, которые вызываются через триггеры для таблиц. Что я получу от прохождения макета слоя базы данных? Честно говоря, когда я смотрю на это, мне кажется, что это дополнительная работа без какой-либо очевидной ценности, но, возможно, я здесь упускаю суть.

Мысли

1 Ответ

2 голосов
/ 11 марта 2012

Это зависит от того, какие тесты вы пишете.Когда вы пишете модульные тесты, в которых вы хотите протестировать одну единицу кода - обычно класс - тогда обычно хорошо придерживаться двух вещей:

  • Тесты должны выполняться как можно быстрее.Значение 100 тестов в секунду.
  • Код, который вы тестируете, должен быть изолирован от другого кода, чтобы вы могли контролировать работу зависимостей и легко тестировать различные виды входов и выходов.

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

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

В конце концов, делайте то, что работает для вас.

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