Автоматизация модульных тестов (junit) для разработки Eclipse Plugin
Я разрабатываю плагины Eclipse, и мне нужно иметь возможность автоматизировать создание и выполнение набора тестов для каждого плагина. (Использование Junit)
Тест работает в Eclipse, и я могу разбить плагины на фактический плагин и плагин фрагмента для модульного тестирования, как описано здесь, здесь и в паре мест здесь.
Однако каждый из приведенных выше подходов приводит к одной и той же проблеме: команда java ant task/commandline, которая выдает сборку или должна запускать тест, не генерирует видимых побочных эффектов и возвращает значение "13". Я пробовал все, что мог найти, и немного узнал о том, как запускается Eclipse (например: с версии 3.3 вы больше не можете использовать startup.jar - его не существует - но вы должны использовать org.eclipse.equinox.launcher). К сожалению, хотя это, по-видимому, необходимая информация, это далеко не достаточно.
Я работаю с Eclipse 3.4, Junit 4.3.1 (пакет org.junit4, но я бы скорее использовал JUnit 4.4. См. здесь.)
Итак, мой вопрос: как именно вы автоматизируете сборку и тестирование плагинов Eclipse?
Изменить: Чтобы уточнить, я хочу использовать что-то вроде ant + круиз-контроля, но я даже не могу выполнить модульные тесты для запуска вне Eclipse. Я говорю "что-то вроде", потому что есть другие технологии, которые выполняют одно и то же, и я не настолько разборчив, чтобы отказаться от решения, которое работает только потому, что оно использует Maven или Buckminster, если эти технологии значительно облегчают это.
Edit2: "Результат Java 13", упомянутый выше, по-видимому, вызван неспособностью найти сервер. Из журнала:
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 [email protected]/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 [email protected]/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.
Ответы
Ответ 1
Я только что тестировал JUnit, работая как часть безголовой сборки для нашего приложения RCP.
Я нашел эту статью - Автоматизация тестов Eclipse PDE с использованием Ant невероятно полезна. Он предоставляет код и подход, чтобы вы начали. Однако несколько вещей, которые я обнаружил:
О коде статьи
- был тестирован только один пакет (мы отделили наш процесс сборки от кода, используя Buckminster)
- был только один тестовый класс.
- они оба были жестко закодированы в сборку script
Об Eclipse PDE
-
uitestapplication
требуется другой testApplication
. Использовать coretestapplication
нет.
- поскольку эти приложения находятся в связках, имеющих зависимости от SWT. В большинстве случаев это убийца сделок, хотя это не означает, что ваша машина для сборки - это окно Windows. Я хотел бы увидеть, как эти расщепления разделяются на не-UI-пакеты.
Я обнаружил, что предоставленный код был хорошей отправной точкой, но имел ряд вышеприведенных предположений, подразумеваемых в их реализации.
Открыв эти предположения, выполнение работы было относительно прямым.
Наша новая и блестящая настройка
- buckminster строит пакеты.
- копирует пакеты из целевой платформы org.eclipse.pde.runtime и org.eclipse.jdt.junit в "tester-eclipse-install". Это должно позаботиться о вашей проблеме
Java Result 13
.
- найдите тестовые фрагменты, просмотрев рабочую область.
- найдите хост фрагмента, просматривая манифест
- найдите классы тестов, просмотрев проект в рабочей области.
- зарегистрировать
PDETestListener
, измененный для обработки нескольких тестовых классов
- вызвать тестер-eclipse-install с помощью нескольких тестовых классов.
Я также читал Build and Test Automation для плагинов и функций, но мы не используем PDE-Build напрямую.
Ответ 2
Для любого, кто все еще ищет способ выполнения плагинов 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. Вы можете получить точную версию для своего Eclipse из eclipse.ini
файла.
-className
- имя файла тестового модуля junit
-data
установлен в файл temp.
-testpluginname
- это имя плагина, который вы хотите проверить.
Ответ 3
Глядя на ваше исключение, он говорит, что отсутствует приложение coretestapplication. Цель ant может быть найдена в файлах plugins/org.eclipse.test_3.1.0/library.xml: 10
Это проблема с зависимостью. Для создания Eclipse необходимы все плагины.
Чтобы настроить его правильно, есть 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 build настроен на использование определенной версии, eclipse будет жаловаться на то, что он не сможет найти конкретный плагин, даже если он есть.
Некоторые мысли
Весь процесс построения затмения может быть намного лучше. Фактически, я получил процесс в основном методом проб и ошибок. Документация устарела и скудна. Сообщения об ошибках не помогают. Это только оставляет вас беспомощными и расстроенными. Позвольте надеяться, что этот пост помогает другому программисту сэкономить некоторое время!
Ответ 4
Мы используем скрипты сборки PDE (см. этот вопрос), и мы экспортируем файлы сборки ant для наших модулей unit-test. Эти скрипты сборки ant затем вызывается из скриптов сборки PDE (customTargets.xml), используя "ant" ant -task. К сожалению, это работает только с JUnit3. Там должен быть JUnit4-адаптер для JUnit3, поэтому вы можете запускать тесты JUnit4 от тестировщика JUnit3.
Мы, вероятно, перейдем к чему-то вроде Maven; сценарии сборки PDE на самом деле не вырезаны для того, что нам нужно делать с ними.
Ответ 5
В качестве альтернативы Ant у меня был хороший опыт использования нового Maven + Tycho с Hudson. Tycho обеспечивает полную поддержку разработки Osgi и Eclipse в Maven. В настоящее время он находится в тяжелом развитии, но большинство функций, которые мне нужны, были сработаны. Для этого требуется только небольшая конфигурация с вашей стороны, поскольку она может анализировать файлы MANIFEST.MF.
Если у вас есть некоторый опыт работы с Maven, вам не очень-то сложно начать работать с ним. Хадсон немного более проблематичен из-за отсутствия поддержки Maven 3. (версия разработки Maven 3 используется Tycho)
Ссылки для запуска:
Ответ 6
Вот инструмент, который я могу рекомендовать, если кто-то заинтересует TDD:
Infinitest
Краткое описание, извлеченное из сайта Infinitest:
Что такое Infinitest?
Infinitest - это непрерывный тестовый бегун предназначенные для облегчения тестирования Развитие. Infinitest помогает вам узнайте TDD, предоставив обратную связь, поскольку вы работать и помогает вам управлять TDD сокращение цикла обратной связи с минут до нескольких секунд.
Всякий раз, когда вы меняете класс, Infinitest запускает ваши тесты для вас. Он соображает, какие тесты нужно запускать, и работает только те, которые вам нужны. Если возникают какие-либо ошибки, они сообщают о них четко и кратко. Это дает вам мгновенная обратная связь о семантическом правильность вашего кода, так же как и современная IDE дает вам мгновенную обратную связь о синтаксических ошибках.
Ответ 7
Используйте Ant и CruiseControl - вы вызываете модульные тесты в Ant script, а также остальную логику сборки и можете запускать их с каждой build iteration - then CruiseControl может автоматизировать ваши вызовы сборки и запускать эти тесты каждый раз.