2012-01-20 4 views
3

Я тестирую очень простое приложение Java с помощью JUnit 4. «Простым» я имею в виду, что нет весны и нет спящего режима. Мне нужно проверить уровень доступа к данным (JDBC, MySQL), и мое сомнение в том, какой подход лучше подходит для такого теста? Вставьте данные на @Before и удалите их по номеру @After или создайте транзакцию на @Before и откат на @After?JUnit: тестирование DAO - откат или удаление

Спасибо!

+1

Попробуйте использовать некоторые встроенные DB-DB, как DBQL DB? – Reddy

+0

@Reddy Я думаю, вы должны написать это как отдельный ответ, так как я считаю его самым верным. – bezmax

+0

как @Brian сказал в своем ответе, я хочу быть уверенным, что запросы sql верны, и они работают на платформе MySQL X. Кроме того, в этом случае проблема с сервером MySQL не является проблемой. – Morvader

ответ

4

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

Но согласитесь с другими об использовании транзакций, а не удалении или обновлении для восстановления состояния.

Одно предупреждение: если вы используете функции procs, функции и т. Д., Они могут делать COMMIT внутри, что может заглушить любые попытки отменить изменения JUnit. Может быть, это не проблема для вас, а проблема, о которой могут подумать другие, особенно когда речь идет о устаревшем коде DB, для которого модульное тестирование никогда не рассматривалось.

4

Сделки по двум причинам:

  • записи/удаления может быть дороже, чем откат
  • погрешность меньше (код для удаления данных может быть ошибка)
2

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

0

Это время и время снова, где бы я ни работал, и разные разработчики, как разные решения.

Во-первых, мне не очень нравится использовать базу данных в оперативной памяти по следующим причинам

  1. код кажется опережать тесты. Мы нашли коды, где тестируемые таблицы в памяти не существуют в реальной базе данных.
  2. Базы данных не совсем то же самое, если вы используете hsql in-memory, но ваша основная база данных - это MySQL, тогда есть различия в синтаксисе, даты для названия, но некоторые. Я знаю, что вы можете использовать ASCII Sql, но вы проверяете то, что вы не собираетесь выполнять. Будут разногласия.

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

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

1

Откат транзакции более безопасен, поскольку тестовая база данных остается неизменной, даже если тест был остановлен до метода тестирования и @After.

Однако, совершите и удалите тесты лучше, потому что некоторые ограничения проверяются на новые данные во время фиксации (отложенные внешние ключи и т. Д.), Поэтому при откате есть некоторые вещи, которые вы не будете тестировать.

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