Автоматизация юнит-тестов (junit) для разработки Eclipse Plugin - PullRequest
16 голосов
/ 01 ноября 2008

Я занимаюсь разработкой плагинов Eclipse, и мне нужно иметь возможность автоматизировать сборку и выполнение набора тестов для каждого плагина. (С использованием Junit)

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

Однако каждый из приведенных выше подходов приводит к одной и той же проблеме: команда задачи / командной строки java ant, которая запускает сборку или должна запустить тест, не генерирует видимых побочных эффектов и возвращает значение «13». Я перепробовал все, что смог найти, и довольно много узнал о том, как запускается Eclipse (например: начиная с версии 3.3 вы больше не можете использовать startup.jar - он не существует - но вы должны использовать org.eclipse.equinox.launcher ). К сожалению, хотя это, по-видимому, необходимая информация, ее далеко не достаточно.

Я работаю с Eclipse 3.4, Junit 4.3.1 (комплект org.junit4, но я бы предпочел использовать JUnit 4.4. См. здесь .)

Итак, мой вопрос: как именно вы автоматизируете сборку и тестирование плагинов Eclipse?

Редактировать: Чтобы уточнить, я хочу использовать что-то вроде муравья + круиз-контроль, но я даже не могу заставить модульные тесты запускать на всех за пределами Затмения. Я говорю «что-то вроде», потому что есть другие технологии, которые выполняют то же самое, и я не настолько придирчив, чтобы отказаться от решения, которое работает только потому, что оно использует, скажем, Maven или Buckminster, если эти технологии делают это существенно проще.

Edit2: Упомянутый выше «Java Result 13» вызван невозможностью найти coretestrunner. Из журнала:

java.lang.RuntimeException: Application "org.eclipse.test.coretestapplication" could not be found in the registry. The applications available are: org.eclipse.equinox.app.error, com.rcpquickstart.helloworld.application.
    at org.eclipse.equinox.internal.app.EclipseAppContainer.startDefaultApp(EclipseAppContainer.java:242)
    at org.eclipse.equinox.internal.app.MainApplicationLauncher.run(MainApplicationLauncher.java:29)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:382)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1212)
    at org.eclipse.core.launcher.Main.main(Main.java:30)

!ENTRY org.eclipse.osgi 2 0 2008-11-04 21:02:10.514
!MESSAGE The following is a complete list of bundles which are not resolved, see the prior log entry for the root cause if it exists:
!SUBENTRY 1 org.eclipse.osgi 2 0 2008-11-04 21:02:10.515
!MESSAGE Bundle update@plugins/org.eclipse.test_3.2.0/ [34] was not resolved.
!SUBENTRY 2 org.eclipse.test 2 0 2008-11-04 21:02:10.516
!MESSAGE Missing required bundle org.apache.ant_0.0.0.
!SUBENTRY 2 org.eclipse.test 2 0 2008-11-04 21:02:10.516
!MESSAGE Missing required bundle org.eclipse.ui.ide.application_0.0.0.
!SUBENTRY 1 org.eclipse.osgi 2 0 2008-11-04 21:02:10.518
!MESSAGE Bundle update@plugins/org.eclipse.ant.optional.junit_3.2.100.jar [60] was not resolved.
!SUBENTRY 2 org.eclipse.ant.optional.junit 2 0 2008-11-04 21:02:10.519
!MESSAGE Missing host org.apache.ant_[1.6.5,2.0.0).
!SUBENTRY 2 org.eclipse.ant.optional.junit 2 0 2008-11-04 21:02:10.519
!MESSAGE Missing required bundle org.eclipse.core.runtime.compatibility_0.0.0.

Ответы [ 7 ]

12 голосов
/ 13 ноября 2008

Я только что начал тестирование JUnit как часть безголовой сборки для нашего приложения RCP.

Я нашел эту статью - Автоматизация модульных тестов Eclipse PDE с использованием Ant невероятно полезна. Он предоставляет код и подход, чтобы вы начали. Тем не менее, ряд вещей, которые я обнаружил:

О коде статьи

  • тестировался только один пакет (мы отделили процесс сборки от кода, используя Buckminster )
  • был только один тестовый класс.
  • они оба были эффективно закодированы в сценарий сборки

Об Eclipse PDE

  • uitestapplication требуется еще testApplication. Использование coretestapplication не позволяет.
  • , поскольку эти приложения находятся в связках, которые зависят от SWT. В большинстве случаев это просто убийство, но не в том случае, если ваша сборочная машина представляет собой Windows-систему. Мне бы очень хотелось, чтобы они разбились на не-пользовательские интерфейсы.

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

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

Наша новая и блестящая установка

  • Бакминстер строит связки.
  • target копирует пакеты с целевой платформы, org.eclipse.pde.runtime и org.eclipse.jdt.junit в «tester-eclipse-install». Это должно решить вашу проблему Java Result 13.
  • найти фрагменты теста при просмотре рабочего пространства
  • найти фрагмент хоста по просмотру манифеста
  • найти тестовые классы по просмотру проекта в рабочей области.
  • зарегистрируйте PDETestListener, модифицированный для обработки нескольких тестовых классов
  • вызвать tester-eclipse-install с несколькими классами тестирования.

Я также прочитал Автоматизация сборки и тестирования плагинов и функций , но мы не используем PDE-Build напрямую.

3 голосов
/ 14 января 2015

Для любого, кто все еще ищет способ выполнить тесты плагинов Eclipse вне Eclipse, мне подходит следующая команда:

