Вопрос

Я ищу удовлетворительные варианты модульного тестирования моих классов .NET DAL;поскольку они являются классами DAL, они обращаются к базе данных напрямую с помощью ADO.NET.В настоящее время я использую экземпляр базы данных MSSQL для тестирования, но мне было интересно, какие существуют более быстрые варианты - поскольку модульные тесты должны выполняться как можно быстрее, идеальным решением было бы решение в памяти.

Я также должен упомянуть, что я привязал себя к TSQL, поскольку собираюсь использовать только платформу Microsoft.

Это было полезно?

Решение

Учитывая, что вы утверждаете:

Я также должен упомянуть, что я связался с TSQL, так как я когда -либо буду использовать платформу Microsoft.

Тогда использование SqlServer Compact Edition может подойти для ваших нужд.Он не будет работать полностью в памяти, но может работать в режиме только для чтения (когда в основной файл базы данных не вносятся никакие изменения, поэтому его можно использовать в нескольких тестах одновременно).

Есть несколько ошибок: хранимые процедуры не поддерживаются, некоторые типы данных необходимо преобразовать, а некоторые типы данных имеют жесткие ограничения (особенно varchar, который может содержать только 4000 символов). Linq to Sql также не поддерживается должным образом.

Тем не менее, я использовал SqlServer Compact Edition как почти полную замену правильной базы данных Sql Server с хорошими результатами.

Другие советы

Я нашел SQLite быть лучшим вариантом.Хотя я использую nHibernate, но у него нулевая конфигурация, поэтому настройка занимает всего секунду.Тем не менее, вы должны знать, что в этих типах движков обычно отсутствуют некоторые вещи, которые могут вам понадобиться (например, SQLite взрывается, если в именах таблиц есть пробелы, если вы используете поставщика ADO).

Конечно, @TopBanana прав в отношении некоторых проблем, связанных с неиспользованием «настоящей» базы данных.Тем не менее, СУБД в памяти идеально подходит для тех видов тестов, которые вы хотите выполнить очень быстро (например,проверочные тесты для инкрементных или CI-сборок).

Другим огромным преимуществом является то, что вам не нужно беспокоиться об установке или демонтаже.Невероятно непродуктивно, если ваша регистрация не удалась из-за того, что разработчик А сломал вашу базу данных разработчиков ;-)

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

Если вы посмотрите на действительно большой набор модульных тестов для NHibernate, вы увидите, что он использует SQL Server (дисковый), и тесты выполняются на удивление быстро.Это еще более впечатляет, если учесть, что происходит гораздо больше создания/удаления таблиц, чем в среднем наборе модульных тестов, а это не то, для чего оптимизирован SQL Server.

Я слышал, что есть программное обеспечение для монтирования виртуального диска в Windows (не помню URL, извините).

Было бы интересно создать тестовые базы данных по этому поводу.

SQL-сервер Действительно узкое место для ваших модульных тестов?

Я имею в виду:

  1. Профилировали ли вы свои модульные тесты (с помощью чего-то вроде SQL Profiler).Они все медленные?Некоторые из них медленные?Почему?
  2. Ваши модульные тесты делают слишком много?Код установки и демонтажа слишком тяжелый?
  3. Если SQL является вашим узким местом, рассматривали ли вы насмешливая структура, поэтому вы имитируете все свои вызовы SQL.

У меня были похожие проблемы с Oracle, и мы сделали следующее:

  • убедились, что настоящие модульные тесты не затрагивают базу данных, а вместо этого используют макеты для сервисов

  • Тесты БД с тегами, которым действительно требовался Oracle, по сравнению с тестами, которые можно было выполнить с HSQLDB, H2 или любой другой базой данных в памяти.Поэтому мы можем запустить их отдельно.

  • В тестах, в которых фактически использовались функции Oracle, мы использовали обычный экземпляр Oracle, работающий на RAM-диске.

Это значительно ускорило испытания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top