JUnit: тестирование DAO - откат или удаление

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

Спасибо!

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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