java -Xms40m -Xmx1024m -XX:MaxPermSize=512m -Dorg.eclipse.swt.browser.DefaultType=mozilla -Declipse.pde.launch=true -classpath C:\eclipse\eclipse-standard-luna-M2-win32-x86_64\eclipse\plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar org.eclipse.equinox.launcher.Main -port 22 -testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader -loaderpluginname org.eclipse.jdt.junit4.runtime -classNames testpackage.testClass -application org.eclipse.pde.junit.runtime.uitestapplication -data C:\temp\log.temp -dev bin -consoleLog -testpluginname PluginName

-classpath должен быть установлен на Eclipse Launcher Jar. Точную версию Eclipse вы можете получить из файла eclipse.ini.

-className - имя файла теста плагина junit

-data установлен для временного файла.

-testpluginname - это имя плагина, который вы хотите протестировать.

2 голосов
/ 08 июня 2009

Глядя на ваше исключение, он говорит, что coretestapplication отсутствует. Цель ant может быть найдена в plugins / org.eclipse.test_3.1.0 / library.xml: 10

На самом деле это проблема зависимости. Eclipse должен иметь все плагины для сборки.

Для правильной настройки есть 2 файла для просмотра.

  1. Файл продукта
  2. Feature.xml

Продукт

Убедитесь, что файл продукта содержит все необходимые плагины.

После этого добавьте функции org.eclipse.rcp и org.eclipse.test

... плагины выше ...

<features>
      <feature id="mock_feature" version="1.0.0"/>
      <feature id="mock_feature_test" version="1.0.0"/>
      <feature id="org.eclipse.rcp" version="3.2.0.v20060609m-SVDNgVrNoh-MeGG"/>
      <feature id="org.eclipse.test" version="3.2.0.v20060220------0842282442"/>
 </features>

Вам нужен org.eclipse.test для запуска тестов и org.eclipse.rcp для запуска eclipse для запуска тестов.

Не забудьте установить для useFeatures значение 'true'

<product name="mock" id="com.example.mock" application="com.example.mock.application" useFeatures="true">

feature.xml

Если у вас есть функция для тестирования, вы должны добавить 2 дополнительных плагина.

... другие плагины выше ...

<plugin
         id="org.apache.ant"
         download-size="0"
         install-size="0"
         version="0.0.0"/>

   <plugin
         id="org.eclipse.core.runtime.compatibility"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

Для запуска тестов требуется org.apache.ant, а для запуска org.eclipse.core.runtime.compatibility.

Еще один гоча

Убедитесь, что в вашем целевом затмении (копии затмения, которое вы используете для построения) есть только 1 копия каждого плагина. Например, если в папке плагинов есть 2 версии плагинов com.ibm.icu, eclipse будет использовать более новую. Поскольку плагин сборки pde настроен на использование определенной версии, eclipse будет жаловаться, что не может найти конкретный плагин, даже когда он там есть.

Некоторые мысли

Весь процесс построения затмения может быть намного лучше. На самом деле я получил процесс в основном методом проб и ошибок. Документация устарела и скудна. Сообщения об ошибках не помогают. Это только оставляет вас чувствовать себя беспомощным и разочарованным. Будем надеяться, что этот пост поможет программисту сэкономить время!

0 голосов
/ 03 сентября 2009

В качестве альтернативы Ant у меня был хороший опыт использования совершенно нового Maven + Tycho с Hudson. Tycho обеспечивает полную поддержку разработки Osgi и Eclipse в Maven. В настоящее время он находится в стадии доработки, но большинство функций, которые мне нужны, работали. С вашей стороны ему нужно очень мало настроек, потому что он может анализировать файлы MANIFEST.MF.

Если у вас есть некоторый опыт работы с Maven, начать работу с ним не очень сложно. Хадсон немного более проблематичен из-за отсутствия поддержки Maven 3. (версия разработки Maven 3 используется Tycho)

Ссылки для запуска:

0 голосов
/ 04 ноября 2008

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

0 голосов
/ 03 ноября 2008

Вот инструмент, который я могу рекомендовать, если кто-то заинтересован в TDD: Infinitest

Краткое описание взято с сайта Infinitest:

Что такое Инфинитест?

Infinitest - постоянный тестовый бегун предназначен для облегчения Test Driven Развитие. Infinitest помогает вам изучать TDD, предоставляя обратную связь, как вы работать, и поможет вам освоить TDD сокращение вашего цикла обратной связи от минуты до нескольких секунд.

Всякий раз, когда вы меняете класс, Infinitest запускает ваши тесты для вас. Это умно о том, какие тесты запускать, и запускает только те, которые вам нужны. Если о любых ошибках, сообщает о них ясно и кратко. Это дает вам мгновенный отзыв о семантике правильность вашего кода, так же, как современные IDE дают вам мгновенную обратную связь о синтаксических ошибках.

0 голосов
/ 01 ноября 2008

Мы используем сценарии сборки PDE (см. этот вопрос ) и экспортируем файлы сборки ant для наших плагинов модульного тестирования. Затем эти сценарии сборки ant вызываются из сценариев сборки PDE (customTargets.xml) с помощью ant-задачи «ant». К сожалению, это работает только с JUnit3. Должен быть JUnit4-адаптер для JUnit3, чтобы вы могли запускать тесты JUnit4 из JNnit3.

Мы, вероятно, перейдем к чему-то вроде Maven; Сценарии сборки PDE на самом деле не предназначены для того, что нам нужно с ними делать.

...