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 или какого-либо подобного инструмента для издевательств.