Вопрос

Я пишу несколько интеграционных тестов в JUnit.Здесь происходит следующее: когда я запускаю все тесты вместе подряд (а не по отдельности), данные, хранящиеся в базе данных, всегда изменяются, и тесты обнаруживают неожиданные данные (вставленные предыдущим тестом) во время своего выполнения.

Я думал использовать DbUnit, но мне интересно, сбрасывает ли он индекс автоинкремента между каждым выполнением или нет (потому что тесты также проверяют идентификаторы сохраняемых объектов).

Спасибо

М.

Это было полезно?

Решение

Лучшая практика - поставить вашу базу данных в известное состояние до Испытание и дбунит предоставляет все необходимое для этого. Но не полагайтесь на столбцы Auto Incremed, поместите их также в свой набор данных Dbunit. Плюсы: Вы можете вручную проверить состояние базы данных после проведения теста, который не стерж. Минусы: вам нужно настроить и поддерживать наборы данных.

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

Другие советы

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

В качестве альтернативы, создайте тестовую базу данных сценариями. Dbunit может помочь здесь, как и другие генераторы баз данных, такие как Ликвибаза, dbmaintain, dbmigrate Затем вы можете сбросить всю базу данных и воссоздать для каждой тестовой или тестовой группы. Полезность этого подхода уменьшается по мере того, как тестовый набор данных становится большим, а накладные расходы увеличиваются.

Окончательный вариант - не иметь ваших тестов зависеть от сгенерированного идентификатора, поскольку в зависимости от сгенерированного значения создаст хрупкие тесты. Полезно протестировать сгенерированный идентификатор, поэтому протестируйте эти значения для некоторых тестов, но я не уверен, что есть значение в тестировании идентификаторов для всех тестов.

РЕДАКТИРОВАТЬ: OP спросил об использовании Hibernate для воссоздания схемы. Это может быть организовано путем создания нового SessionFactory для каждого теста и установив «hibernate.hbm2ddl.auto» для «true» при создании SessionFactory. Я упоминаю снижение эффективности Drop -Create - это также приписывает этому делу.

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

По сути, эту проблему можно решить двумя способами.

  1. Оберните тесты, связанные с БД, в транзакцию.Перед тестом начните транзакцию.После завершения тестового прогона прерывайте транзакцию всегда прерывайте транзакцию.Таким образом, никакие изменения, внесенные в тест, не будут сохранены.

  2. Используйте что-то вроде DBUnit и т. д.чтобы имитировать классы, связанные с операциями с БД, чтобы никакие данные никогда не поступали в БД, а ваши классы возвращали результаты, как если бы операция с БД была выполнена.

Если вы получаете доступ к БД при выполнении тестов, я предпочитаю подход 1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top