2016-08-24 2 views
7

Я пытаюсь сократить время запуска тестов против хранилища EF 6x. Тесты заключаются в транзакции, и db возвращается после выполнения. Я был бы признателен за любые предложения о том, как сохранить экземпляр DbContext между тестовыми сеансами, чтобы EF не пришлось снова проходить весь процесс генерации представлений?Улучшение производительности платформы Entity Framework во время тестирования

Я не хочу использовать издевательства/подделки, ветвь EF, отличную от Microsoft, и интерактивные представления уже на месте. Спасибо.

+5

Вам нужно будет предоставить какой-то код и более подробную информацию о том, чем вы занимаетесь, тем самым я имею в виду, как эта настройка тестового проекта. У вас есть несколько экземпляров DbContext? Один за тест? Один за класс? Один глобальный? Вы должны проиллюстрировать, что инициализация медленная, поэтому она дает нам представление о том, что можно сделать для ее исправления. – Igor

+0

DbContext должен быть чрезвычайно легким на практике. Например. в веб-приложениях у вас есть один такой экземпляр для каждого запроса пользователя. Они действительно (или, по крайней мере, должны быть) легкие объекты. Таким образом, проблемы с производительностью, которые вы испытываете, могут быть из другого места. Может быть, DbInitializer для ваших тестов? Вы прокомментировали свой код? Возможно, я ошибаюсь, хотя ... –

+0

Вы не должны сохранять экземпляр DbContext и повторно использовать его в разных тестовых сеансах. Это не сильно отличается от повторного использования DbContext, скажем, среди разных потоков. Это неправильная практика (не потокобезопасная). –

ответ

0

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

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

Вот статья о том, как сделать это: Testing with a mocking framework

Другая статья для вас: Unit testing in C# using xUnit, Entity Framework, Effort and ASP.NET Boilerplate

+0

Спасибо, но я хочу более быстрый способ использования реальной сделки. – Vas

+0

Это не рекомендуемый способ тестирования.У вас большие проблемы. – Sampath

+1

@Sampath Почему это не рекомендуется? Потому что это медленнее или? Что вы действительно тестируете с помощью поддельных провайдеров - отлично работает LINQ to Objects, которые бросают не поддерживаемые исключения во время выполнения в LINQ to Entities? –

1

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

  1. Если вы вставляете много записей в таблицы, вы можете сделать объемную вставку. Лучшая библиотека для этого: EntityFramework.BulkInsert-ef6. Вы можете установить его через консоль Nuget.

  2. Если вы видите замедленность во время работы с данными, и у вас много операций загрузки/манипулирования/сохранения, вам необходимо выполнить операцию в памяти, как рекомендует Sampath.

  3. Если вы загружаете данные, просто загрузите нужные столбцы. Вы также должны использовать ленивый вариант загрузки (который со своего поста, я думаю, вы его хорошо знаете).

4. Некоторая часть медлительности может быть из-за архитектуры вашей базы данных. Основные типы столбцов оказывают значительное влияние на операции Где!

+0

Спасибо за ваш ответ. Речь идет о сохранении одного и того же исполняемого экземпляра DbContext между сеансами тестирования. Спасибо. – Vas

Смежные вопросы