自动化Eclipse插件开发的单元测试(junit)

时间:2008-11-01 01:20:42

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

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

测试正在Eclipse中运行,我可以将插件分解为实际的插件和片段插件,用于单元测试herehere以及几个地方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.

7 个答案:

答案 0 :(得分:12)

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

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

关于文章的代码

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

关于Eclipse PDE

  • uitestapplication需要另一个testApplication。使用coretestapplication不会。
  • 因为这些应用程序都是依赖于SWT的捆绑包。在大多数情况下,这是一个交易杀手,但如果您的构建计算机是Windows机箱,则不是这样。我很乐意看到这些分为非UI捆绑包。

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

在发现这些假设之后,这项工作相对简单。

我们新的闪亮设置

  • buckminster构建捆绑包。
  • target将目标平台上的bundle,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。

答案 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个文件。

  1. 产品文件
  2. feature.xml
  3. <强>产品

    确保产品文件包含您需要的所有插件。

    之后,添加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)

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