我正在开发Eclipse插件,我需要能够为每个插件自动构建和执行测试套件。 (使用Junit)
测试正在Eclipse中运行,我可以将插件分解为实际的插件和片段插件,用于单元测试here,here以及几个地方here。
但是,上述每种方法都会导致相同的问题:发出构建或应触发测试的java ant task / commandline命令,不会产生可观察到的副作用,并返回值“13”。我已经尝试了所有我能找到的东西,并且我已经了解了Eclipse如何启动(例如:从v3.3开始,你不能再使用startup.jar - 它不存在 - 但你应该使用org.eclipse.equinox.launcher)。不幸的是,虽然这显然是必要的信息,但远远不够。
我正在使用Eclipse 3.4,Junit 4.3.1(org.junit4包,但我更喜欢使用JUnit 4.4。请参阅here。)
所以,我的问题是:你如何自动构建和测试Eclipse插件?
编辑:为了澄清,我希望使用类似ant +巡航控制的东西,但我甚至无法让单元测试运行 在Eclipse之外。我说“类似的东西”,因为还有其他技术可以实现同样的目标,而且我不会那么挑剔,因为它放弃使用say,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.
答案 0 :(得分:12)
我刚刚将JUnit测试作为RCP应用程序的无头构建的一部分。
我发现这篇文章 - Automating Eclipse PDE Unit Tests using Ant非常有帮助。它提供了帮助您入门的代码和方法。但是,我发现了很多事情:
uitestapplication
需要另一个testApplication
。使用coretestapplication
不会。 我发现提供的代码是一个很好的起点,但在实现过程中隐含了许多上述假设。
在发现这些假设之后,这项工作相对简单。
Java Result 13
问题。PDETestListener
已修改以处理多个测试类我也读过Build and Test Automation for plug-ins and features,但我们没有直接使用PDE-Build。
答案 1 :(得分:3)
对于仍在寻找在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启动程序jar。您可以从eclipse.ini
文件中获取Eclipse的确切版本。
-className
是junit插件测试文件名
-data
设置为临时文件。
-testpluginname
是您要测试的插件的名称。
答案 2 :(得分:2)
查看您的异常,它表示缺少核心测试应用程序。 ant目标可以在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的副本)中,每个插件只有一个副本。例如,如果插件文件夹中有两个版本的com.ibm.icu插件,eclipse将使用较新的插件。由于pde构建插件配置为使用特定版本,eclipse会抱怨它找不到特定的插件,即使它存在。
一些想法
构建日食的整个过程可能要好得多。事实上,我主要是通过反复试验来完成这个过程。文档已过时且稀疏。错误消息没有帮助。它只会让你感到无助和沮丧。让我们希望这篇文章可以帮助程序员节省一些时间!
答案 3 :(得分:0)
我们正在使用PDE构建脚本(请参阅this question),我们为单元测试插件导出ant构建文件。然后使用“ant”ant-task从PDE构建脚本(customTargets.xml)调用这些ant构建脚本。不幸的是,这只适用于JUnit3。应该是JUnit3的JUnit4适配器,因此您可以从JUnit3测试运行器运行JUnit4测试。
我们可能会转向像Maven这样的人; PDE构建脚本并没有真正完成我们需要做的事情。
答案 4 :(得分:0)
作为Ant的替代品,我在使用全新的Maven + Tycho和Hudson方面拥有丰富的经验。 Tycho为Maven中的Osgi和Eclipse开发提供全面支持。它目前正在大力发展,但我需要的大部分功能都有效。它只需要很少的配置,因为它可以解析MANIFEST.MF文件。
如果您对Maven有一些经验,那么开始使用Maven并不是很困难。由于缺少Maven 3支持,Hudson有点问题。 (Tycho使用Maven 3的开发版本)
开始的链接:
答案 5 :(得分:-1)
如果有人对TDD感兴趣,我可以推荐这个工具: Infinitest
从Infinitest网站提取的简短描述:
什么是无限?
Infinitest是一个连续的测试运行者 旨在促进测试驱动 发展。无限帮助你 通过提供反馈来学习TDD 工作,并帮助您掌握TDD 减少你的反馈周期 几分钟到几秒钟。
每当你改变一个班级, Infinitest为您运行测试。 关于运行哪些测试很聪明, 并且只运行你需要的那些。如果 发生任何错误,报告它们 清楚而简洁。这给了你 关于语义的即时反馈 代码的正确性,就像 现代IDE为您提供即时反馈 关于语法错误。
答案 6 :(得分:-1)
使用Ant和CruiseControl - 您可以在Ant脚本中调用单元测试以及构建逻辑的其余部分,并可以在每次构建迭代时运行它们 - 然后{{ 3}}可以自动化你的构建调用并每次都运行这些测试。