16

我正在开发 Eclipse 插件,我需要能够为每个插件自动构建和执行测试套件。(使用 Junit)

测试在 Eclipse 中工作,我可以将插件分解为实际插件和用于单元测试的片段插件,如此处、此处和此处的几个地方所述

但是,上述每种方法都会导致相同的问题:发出构建或应该触发测试的 java ant 任务/命令行命令不会产生可观察到的副作用,并返回值“13”。我已经尝试了所有我能找到的东西,并且我对 Eclipse 的启动方式有了一些了解(例如:从 v3.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 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.
4

7 回答 7

12

我刚刚将 JUnit 测试作为我们 RCP 应用程序的无头构建的一部分。

我发现这篇文章 - Automating Eclipse PDE Unit Tests using Ant非常有帮助。它提供了帮助您入门的代码和方法。但是,我发现了一些事情:

关于文章的代码

  • 只有一个包在测试中(我们使用Buckminster将构建过程从代码中分离出来)
  • 只有一个测试班。
  • 这些都被有效地硬编码到构建脚本中

关于 Eclipse PDE

  • 需要uitestapplication另一个testApplication。使用coretestapplication不。
  • 因为这些应用程序都在依赖于 SWT 的包中。在大多数情况下,这是一个交易杀手,但如果您的构建机器是 Windows 机器,则不是。我希望看到这些拆分成非 UI 包。

我发现提供的代码是一个很好的起点,但在其实现中隐含了许多上述假设。

发现这些假设后,做这项工作就相对简单了。

我们新的闪亮设置

  • buckminster 构建捆绑包。
  • target 将包从目标平台、org.eclipse.pde.runtime 和 org.eclipse.jdt.junit 复制到“tester-eclipse-install”中。这应该可以解决您的Java Result 13问题。
  • 通过查看工作区找到测试片段
  • 通过查看清单找到片段主机
  • 通过查看工作区中的项目找到测试类。
  • 注册一个PDETestListener修改来处理多个测试类
  • 使用多个测试类调用 tester-eclipse-install。

我还阅读了插件和功能的构建和测试自动化,但我们没有直接使用 PDE-Build。

于 2008-11-13T20:00:28.997 回答
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是您要测试的插件的名称。

于 2015-01-13T23:04:00.677 回答
2

查看您的异常,它说缺少 coretestapplication。可以在 plugins/org.eclipse.test_3.1.0/library.xml:10 中找到 ant 目标

这实际上是一个依赖问题。Eclipse 需要拥有所有插件才能构建。

要正确配置它,需要查看 2 个文件。

  1. 产品档案
  2. 特征.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">

特征.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 会抱怨它无法找到特定插件,即使它存在。

一些想法

构建eclipse的整个过程可能会好很多。事实上,我主要通过反复试验得到了这个过程。文档已过时且稀疏。错误消息没有帮助。它只会让你感到无助和沮丧。让我们希望这篇文章可以帮助程序员节省一些时间!

于 2009-06-08T07:41:27.460 回答
0

我们正在使用 PDE 构建脚本(请参阅此问题),并为我们的单元测试插件导出 ant 构建文件。然后使用“ant”ant 任务从 PDE 构建脚本 (customTargets.xml) 调用这些 ant 构建脚本。不幸的是,这只适用于 JUnit3。JUnit3 应该有一个 JUnit4 适配器,因此您可以从 JUnit3 测试运行器运行 JUnit4 测试。

我们可能会转向 Maven 之类的东西;PDE 构建脚本并没有真正适合我们需要用它们做的事情。

于 2008-11-01T07:29:12.750 回答
0

作为 Ant 的替代品,我在使用全新的 Maven+Tycho 和 Hudson 方面有很好的经验。Tycho 为 Maven 中的 Osgi 和 Eclipse 开发提供完整的支持。它目前正在大力开发,但我需要的大部分功能都可以使用。它只需要您进行很少的配置,因为它可以解析 MANIFEST.MF 文件。

如果您对 Maven 有一定的经验,那么开始使用它并不难。由于缺少 Maven 3 支持,Hudson 的问题更加严重。(Tycho使用的是Maven 3的开发版)

开始链接:

于 2009-09-03T14:20:44.080 回答
-1

如果有人对 TDD 感兴趣,我可以推荐一个工具: Infinitest

从 Infinitest 网站提取的简短描述:

什么是无限?

Infinitest 是一个持续测试运行器,旨在促进测试驱动开发。Infinitest 通过在工作时提供反馈来帮助您学习 TDD,并通过将反馈周期从几分钟缩短到几秒钟来帮助您掌握 TDD。

每当您更改课程时,Infinitest 都会为您运行测试。运行什么测试很聪明,只运行你需要的测试。如果发生任何错误,它会清晰简洁地报告它们。这会给你关于代码语义正确性的即时反馈,就像现代 IDE 给你关于语法错误的即时反馈一样。

于 2008-11-03T12:56:54.447 回答
-1

使用AntCruiseControl - 您可以在Ant脚本中调用单元测试以及构建逻辑的其余部分,并且可以在每次构建迭代时运行它们 - 然后CruiseControl可以自动执行构建调用并每次运行这些测试。

于 2008-11-04T19:28:25.183 回答