Как тестировать методы для работы с бд?

1,00
р.
В своем приложении я использую entity-framework версии 6.1.3 для работы с БД mssql.
Назрел вопрос покрытия своего кода тестами.
Подскажите,пожалуйста, способы тестирования для данной связки.
Мне в голову приходит создание локальной тестовой БД, наполнение её данными и тестирование методов на данной БД, при данном подходе я смогу проверить как методы получения данных так и CRUD методы.
Так же я слышал что для тестирования методов для работы с БД можно создать generic репозиторий public interface IRepository where T: class { } и для тестирования подсовывать fake репозиторий с тестовыми данными.
Я пока склоняюсь больше к первому сценарию, т.е. созданию локальной тестовой БД, которая будет подвержена тем же изменениям что и реальнай бд(засчет механизма миграций в ef).
Подскажите насколько правильным будет тестирование описанным мной способом? Буду рад услышать о других способах.

Ответ
Тестирование — это процесс исследования и испытания программного обеспечения (ПО), преследующий две основные задачи: убедиться в том, что ПО рабочее и соответствует требованиям, а также выявить ситуации, в которых поведение ПО является неправильным, нежелательным или не соответствует начальным требованиям.

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

Вариант #1
Создание локальной тестовой БД, которая будет подвержена тем же изменениям что и реальная БД(за счет механизма миграций в EF)
Данный подход может существовать, но глядя на него возникают вопросы, а готовы ли Вы пожертвовать некоторыми недостатками этого подхода? К недостаткам я бы отнес:
Прямая зависимость тестов от данных, хранящихся в БД Пересечение данных для нескольких тестов. Бывают такие ситуации, в тестах, когда мы имитируем ошибку или ожидаем неправильное поведение - это вполне нормально. Но как быть в этом случае? У нас будут данные и хорошие и плохие. Зависимость от миграций. Тут несколько подпунктов. Первый: если забудем сделать миграцию - упадут тесты. Вторая: необходимо всегда помнить про то, что нужно сделать миграцию и для тестов. Третья: сопровождение таких тестов. Что будет делать новый программист? Что если БД вдруг упала? Тесты снова не работают. Данный подход не назовешь простым, имеются свои сложности. Думаю, что это тоже стоит вписать, в комментарии увидел: Для проверки миграции всегда можно держать бэкап нужной версии

Вариант #2
Для тестирования методов для работы с бд можно создать generic репозиторий public interface IRepository where T: class { } и для тестирования подсовывать fake репозиторий с тестовыми данными.
Это более удобный вариант тестирования, на мой взгляд. Давайте рассмотрим почему:
Мы не зависим от данных в БД, так как данные подготавливаются в самих тестах. Данные не пересекаются, мы всегда знаем, что тесты работают только с тем, что мы им подсунем. Имитация ситуаций, когда мы ожидаем ошибку не ломает наши тесты и не приводит к проблемам. Простота использования. Не нужно делать миграций. Есть много документации, которая проиллюстрирует примеры использования моков (фэйков). Скорость тестирования. Тут очень большое преимущество у моков(фэйков). Они работаю намного быстрее.
Есть некий недостаток этого подхода, как мне сказали - это тестирование логики, которая заложена в БД: индексы, конкурентный доступ и т.п.

Вариант #3
Можно объединить эти подходы, вывести что-то промежуточное. К примеру перед запуском писать данные в базу - это подготовка данных. Затем работать с конкретной БД, в которой лежат наши данные, то есть своего рода БД для тестов. Главное не забывать убирать за собой - удалять данные, которые используются для теста. Такой подход довольно громоздкий и тоже не простой.
Использование такого подхода подразумевает под собой написание вспомогательной плюшки, которая будет помогать. Это поможет тестировать CRUD методы. Но тут возникает и другой вопрос: кто будет тестировать вспомогательную утилиту? То есть и такой подход имеет место быть.

Ну и еще один вопрос: Вы собираетесь тестировать Ваш код или EF?
Если вести разработку по Test Driven Development, то использование фэйков существенно упрощает разработку.
Я не хочу конкретно акцентировать свое внимание на одном варианте, я всего лишь хочу посоветовать сделать выбор, который будет более правильным и в дальнейшем не вызовет проблем. Чтобы спустя время Вы не оглянулись на проделанную работу и не сказали себе "А почему я не пошел другим путем?".
Выбор необходимо делать основываясь на поставленной задаче. Использовать только один подход вряд ли получится - скорее всего необходимо использовать несколько подходов.