Я разрабатываю плагины 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?
Редактировать: Чтобы прояснить, я хочу, чтобы использовать что-то вроде муравей + круиз-контроль, но я даже не могу заставить модульные тесты запускать совсем вне Eclipse. Я говорю «что-то вроде», потому что есть другие технологии, которые выполняют то же самое, и я не настолько разборчив, чтобы отказываться от решения, которое работает только потому, что оно использует, скажем, Maven или Buckminster, если эти технологии значительно упрощают задачу.
Edit2: Упомянутый выше «Результат Java 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.




Мы используем сценарии сборки PDE (см. этот вопрос) и экспортируем файлы сборки ant для наших подключаемых модулей модульного тестирования. Затем эти сценарии сборки муравьев вызываются из сценариев сборки PDE (customTargets.xml) с помощью задачи муравья «муравей». К сожалению, это работает только с JUnit3. Предполагается, что для JUnit3 должен быть JUnit4-адаптер, поэтому вы можете запускать тесты JUnit4 из тест-бегуна JUnit3.
Мы, вероятно, перейдем к чему-то вроде Maven; сценарии сборки PDE на самом деле не подходят для того, что нам нужно с ними делать.
Вот инструмент, который я могу порекомендовать, если TDD кого-то заинтересует: Infinitest
Краткое описание взято с сайта Infinitest:
What is Infinitest?
Infinitest is a continuous test runner designed to facilitate Test Driven Development. Infinitest helps you learn TDD by providing feedback as you work, and helps you master TDD by reducing your feedback cycle from minutes to mere seconds.
Whenever you change a class, Infinitest runs your tests for you. It's smart about what tests to run, and only runs the ones you need. If any errors occur, it reports them clearly and concisely. This gives you instant feedback about the semantic correctness of your code, just as modern IDE's give you instant feedback about syntax errors.
Я не понимаю, какое отношение это имеет к моему вопросу - не могли бы вы уточнить?
Этот инструмент является средством непрерывного выполнения тестов JUnit. Infinitest автоматизирует выполнение junit. Вот почему я рекомендовал это вам.
ах .. Я рассмотрю более подробно, если текущая вещь, которую я пытаюсь сделать, не сработает.
Используйте Муравей и Круиз-контроль - вы вызываете модульные тесты в сценарии Муравей, а также остальную часть своей логики сборки и можете запускать их с каждой итерацией сборки - тогда Круиз-контроль может автоматизировать ваши вызовы сборки и запускать эти тесты каждый раз.
Я попытался уточнить - использование Ant требует, чтобы я мог запускать модульные тесты вне Eclipse, чего я пока не смог сделать, как гласит вопрос.
Я только что получил тестирование JUnit, работающее как часть автономной сборки для нашего приложения RCP.
Я нашел эту статью - Автоматизация модульных тестов Eclipse PDE с использованием Ant невероятно полезной. Он предоставляет код и подход, которые помогут вам начать работу. Однако я обнаружил ряд вещей:
uitestapplication требует другого testApplication. Использование coretestapplication - нет.Я обнаружил, что предоставленный код является хорошей отправной точкой, но в его реализации присутствует ряд вышеупомянутых предположений.
Обнаружив эти предположения, работа была относительно простой.
Java Result 13.PDETestListener, модифицированный для обработки нескольких тестовых классовЯ также читал Автоматизация сборки и тестирования плагинов и функций, но мы не используем PDE-Build напрямую.
Глядя на ваше исключение, он говорит, что приложение coretest отсутствует. Цель муравья находится в plugins / org.eclipse.test_3.1.0 / library.xml: 10
На самом деле это проблема зависимости. У Eclipse должны быть все плагины для сборки.
Чтобы настроить его правильно, нужно посмотреть 2 файла.
Товар
Убедитесь, что файл продукта содержит все необходимые плагины.
После этого добавьте функции 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 для запуска.
Еще одна ошибка
Убедитесь, что в вашем целевом eclipse (копии eclipse, которую вы используете для построения против), есть только 1 копия каждого плагина. Например, если в папке плагинов есть 2 версии плагинов com.ibm.icu, eclipse будет использовать более новую. Поскольку плагин сборки pde настроен на использование определенной версии, eclipse будет жаловаться, что не может найти конкретный плагин, даже если он там есть.
Некоторые мысли
Весь процесс построения затмения мог бы быть намного лучше. На самом деле я получил этот процесс в основном методом проб и ошибок. Документация устарела и немногочисленна. Сообщения об ошибках не помогают. Это только оставляет чувство беспомощности и разочарования. Будем надеяться, что этот пост поможет товарищу-программисту сэкономить время!
В качестве альтернативы Ant у меня был хороший опыт использования нового Maven + Tycho с Hudson. Tycho обеспечивает полную поддержку разработки Osgi и Eclipse на Maven. В настоящее время он интенсивно разрабатывается, но большинство необходимых мне функций работают. С вашей стороны требуется очень небольшая настройка, поскольку он может анализировать файлы MANIFEST.MF.
Если у вас есть некоторый опыт работы с Maven, начать с ним работать несложно. Хадсон немного более проблематичен из-за отсутствия поддержки Maven 3. (разрабатываемая версия Maven 3 используется Tycho)
Ссылки для старта:
Для тех, кто все еще ищет способ выполнить тесты плагинов 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 установлен как временный файл.
-testpluginname - это название плагина, который вы хотите протестировать.
Не удалось подключиться к:: 22
Каков критерий выбора порта? Или, в более общем плане, где можно найти более подробную документацию о вариантах для этой цели? (Я только что поискал порт 22: ssh. Почему именно порт SSH?)
Я попробовал порт 80, и он снова вышел из строя, но, похоже, это привело к временному открытию окна браузера перед сбоем?!?!?!
Какую версию Eclipse вы используете? Похоже, вам может не понадобиться передавать порт для более новых версий Eclipse.
Вы можете получить некоторое представление об этих аргументах, посмотрев на код "org.eclipse.equinox.launcher.Main" (grepcode.com/file/repository.grepcode.com/java/eclipse.org/ 4.2 /…)
проверить функцию processCommandLine (grepcode.com/file/repository.grepcode.com/java/eclipse.org/ 4.2 /…)
Вы когда-нибудь находили практический способ достижения своих целей?