自动化单元测试 (junit) 以进行 Eclipse 插件开发

2022-09-03 07:13:19

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

测试在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插件的构建和测试?

编辑:为了澄清,我想使用像蚂蚁+巡航控制这样的东西,但我甚至无法在Eclipse之外运行单元测试。我说“类似的东西”是因为还有其他技术可以完成同样的事情,我不会那么挑剔,以至于放弃一个有效的解决方案,仅仅因为它使用了Maven或Buckminster,如果这些技术使这变得容易得多的话。

编辑2:上面提到的“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.

答案 1

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

我发现这篇文章 - 使用Ant自动执行Eclipse PDE单元测试非常有帮助。它提供了代码和方法来帮助您入门。但是,我发现了很多事情:

关于文章的代码

  • 只有一个捆绑包正在测试中(我们已经使用Buckminster将构建过程与代码分开)
  • 只有一个测试类。
  • 这些都被有效地硬编码到构建脚本中。

关于 Eclipse PDE

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

我发现提供的代码是一个很好的起点,但是它们的实现中隐含了上述一些假设。

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

我们崭新而闪亮的设置

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

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


答案 2

对于任何仍在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 的确切版本。eclipse.ini

-className是 junit 插件测试文件名

-data设置为临时文件。

-testpluginname是要测试的插件的名称。