Тестирование платформы Entity с приборами
Одна из вещей, которые мне нравятся Rails и Django тестирование - это поддержка использования приспособлений для настройки базы данных до запуска каждого теста.
В прошлом я использовал строгие модульные тесты вместе с издеваемым репозиторием для тестирования моего кода, но мне бы хотелось, чтобы что-то такое же простое, как и вышеупомянутые подходы к тестированию, чтобы интегрировать тестирование.
Я слышал некоторые разговоры об этом типе поддержки с кодовым первым и EF 5, но я не знаю, повышается ли он до уровня того, что предоставляют Rails и Django.
Конечно, там что-то сравнимое.
Любая информация будет оценена!
Ответы
Ответ 1
В EF5 была введена новая концепция, называемая Миграции. Вы, вероятно, использовали что-то подобное в Rails или Django-приложениях.
Миграция - это класс, который имеет несколько функций для обновления/понижения версии DB.
public partial class VoteTime : DbMigration
{
public override void Up()
{
AddColumn("Votes", "Time", c => c.DateTime(nullable:false, defaultValue:DateTime.UtcNow));
}
public override void Down()
{
DropColumn("Votes", "Time");
}
}
Вы также должны настроить классы конфигурации DbContext и DbMigrationsConfiguration, чтобы разрешить первый подход к коду.
Для целей тестирования вам нужно ввести TestDatabaseInitilizer
public class TestDatabaseInitilizer : DropCreateDatabaseAlways<DbContext>
{
}
Он будет отвечать за инициализацию тестовой базы данных для модульных тестов.
Наконец, вы должны разработать свой тестовый код для настройки контекста.
public class SomeRepositoryTests
{
private DbContext _context;
[SetUp]
public void Setup()
{
Database.SetInitializer(new TestDatabaseInitilizer());
_context = new DbContext("TestContext");
_repository = new SomeRepository(_context);
}
[Test]
public void should_return_some_entities()
{
Assert.That(_repository.Get(), Is.Not.Null);
}
}
При необходимости код установки можно перенести в базовый класс.
Ответ 2
Я разработал приложение с Entity Framework, которое имеет более 600 автоматических тестов интеграции. Это тот процесс, который я использовал:
-
Первоначальные миграции кода Entity Framework только для установки структуры базы данных (таблицы, индексы и т.д.). Я не использую миграцию в исходные данные.
-
SQL-скрипты, которые устанавливают базу данных в определенных, хорошо известных состояниях. Например, один script для вставки пользователей членства ASP.NET; другой, который устанавливает образцы данных для наиболее релевантных таблиц; и другие для более конкретных сценариев. Сценарии обычно удаляют записи из соответствующих таблиц и вставляют их снова, в соответствующем порядке, чтобы избежать конфликтов конфликтов. Скрипты включены в проект Visual Studio в качестве встроенных ресурсов.
-
Вспомогательный класс, который может получить script из ресурсов по его имени и выполнить его против базы данных, включая команды дозирования с "GO". Для этого может использоваться ConnectionContext.ExecuteNonQuery.
-
В начале всего набора тестов я запускаю script, который устанавливает пользователей, разрешения и другие очень общие конфигурации среды.
-
Перед каждым методом тестирования я запускаю один или несколько сценариев, в зависимости от ситуации, для установки базы данных в контексте, требуемом при тестировании. Например, перед серией тестов CRUD, которые считывают, вставляют, обновляют и удаляют данные, я запускаю script, который семяет соответствующую таблицу с тестовыми данными.
-
Я пишу тестовые примеры, предполагая, что база данных задана в определенном контексте. Например, проверка операции обновления попытается получить запись с известным ключом, обновить ее и снова прочитать, чтобы проверить, обновлена ли она в базе данных.
Хотя скрипты SQL не так легко писать и читать как Rails-устройства, они очень быстрые и могут выполнять любые манипуляции (например, DELETE, INSERT, UPDATE, выполнять хранимые процедуры).
Этот метод хорошо зарекомендовал себя в проекте с 50 таблицами базы данных и очень сложными бизнес-правилами и процессами. Он оставил тесты простыми и последовательными.