Модульные тесты на основе данных

Как лучше всего тестировать API, который зависит от данных из базы данных? Какие проблемы мне нужно учитывать в среде «непрерывной интеграции», в которой модульные тесты выполняются как часть процесса сборки? Я имею в виду, разворачиваете ли вы свою базу данных как часть сценариев сборки (может быть запущена ваша программа установки) или мне следует использовать жестко закодированные данные [использовать модульные тесты, управляемые данными MSTest с XML]?

Я понимаю, что могу имитировать уровень данных для уровня бизнес-логики, но что, если у меня возникли проблемы с операторами SQL в DAL? Мне нужно попасть в базу данных, верно?

Ну ... это поток вопросов :) ... Мысли?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
3 175
4

Ответы 4

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

И, конечно же, никогда не проверяйте свою действующую базу данных! Но это само собой разумеется :)

Итак, вы просто удаляете все данные в методе SetUp и выполняете вручную адаптированный SQL в качестве первого шага в тестовых примерах тестирования базы данных, верно?

Kasper 28.10.2008 21:00

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

Vyas Bharghava 28.10.2008 23:33

Я создал статические методы, возвращающие тестовые данные известного состояния. Затем я бы использовал «поддельный» DAL, чтобы вернуть эти данные, как если бы я действительно звонил в базу данных. Что касается тестирования sql / хранимой процедуры, я тестировал ее с помощью SQL Management Studio. YMMV!

Что делать, если SQL генерируется динамически - например, разные предложения WHERE и т. д.?

andygeers 28.10.2008 20:56

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

Вы можете очистить и заполнить базу данных инструментами (DBUnit, DBUnit.NET, другими) или просто создать свои собственные служебные классы, чтобы делать то же самое.

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

Как уже упоминалось, используйте имитацию для имитации вызовов БД в модульных тестах, если вы не хотите бесконечно возиться со своими тестами и данными. Тестирование операторов sql подразумевает больше интеграционный тест. Запустите это отдельно от модульных тестов, это 2 разных зверя.

Эндрю, я не уверен ... Вы говорите, что DAL не может / не должен проходить модульное тестирование, но тестируется во время интеграции?

Vyas Bharghava 28.10.2008 23:34

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

Andrew Cowenhoven 01.12.2008 21:19

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