在具有IDE集成的OSGi应用程序中运行JUnit测试

时间:2018-08-01 02:02:47

标签: eclipse junit osgi

我祈祷你很好。

我正在尝试找到一种更有效的方法来为OSGi应用程序运行一些测试。很抱歉,如果已经问过这个问题,但是经过一个小时左右的搜索,我还是无法在SO或Web上的任何地方找到这个问题。

当前,我正在使用JUnit和Eclipse PDE的内置JUnit插件测试启动器。它运行得相当不错-它使用所有指定的捆绑软件(包括测试捆绑软件)启动整个OSGi应用程序,并在OSGi框架内运行JUnit测试。与标准的JUnit Test启动器一样,结果在IDE中报告,这很好,因为不仅可以查看失败消息是什么,而不必浏览日志,还可以双击任何测试失败,它将失败。带您直接到包含失败断言的代码行。进行非常高效的测试驱动开发。

使用这种方法的次优之处在于,启动和停止应用程序的开销相当可观-几秒钟。如果您仅使用一种特定的测试方法并且测试本身花费不到一秒钟的时间,那么这尤其痛苦。

我认为一个理想的解决方案是在Eclipse中使用JUnit启动器,它可以连接并在已经运行的OSGi应用程序中执行测试。如果启动程序还可以在运行测试之前将测试包自动重新部署到正在运行的应用程序,那就太好了。理想情况下,过程如下:

  1. 如果尚未启动应用程序测试实例,则启动它。
  2. 如果测试包已更改/重新编译,请将更新的测试包重新安装到正在运行的应用程序中。
  3. 在应用程序中运行测试。
  4. 收集测试结果并在JUnit窗口中报告它们(根据JUnit Test和JUnit Plug-in Test启动器)。

理想地,至少由测试启动框架自动执行至少2-4步。如果它还能自动为您完成第1步,那将是锦上添花。

我还没有找到可以满足所有这些条件的选项。我考虑过:

  • 在正在运行的应用程序中手动部署和执行测试插件。这消除了等待应用程序启动的开销,但这是一个高度手动的过程,并且您还将丢失标准JUnit启动器具有的测试结果的IDE报告。
  • JUnit插件测试启动器-可以很好地在IDE中报告结果。但是,似乎无法对其进行配置以连接到正在运行的应用程序实例-它希望每次运行时都启动一个新的应用程序。我将非常高兴地发现我对此事有错,并且JUnit插件测试启动器实际上可以完成我要问的事情。
  • 有一些使用远程类加载的JUnit远程运行器(例如https://github.com/ruediste/remote-junithttps://github.com/datastax/remote-junit-runnerhttps://github.com/Tradeshift/junit-remote)的化身。这些看起来是一个很有前途的选项,但是我不确定远程类加载和OSGi环境将如何协同工作。
  • 我可以修改/扩展JUnit插件测试启动器,以增加连接到现有应用程序服务器的功能。
  • Apache Sling似乎具有此功能(https://sling.apache.org/documentation/bundles/org-apache-sling-junit-bundles.html),但是其实现似乎与整个Sling体系结构紧密相关。当我正在使用一个已经具有自己的容器/ webservice体系结构的现有应用程序时,我不确定是否可以对其进行修改以使用Sling,并且不确定Sling是否可以与其他Web / servlet框架很好地配合。 / li>
  • 通过插拔/模拟/伪造来避免使用功能完善的应用程序是我广泛研究的一个选项,它本来是我的首选。但是,所讨论的应用程序大量使用了自定义RDBMS持久性体系结构,并与偶尔的原始SQL调用混合在一起。 Mocks可能不够准确,无法产生有用的测试,尽管我可以想象得出的假冒足够准确,但它与应用程序的持久性引擎本身一样复杂(根据定义,准确性也较差),因此看起来使其更简单地使用内置的持久性体系结构。

因此,我有一些我已经排除的选项,其余的我可能有足够的时间和精力来进行。但是,在投入这一时间和精力之前,我想在这里提出一个问题,希望我可以避免任何死胡同或重新发明轮子。

感谢任何帮助/建议/信息。

2 个答案:

答案 0 :(得分:0)

我的公司在我们的一个应用程序中使用Eclipse中的JUnit插件测试,并且我们面临着相同的问题,即启动和停止Eclipse应用程序需要很长时间。我不知道有什么可以满足您的需求-我们只是受了这些限制。

对于第二个在Eclipse中也可以运行的项目,我们决定避免JUnit插件测试,而在需要时引入某些Eclipse库的同时更加依赖于模拟。在这种情况下,我们不是在OSGI上下文中运行,而是作为一个更独立的单元测试,依靠模拟。

答案 1 :(得分:0)

作为一点更新:

这篇文章背后的想法是促使我研究Bnd / Bndtools组合(https://bnd.bndtools.org/)的催化剂。它尚不支持现成的功能,但是其Github存储库中存在一些未解决的问题,并且存在一个具有可用原型的分支。看来此功能可能会使其融入到下一版本(4.3)中,有望很快发布。