JUnit: тестирование DAO - откат или удаление - PullRequest
3 голосов
/ 20 января 2012

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

Спасибо!

Ответы [ 5 ]

4 голосов
/ 20 января 2012

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

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

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

4 голосов
/ 20 января 2012

Транзакции по двум причинам:

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

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

1 голос
/ 20 января 2012

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

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

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

0 голосов
/ 20 января 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...