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

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

Спасибо!

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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