Подтвердить что ты не робот

Тестирование платформы Entity с приборами

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

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

Я слышал некоторые разговоры об этом типе поддержки с кодовым первым и EF 5, но я не знаю, повышается ли он до уровня того, что предоставляют Rails и Django.

Конечно, там что-то сравнимое. Любая информация будет оценена!

4b9b3361

Ответ 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 таблицами базы данных и очень сложными бизнес-правилами и процессами. Он оставил тесты простыми и последовательными.