2010-02-09 3 views
1

Я хотел бы спросить вас о том, как вы набираете тесты, связанные с данными из базы данных. На мой взгляд, лучший способ - иметь разную схему БД с правильными данными только для модульного тестирования. В тестовом коде я могу загрузить объект на основе идентификатора.Подход к тестированию - DB, Junit

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

Что вы думаете. Как ты делаешь это?

Сердечные приветы Себастьян

ответ

2

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

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

Другим способом было бы использовать «живую» базу данных и выполнять тесты внутри транзакции и откатывать изменения в конце теста. Spring и Unitils поддерживают это. Это тоже хорошо работает, но при использовании этого подхода не всегда легко диагностировать неудавшийся тест.

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

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

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

На самом деле, с помощью одной схемы на одного разработчика, безусловно best practice.

+0

Отлично !!! Большое спасибо. – Sebastian

+0

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

0

Для модульных тестов, вы должны издеваться или окурок функциональность базы данных. Поскольку вы тестируете объект, который вызывает базу данных, а не базу данных, нет необходимости использовать реальную базу данных. EasyMock или JMock - это хорошие насмешливые библиотеки для изучения.

+0

Спасибо. Что делать, если у меня большой граф объектов? Затем мне нужно написать много кода, чтобы высмеять каждую ссылку на другой объект. Im, используя насмешливость в слое обслуживания, чтобы издеваться над слоем DAO, потому что уровень DAO был проверен арлеей. И im также используют насмешку в слое GUI, чтобы издеваться над уровнем сервиса, потому что уровень сервиса уже протестирован. Не думаете ли вы, что издевательская база данных для тестирования уровня DAO не так хороша? Мы хотим протестировать его, но в этом случае мы будем тестировать макет объектов. Как вы думаете? Спасибо за ответ. – Sebastian

+0

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

+0

Большое спасибо. – Sebastian

0

Три комментарии:

  1. Юнит-тесты, как правило, мелкомасштабные, быстрые тесты, чтобы покрыть небольшой кусок кода. Тесты с использованием БД - это не модульные тесты (даже если вы можете запускать их, например, JUnit), а скорее тесты системы/интеграции. Оба они полезны для разных целей.

  2. Даже если ваш графический объект большой, я не понимаю, почему вам нужно будет протестировать его все сразу в единичном тесте. Вы проверяете один DAO с необходимыми макетными объектами и утверждаете, что соответствующая часть графика объекта обрабатывается правильно. Затем напишите больше тестов для следующего DAO и т. Д.

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

+0

Большое спасибо. – Sebastian

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