В TDD почему OpenEJB и почему Arquillian?

Я веб-разработчик, закончил разработку Java EE (Richfaces, Seam 2, EJB 3.1, JPA). Для тестирования JPA я использую гиперзвуковой и Mockito. Но мне не хватает более глубоких знаний об EJB.

Некоторые могут возразить, что мы должны использовать OpenEJB и Arquillian, но для чего? Когда мне нужно проводить зависимые от контейнера тесты? Каковы возможные сценарии тестирования, в которых мне понадобятся OpenEJB и Arquillian?

Просветите меня, пожалуйста :)


person Demas Sinner    schedule 09.10.2011    source источник


Ответы (2)


В этом случае есть два аспекта.

  1. Unit tests. These are intended to be very fast (execute the whole test suite in seconds). They test very small chunks of your code - i.e. one method. To achieve this kind of granularity, you need to mock the whole environment using i.e. Mockito. You're not interested in:
    • invoking EntityManager and putting entities into the database,
    • тестирование транзакций,
    • выполнение асинхронных вызовов,
    • попадание в конечную точку JMS и т. д.

Вы имитируете всю эту среду и просто тестируете каждый метод отдельно. Модульные тесты детализированы и невероятно быстры. Это потому, что вы можете выполнять их каждый раз, когда вносите важные изменения в код. Если бы они были более сложными и трудоемкими, разработчик не нажимал бы кнопку «тест» так часто, как следовало бы.

  1. Integration tests. These are slower, as you want to test the integration between your modules. You want to test if they 'talk' to each other appropriately, i.e.:
    • are the transactions propagated in the way you expect it,
    • что произойдет, если вы вызовете свой бизнес-метод вообще без транзакции,
    • действительно ли изменения, отправленные вашим клиентом WebServices, попадают в метод вашей конечной точки и добавляют данные в базу данных?
    • что, если моя конечная точка JMS выдаст исключение ApplicationException - будет ли она должным образом откатить все изменения?

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

Конечно, вы можете запустить контейнер EJB во встроенном режиме, точно так же, как вы можете выполнить JPA в Java SE. Дело в том, что искусственная среда предоставляет вам базовые услуги, но вы закончите ее настройкой и все равно получите меньшую гибкость, чем в реальном контейнере.

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

Надеюсь, поможет.

person Piotr Nowicki    schedule 09.10.2011
comment
Спасибо, отличный ответ. Часть JMS особенно интересна в моем случае. - person Demas Sinner; 11.10.2011
comment
Рад, что смог помочь :-) - person Piotr Nowicki; 11.10.2011
comment
Хорошее описание. Мне любопытно, в чем дело. Дело в том, что искусственная среда предоставляет вам базовые услуги, но вы закончите ее настройкой и все равно получите меньшую гибкость, чем в реальном контейнере. Идея API EJBContainer заключается в том, что вы используете настоящий контейнер EJB. Не должно быть никакой разницы в подчинении или поведении. - person David Blevins; 12.10.2011
comment
@DavidBlevins Спасибо, что указали на это. Да, вы правы - услуги такие же. Я больше имел в виду инструментальные сервисы, такие как управление пулом вашего EJB или настройки, специфичные для конкретного сервера приложений, которые будут установлены в производственной среде. Думаю, я просто не правильно выразился словами. В качестве побочного примечания, я думаю, что лучше поставить конфигурацию контейнера слабо связанной с тестовым кодом. Это делает код более понятным и лаконичным (на мой взгляд, конечно). - person Piotr Nowicki; 12.10.2011
comment
@PedroKowalski Ага. При старом подходе InitialContext вы могли использовать файл jndi.properties. После закрытия спецификации мне пришло в голову, что мы забыли добавить что-то подобное для EJBContainer API, скажем, файл embeddable.properties или что-то подобное. Конечно, специально для OpenEJB вы можете использовать обычные системные свойства или файл openejb.xml. - person David Blevins; 16.10.2011

В этом году я посетил Devoxx и получил возможность ответить на этот вопрос ребятам из JBOSS. Некоторые из тестовых сценариев (то, что мне удалось записать):

  • Конфигурация контейнера
  • Интеграция контейнеров
  • Границы транзакции
  • Методы обратного вызова сущности
  • Интеграционные тесты
  • Записи Selenium
person Demas Sinner    schedule 28.11.2011