2011-02-07 3 views
4

Моя компания разработала за последние 7 лет среднюю/большую веб-приложение. Приложение использует Spring Framework (3.0), Hibernate (3.x) и Struts (1.x) среди других. К сожалению, мы не использовали никаких автоматических тестов. Теперь нам нужно добавить их, чтобы избежать ошибок регрессии и начать лучший жизненный цикл разработки. Следуя передовой практике для этой тяжелой работы, я читал, что мы можем начать с теста дыма gui, а затем провести интеграционное тестирование перед добавлением модульного теста. Итак, мой вопрос: о тесте интеграции (в контейнере), который является отличием между Spring TestContextFramework и JBoss Arquillian? Я прочитал, что Аркиллиан поддержит Весну в ее окончательном выпуске (http://community.jboss.org/message/563768). Будет ли у меня какая-то польза от ее использования после ее стабилизации?Разница между Spring TestContext Framework и Jboss Arquillian

Thanks, Stefano.

ответ

1

Я никогда не использовал Arquillian, но, похоже, он сфокусирован на тестировании EJB с акцентом на развертывание в реальном контейнере. Если ваше приложение основано на Spring (+ Hibernate), поддержка Spring Test, вероятно, лучший выбор.

В тестовом примере вы можете начать часть вашего контекста приложения (всего лишь маленькую часть или почти целое приложение) с издетой в памяти базой данных. Вам не нужен бегущий контейнер, поскольку Spring в основном автономный. Тестирование Struts 1.x действия сложнее, но я думаю, Аркиллиан тоже вам не поможет.

Также, если стабильность программного обеспечения является вашей проблемой, Аркильян, похоже, сейчас находится в альфа-версии. Но я определенно дал бы ему шанс, что мне придется тестировать приложение на основе EJB. Для приложения Spring, с кэшированием контекста, демаркацией транзакций в тестах и ​​т. Д. TestContext Framework - лучший выбор.

Примечание: рассмотрите возможность использования TestNG вместо JUnit, так как он играет намного лучше с TestContext, например. у вас есть доступ к Spring beans в методах настройки/срыва (статический в JUnit).

+0

Я согласен с этим ответом. Я сам не использовал Аркиллиан, но идея необходимости развертывания в контейнере для запуска тестов звучит довольно плохо. Как сказано, с Spring TestContext вы можете инициализировать свое приложение, запускать один тест, делать изменения без необходимости повторного развертывания (хотя вам, вероятно, потребуется снова запустить TestContext). Кроме того, я не знаю, какие тесты вы планируете запускать на Struts, но вы можете легко запускать тесты Selenium на любую веб-инфраструктуру, если функциональные тесты - это то, что вам нужно. Вы также можете запустить Selenium через Spring TestContext для доступа к той же БД :) –

+0

Конечно, если вы используете EJB, вы также можете запустить что-то вроде OpenEJB для использования EJB на тестах. –

1

Я сам Аркиллиан, но я рекомендую вам придерживаться решения Spring. Хотя в конечном итоге это будет несовместимым с контейнером, сейчас усилия сосредоточены на Java EE. Ваша работа кажется достаточно сложной, и я бы не рекомендовал Aquillian.

Однако, чтобы устранить некоторую путаницу, вы можете запустить встроенные тесты на Arquillian. Он может загружать встроенные серверы Glassfish или JBoss AS и запускать тест, используя «реальную вещь» вместо макетов или альтернативных реализаций. JPA, Interceptors, JTA, XA Datasources, JMS, JSF, Servlet. Все имеющиеся в наличии батареи;)

В качестве альтернативы вы можете запустить экземпляр JBoss на заднем плане и выполнить тест удаленно. Аркиллиан заботится о разворачивании/тестировании/разворачивании цикла - и он быстро вспыхивает!

1

Я никогда не использовал любой из них, но вот моя суммируют из документаций:

## Spring Integration Tests ##

Spring позволяет выполнить некоторые интеграционные тесты без необходимости развертывания в сервер приложений.

поддержка Spring для модульного тестирования и интеграционного тестирования обеспечивается Spring Framework TestContext, который является агностиком в рамках тестирования в использовании (JUnit, TestNG и т.д.).

TestContext Framework обеспечивает:

  • последовательной загрузки Spring ApplicationContext с и WebApplicationContext s, а также кэширование этих контекстов. [1]

  • необязательно конфигурирует экземпляры тестовых классов с помощью Dependency Injection. [2]

  • обеспечивает управление транзакциями для проверок транзакций: структура будет создавать и откатывать транзакцию для каждого теста.

  • предлагает абстрактные классы, которые могут быть расширены разработчиками, чтобы легко кодировать классы тестов JUnit или TestNG.

## Arquillian ##

Arquillian запускает интеграционные тесты внутри реальной среды выполнения, чей жизненный цикл управляется Arquillian. Действительно, с помощью Arquillian ваши интеграционные тесты либо выполняются внутри контейнера , либо взаимодействуют с контейнером в качестве клиента.

Контейнер может быть:

  • встроенный или удаленный контейнер сервлетов (например, Tomcat, Jetty),
  • сервер приложений Java EE (например, GlassFish, JBoss AS, встроенный GlassFish),
  • среда Java SE CDI
  • или любой другой контейнер, реализация при условии

Arquillian:

  • управляет жизненным циклом контейнера (старт/стоп),

  • котрый сводит тестовый класс с зависимыми классами и ресурсы в развертываемых архив,

  • повышает класс теста (например, , разрешение @Inject, @EJB и @Resource инъекции),

  • развертывает архив для тестирования (развернуть/Undeploy),

  • фиксирует результаты и отказы.

#How она работает #

Arquillian обеспечивает пользовательский тест бегун для JUnit и TestNG.

  1. При выполнении своих тестов этот пользовательский тестовый бегун обнаружит декларацию @RunWith Arquillian.
  2. Пользовательский тестовый бегун, таким образом, будет управлять жизненным циклом выполнения теста из модульной системы тестирования (JUnit или TestNG) в Arquillian.

  3. Для каждого теста:

    1. Arquillian будет использовать Shrinkwrap для создания "микро архивов". Элемент управления classpath, разрешенный ShrinkWrap, позволяет Arquillian декларативно определять собственный архив Java EE, который инкапсулирует тестовый класс и его зависимые ресурсы, но не более того! Это дает вам тонкий контроль над тем, что вы тестируете и какие ресурсы доступны во время выполнения теста.
    2. Arquillian развертывает каждый «микроархив» в целевом контейнере (который настроен в профиле maven), я предполагаю, что один за другим.
    3. Затем он согласовывает выполнение методов тестирования и фиксирует результаты тестирования, используя удаленную связь с сервером.
    4. Наконец, Аркильян разворачивает тестовый архив.