2014-02-20 4 views
0

Я попытался создать модульные тесты для некоторых методов, в которых хранились процедуры. Ниже приведены вопросы, которые у меня есть.Тестирование модулей - данные базы данных

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

    • Если я должен назвать эти методы из моего модульного тестирования, я не являюсь на самом деле решений п нет базы данных вызовов ... Стоит ли?

    • Если мне нужно использовать данные макета, как получить копию данных из базы данных локально?

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

+1

Какая часть вызова хранимых процедур вы хотите протестировать? Вы пишете свои собственные классы SQL? (Для обычного приложения вы просто издеваетесь над уровнем персистентности данных и никогда не будете беспокоиться о вызовах БД в модульных тестах ...) –

+0

Чтобы проверить правильность поля, он создает пару вызовов db и на основе возвращаемых данных делает пару проверок на этих полей и возвращает true или false. С учетом сценария, как вы будете издеваться? и что вы подразумеваете под насмешливым уровнем сохранения данных? Pls eloborate. Большое спасибо за ваш ответ! – user3123734

+0

Jeroen Vannevel имеет очень подробный ответ (+1). Это действительно не похоже на то, что вам нужны * единичные тесты * для этого случая. –

ответ

1

Вы смотрите на интеграционные тестах, а не юнит-тесты. Тесты интеграции имеют зависимость от внешней системы (datetime, database, filesystem, networkervice и т. Д.), Тогда как модульные тесты их объема ограничиваются одной единицей (один или несколько методов в одном или нескольких классах).

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

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

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

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

Простой пример этого принципа в действии: (! Смотреть в концепции инъекции зависимостей и контейнеров IoC)

interface DataSource { 
    List<String> GetData(); 
} 

class Manipulator { 
private DataSource _source; 

public Manipulator(){ } 

public Manipulator(DataSource d) { _source = d; } 

pubic void ManipulateData(){ 
    var data = _source.GetData(); 

    // Do something with the data 
} 
} 

В этом примере используется конструктор инъекции. не

Теперь, чтобы ответить на ваши вопросы по существу:

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

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

Если мне нужно использовать данные макета, как получить копию данных из базы данных локально?

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

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

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

+0

Большое вам спасибо за подробное объяснение! У нас есть другая копия тех же баз данных ... скажем, 100. В некоторых случаях данные могут отличаться, но одни и те же для некоторых. Какой был бы лучший подход в этом случае? – user3123734

+0

Почему у вас 100 баз данных? Являются ли они одной и той же базой данных функционально только с разными данными или же базы данных совершенно разные? –

+0

Да! Это все та же схема в большинстве случаев с разными данными ... Она поддерживается отдельно для защиты данных и других причин. Благодаря! – user3123734

0

Вам необходимо определить interface, который имеет все ваши методы доступа к данным. У вас уже есть один класс с этими методами, поэтому вы можете просто отредактировать его в Visual Studio, щелкнув правой кнопкой мыши в пустом пространстве в вашем классе доступа к данным и выберите Refactor, а затем Extract Interface. Итак, теперь у вас есть interface, вам нужно добавить класс доступа к данным, который реализует это interface.

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

+0

Большое вам спасибо !!! – user3123734

Смежные вопросы