Как мне выполнить модульный тест на постоянство?

StackOverflow https://stackoverflow.com/questions/2046

  •  08-06-2019
  •  | 
  •  

Вопрос

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

Я знаю, что технически это был бы интеграционный тест (а не модульный тест), но я хочу выяснить наилучшие стратегии для следующего:

  1. Тестирующие запросы.
  2. Тестовые вставки.Как я узнаю, что вставка, которая пошла не так, сработала, если она завершится неудачей?Я могу проверить это, вставив, а затем выполнив запрос, но как я могу узнать, что запрос не был ошибочным?
  3. Тестирование обновлений и удалений - то же, что тестирование вставок

Каковы наилучшие методы для этого?


Что касается тестирования SQL:Я знаю, что это можно было бы сделать, но если я использую O / R Mapper, такой как NHibernate, он добавляет некоторые обозначения в псевдонимы, используемые для выходных запросов, и, поскольку это несколько непредсказуемо, я не уверен, что смогу это проверить.

Должен ли я просто отказаться от всего и просто довериться NHibernate?Я не уверен, что это благоразумно.

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

Решение

Загляните в блок базы данных.Это библиотека Java, но должен быть эквивалент C #.Это позволяет вам подготовить базу данных с набором данных, чтобы вы знали, что находится в базе данных, затем вы можете взаимодействовать с DB Unit, чтобы увидеть, что находится в базе данных.Он может работать со многими системами баз данных, поэтому вы можете использовать свои собственные настройки базы данных или использовать что-то другое, например HSQL в Java (реализация базы данных Java с опцией in memory).

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

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

Как Майк Стоун сказал, DBUnit отлично подходит для приведения базы данных в известное состояние перед запуском тестов.Когда ваши тесты будут завершены, DBUnit сможет вернуть базу данных в то состояние, в котором она была до запуска тестов.

DBUnit (Java)

DbUnit.NET

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

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

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

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

С уважением,

Роб Джи

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

Для NHibernate, я бы определенно выступал за то, чтобы просто высмеивать NHibernate API для модульных тестов - доверяйте библиотеке делать правильные вещи.Если вы хотите убедиться, что данные действительно поступают в базу данных, проведите интеграционный тест.

Для проектов на базе JDBC можно использовать my Acolyte framework: http://acolyte.eu.org .Это позволяет макетировать доступ к данным, которые вы хотите протестировать, используя абстракцию JDBC, без необходимости управлять конкретной тестовой базой данных.

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

Технически модульные тесты устойчивости - это не модульные тесты, а интеграционные тесты.

В C #, использующем MbUnit, вы просто используете атрибуты SqlRestoreInfo и RollBack

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

То же самое можно сделать в NUnit, за исключением того, что имена атрибутов немного отличаются.

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

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

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