【问题标题】:Running JUnit tests inside a running OSGi application with IDE integration使用 IDE 集成在正在运行的 OSGi 应用程序中运行 JUnit 测试
【发布时间】:2019-01-08 12:01:13
【问题描述】:

我祈祷你一切都好。

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

目前,我正在使用 JUnit 和 Eclipse PDE 的内置 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 Remote Runners 的化身(例如,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 框架配合使用。
  • 存根/模拟/伪造以避免需要完整的应用程序是我广泛研究的一个选项,并且会是我的首选选项。但是,有问题的应用程序广泛使用了自定义的 RDBMS 持久性架构,并混合了偶尔的原始 SQL 调用。 Mocks 不够准确,无法产生有用的测试,尽管我可以想象出一个足够准确的假货,但它会像应用程序的持久性引擎本身一样复杂(并且根据定义不太准确),所以看起来更有意义的是简单地使用内置的持久性架构。

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

任何帮助/建议/信息表示赞赏。

【问题讨论】:

    标签: eclipse junit osgi


    【解决方案1】:

    作为一点更新:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢内森提供此信息。也许您现在也可以将 Bndtools 视为一种选择。
      猜你喜欢
      • 2022-08-03
      • 2013-12-08
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      相关资源
      最近更新 更多