【问题标题】:Automating unit tests (junit) for Eclipse Plugin development为 Eclipse 插件开发自动化单元测试 (junit)
【发布时间】:2010-09-20 07:13:15
【问题描述】:

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

测试在 Eclipse 中运行,我可以将插件分解为实际插件和片段插件,用于单元测试,如 herehere 和几个地方 here 所述。

但是,上述每种方法都会导致相同的问题:发出构建或应触发测试的 java ant 任务/命令行命令不会产生可观察到的副作用,并返回值“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 之外。我说“类似”是因为有其他技术可以完成同样的事情,而且我不会因为使用 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.

【问题讨论】:

  • 你有没有想出一个实用的方法来实现你的目标?
  • 我使用 tycho surefire plugin 自动构建和测试我的 Eclipse 插件。它就像一个魅力。

标签: java testing junit eclipse-pde eclipse-3.4


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    什么是无穷大?

    Infinitest 是一个持续的测试运行器 旨在促进测试驱动 发展。无限帮助你 通过提供反馈来学习 TDD 工作,并通过以下方式帮助您掌握 TDD 减少您的反馈周期 分到几秒。

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

    【讨论】:

    • 我看不出这与我的问题有什么关系——请您详细说明一下?
    • 这个工具是一个连续的 JUnit 测试运行器。 Infinitest 自动执行junit。这就是我向你推荐它的原因。
    • 啊.. 如果我目前正在尝试的事情没有成功,我会更深入地研究一下。
    【解决方案3】:

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

    【讨论】:

    • 我试图澄清——使用 Ant 需要我可以在 Eclipse 之外运行单元测试,正如问题所述,到目前为止我无法做到这一点。
    【解决方案4】:

    我刚刚将 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。

    我还阅读了Build and Test Automation for plug-ins and features,但我们没有直接使用 PDE-Build。

    【讨论】:

      【解决方案5】:

      查看您的异常,它说缺少 coretestapplication。 ant 目标位于 plugins/org.eclipse.test_3.1.0/library.xml:10

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

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

      1. 产品文件
      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 来启动。

      另一个问题

      确保在您的目标 eclipse(您用来构建的 eclipse 副本)中,每个插件只有 1 个副本。例如,如果插件文件夹中有 2 个版本的 com.ibm.icu 插件,则 eclipse 将使用较新的版本。由于 pde 构建插件被配置为使用特定版本,eclipse 会抱怨它找不到特定的插件,即使它在那里。

      一些想法

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

      【讨论】:

        【解决方案6】:

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

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

        开始链接:

        【讨论】:

          【解决方案7】:

          对于仍在寻找在 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 是您要测试的插件的名称。

          【讨论】:

          • 无法连接到: : 22
          • 选择端口的标准是什么?或者更一般地说,用于此目的的选项的更详尽的文档在哪里? (我刚刚查了一下端口 22:ssh。为什么是 SSH 端口?)
          • 我尝试了80端口,它又崩溃了,但它似乎导致浏览器窗口在崩溃之前暂时打开了?!?!?!
          • 您使用的是哪个版本的 Eclipse?看起来您可能不需要为较新版本的 Eclipse 传递 Port。
          • 你可以通过查看 "org.eclipse.equinox.launcher.Main" (grepcode.com/file/repository.grepcode.com/java/eclipse.org/4.2/…) 的代码来了解这些参数
          猜你喜欢
          • 2010-10-31
          • 2012-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-08
          • 2011-04-17
          • 2013-08-24
          • 1970-01-01
          相关资源
          最近更新 更多