自动化Eclipse插件开发的unit testing(junit)
我正在开发Eclipse插件,我需要能够为每个插件自动构建和执行测试套件。 (使用Junit)
测试在Eclipse中工作,我可以将插件分解为实际的插件和片段插件,用于unit testing,如此处所述, 此处以及此处的几个地方。
但是,上述每种方法都会导致相同的问题:发出构建或应触发测试的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。请看这里 。)
所以,我的问题是:你如何自动化Eclipse插件的构建和测试?
编辑:为了澄清,我想使用像ant +巡航控制这样的东西,但我甚至无法让unit testing在 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.
我刚刚将JUnit测试作为RCP应用程序的无头构建的一部分。
我发现这篇文章 – 使用Ant自动化Eclipse PDEunit testing非常有帮助。 它提供了帮助您入门的代码和方法。 但是,我发现了很多东西:
关于文章的代码
- 测试中只有一个包(我们使用Buckminster从代码中分离出构建过程)
- 只有一个测试类。
- 这些都被有效地硬编码到构建脚本中
关于Eclipse PDE
-
uitestapplication
需要另一个testApplication
。 使用coretestapplication
不会。 - 因为这些应用程序都是依赖于SWT的捆绑包。 在大多数情况下,这是一个交易杀手,但如果您的构建机器是Windows机器箱,则不是这样。 我很乐意看到这些分为非UI捆绑。
我发现提供的代码是一个很好的起点,但在实现中隐含了许多上述假设。
在发现这些假设后,做这项工作相对简单。
我们新的shiny设置
- buckminster构建捆绑包。
- target将目标平台上的bundle,org.eclipse.pde.runtime和org.eclipse.jdt.junit复制到“tester-eclipse-install”中。 这应该解决您的
Java Result 13
问题。 - 从查看工作区找到测试片段
- 从查看清单中找到片段主机
- 通过查看工作区中的项目来查找测试类。
- 注册修改的
PDETestListener
以处理多个测试类 - 使用多个测试类调用tester-eclipse-install。
我还阅读了构建和测试自动化的插件和function,但我们没有直接使用PDE-Build。
对于仍在寻找在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
是您要测试的插件的名称。
看看你的exception,它说缺少核心测试应用程序。 ant目标可以在plugins / org.eclipse.test_3.1.0 / library.xml:10中找到
这实际上是一个依赖问题。 Eclipse需要拥有所有插件才能构建。
要正确配置,需要查看2个文件。
- 产品文件
- feature.xml
产品
确保产品文件包含您需要的所有插件。
之后,添加org.eclipse.rcp和org.eclipse.testfunction
……插件在…之上
你需要org.eclipse.test来运行测试,而org.eclipse.rcp则需要启动eclipse才能运行测试。
不要忘记将useFeatures设置为’true’
feature.xml的
假设您有一个测试function,则必须添加2个额外的插件。
……上面的其他插件……
测试需要org.apache.ant来运行测试和org.eclipse.core.runtime.compatibility才能启动。
另一个问题
确保在你的目标eclipse(你用来构建的eclipse的副本)中,每个插件只有一个副本。 例如,如果插件文件夹中有两个版本的com.ibm.icu插件,eclipse将使用较新的插件。 由于pde构建插件配置为使用特定版本,eclipse会抱怨它找不到特定的插件,即使它存在。
一些想法
构建日食的整个过程可能要好得多。 事实上,我主要是通过反复试验来完成这个过程。 文档已过时且稀疏。 错误消息没有帮助。 它只会让你感到无助和沮丧。 让我们希望这篇文章可以帮助一个程序员节省一些时间!
我们正在使用PDE构建脚本(请参阅此问题 ),我们为unit testing插件导出ant构建文件。 然后使用“ant”ant-task从PDE构建脚本(customTargets.xml)调用这些ant构建脚本。 不幸的是,这只适用于JUnit3。 应该是JUnit3的JUnit4适配器,因此您可以从JUnit3测试运行器运行JUnit4测试。
我们可能会转向像Maven这样的东西; PDE构建脚本并没有真正用于我们需要做的事情。
作为Ant的替代品,我在使用全新的Maven + Tycho和Hudson方面有着丰富的经验。 Tycho为Maven中的Osgi和Eclipse开发提供全面支持。 它目前正在大力发展,但我需要的大多数function都有效。 它只需要很少的配置,因为它可以解析MANIFEST.MF文件。
如果您对Maven有一些经验,那么开始使用它并不是很难。 由于缺少Maven 3支持,Hudson有点问题。 (Tycho使用Maven 3的开发版本)
开始链接:
- 不完整的用户文档
如果有人对TDD感兴趣,我可以推荐这个工具: Infinitest
从Infinitest网站提取的简短描述:
什么是无限?
Infinitest是一款旨在促进测试驱动开发的连续测试运行器。 Infinitest通过在您工作时提供反馈来帮助您学习TDD,并通过将您的反馈周期从几分钟缩短到几秒来帮助您掌握TDD。
无论何时更改课程,Infinitest都会为您运行测试。 关于运行哪些测试很聪明,只运行你需要的测试。 如果发生任何错误,它会清楚简明地报告。 这为您提供了有关代码语义正确性的即时反馈,就像现代IDE为您提供有关语法错误的即时反馈一样。
使用Ant和CruiseControl – 您可以在Ant脚本中调用unit testing以及构建逻辑的其余部分,并且可以在每次构建迭代时运行它们 – 然后CruiseControl可以自动执行构建调用并每次运行这些测试。