Как сделать тест я блок упорство?

голоса
43

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

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

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

Каковы наиболее эффективные методы для выполнения этих?


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

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

Задан 05/08/2008 в 10:43
источник пользователем
На других языках...                            


10 ответов

голоса
16

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

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

Ответил 11/08/2008 в 10:40
источник пользователем

голоса
15

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

DbUnit (Java)

DbUnit.NET

Ответил 25/08/2008 в 14:22
источник пользователем

голоса
4

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

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

Ответил 05/08/2008 в 10:47
источник пользователем

голоса
3

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

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

С Уважением,

Rob G

Ответил 13/08/2008 в 00:23
источник пользователем

голоса
2

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

Ответил 09/07/2014 в 10:20
источник пользователем

голоса
2

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

Ответил 05/08/2008 в 12:20
источник пользователем

голоса
2

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

Ответил 05/08/2008 в 11:29
источник пользователем

голоса
1

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

Ответил 27/08/2008 в 22:17
источник пользователем

голоса
1

Технически испытания штук упорства не Юнит тесты они являются интеграционными тестами.

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

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

        [SetUp]
        public void Setup()
        {

        }

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

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

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

Ответил 05/08/2008 в 12:27
источник пользователем

голоса
1

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

Ответил 05/08/2008 в 11:19
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more