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



我祈祷你身体健康。

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

目前,我正在使用JUnit和EclipsePDE内置的JUnit插件测试启动器。它运行得相当好——它用所有指定的捆绑包(包括测试捆绑包)启动了完整的OSGi应用程序,并在OSGi框架内运行JUnit测试。IDE中会像标准的JUnit测试启动器一样报告结果,这很好,因为您不仅可以在不必搜索日志的情况下查看失败消息,还可以双击任何测试失败,它会直接带您进入包含失败断言的代码行。有助于非常高效的测试驱动开发。

这种方法有一点是次优的,那就是在启动和停止应用程序时会有相当大的开销——几秒钟。如果您只使用一种特定的测试方法,而测试本身运行所需的时间不到一秒钟,那么这将特别痛苦。

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

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

理想情况下,测试启动框架至少会自动执行步骤2-4。如果它也能自动为你处理步骤1,那将是锦上添花。

我还没有找到任何能满足所有这些标准的选择。我考虑过:

  • 手动部署&在运行的应用程序中执行测试插件。这消除了等待应用程序启动的开销,但这是一个高度手动的过程,您也会丢失标准JUnit启动器所具有的测试结果的IDE报告
  • JUnit插件测试启动器-这可以很好地在IDE中报告结果。然而,似乎不可能将其配置为连接到正在运行的应用程序实例-它希望在每次运行时启动一个新的应用程序。如果我发现我错了,我会非常高兴,JUnit插件测试启动器实际上可以按照我的要求做
  • 存在JUnit远程运行程序的一些化身(例如,https://github.com/ruediste/remote-junit,https://github.com/datastax/remote-junit-runner,https://github.com/Tradeshift/junit-remote)使用远程类加载的。这些看起来是一个很有前途的选择,但我不确定远程类加载和OSGi环境在一起会有多好
  • 我可能会修改/扩展JUnit插件测试启动器,以添加连接到现有应用程序服务器的功能
  • Apache Sling似乎具有此功能(https://sling.apache.org/documentation/bundles/org-apache-sling-junit-bundles.html)然而,它的实现似乎与整个Sling体系结构紧密相连。由于我使用的是一个预先存在的应用程序,该应用程序已经有了自己的容器/web服务架构,我不确定我是否可以将其修改为使用Sling,也不确定Sling是否能很好地与其他web/servlet框架配合使用
  • 为了避免对全面应用程序的需要,我进行了广泛的研究,这也是我的首选。然而,有问题的应用程序大量使用了自定义RDBMS持久性体系结构,偶尔还会调用原始SQL。Mock的准确性不足以产生有用的测试,尽管我可以想象出一个足够准确的赝品,但它会像应用程序的持久性引擎本身一样复杂(从定义上讲不那么准确),所以简单地使用内置的持久性架构似乎更有意义

所以我已经排除了几个选择,剩下的几个我可能会花足够的时间和精力去工作。然而,在投入这段时间和精力之前,我想在这里提出这个问题,希望我能避免任何死胡同或重新发明轮子。

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

我的公司在Eclipse中为我们的一个应用程序使用JUnit插件测试,我们面临着同样的问题,即启动和停止Eclipse应用程序需要很长时间。我不知道有什么能满足你的需求——我们只是生活在局限之中。

对于同样在Eclipse中工作的第二个项目,我们决定避免JUnit插件测试,并在根据需要引入一些Eclipse库时更加依赖于mocking。在这种情况下,我们不在OSGI的上下文中运行,而是作为一个更孤立的单元测试运行,依赖于mocking。

作为一个更新:

这篇文章背后的想法是我看待Bnd/Bndtools组合的催化剂(https://bnd.bndtools.org/)。它还没有开箱即用地支持它,但它的Github存储库中有几个悬而未决的问题,并且有一个带工作原型的分叉。看起来这个功能可能会进入下一个版本(4.3),希望很快就会发布。

更新1:该功能没有出现在Bndtools的4.3版本中,但它现在作为捆绑包biz.aQute.tester.unit-platform成为4.4开发快照的一部分。文档可在此处获取:https://bnd.bndtools.org/chapters/310-testing.html

更新2:Bndtools的4.4开发快照变为5.0,并于2020年1月发布。

相关内容

最新更新