运行 JUnit 在具有 IDE 集成的 运行 OSGi 应用程序中进行测试
Running JUnit tests inside a running OSGi application with IDE integration
祝你一切安好
我正在尝试找到一种更有效的方法来 运行 对 OSGi 应用程序进行一些测试。如果已经有人问过这个问题,我深表歉意,但经过一个小时左右的搜索,我无法在 SO 或网络上的任何地方找到这个问题。
目前,我正在使用 JUnit 和 Eclipse PDE 的内置 JUnit 插件测试启动器。它工作得相当好——它使用所有指定的包(包括测试包)和 OSGi 框架内的 运行s JUnit 测试启动完整的 OSGi 应用程序。结果在 IDE 中报告,就像标准的 JUnit 测试启动器一样,这很好,因为您不仅可以看到失败消息是什么而无需浏览日志,您还可以双击任何测试失败,它将带您直接到包含失败断言的代码行。有助于非常高效的测试驱动开发。
这种方法不是最佳的一件事是在启动和停止应用程序时有相当多的开销 - 几秒钟。如果您只使用一种特定的测试方法并且测试本身花费不到一秒的时间 运行.
,这将尤其痛苦
我认为一个理想的解决方案是 Eclipse 中的 JUnit 启动器,它可以连接到已经 运行ning 的 OSGi 应用程序并在其中执行测试。如果启动器还可以在 运行ning 测试之前自动将测试包重新部署到 运行ning 应用程序,那就太好了。理想情况下,程序如下:
- 如果尚未启动应用程序测试实例,请启动它。
- 如果测试包已 changed/recompiled,请将更新后的测试包重新安装到 运行ning 应用程序中。
- 运行 应用程序中的测试。
- 收集测试结果并在 JUnit window 中报告(根据 JUnit 测试和 JUnit 插件测试启动器)。
理想情况下,测试启动框架至少会自动执行第 2-4 步。如果它还可以自动为您处理第 1 步,那就锦上添花了。
我还没有找到任何可以满足所有这些条件的选项。我考虑过:
- 在 运行ning 应用程序中手动部署和执行测试插件。这消除了等待应用程序启动的开销,但这是一个高度手动的过程,并且您还会丢失标准 JUnit 启动器具有的 IDE 测试结果报告。
- JUnit 插件测试启动器 - 这可以很好地在 IDE 中报告结果。但是,似乎无法将其配置为连接到 运行ning 应用程序实例 - 每次您 运行 它都想启动一个新的应用程序。我会非常高兴地发现我对此是错误的,并且 JUnit 插件测试启动器实际上可以完成我所要求的。
- 有一些使用远程 class 加载的 JUnit Remote 运行 用户(例如,https://github.com/ruediste/remote-junit, https://github.com/datastax/remote-junit-runner, https://github.com/Tradeshift/junit-remote)。这些看起来是一个很有前途的选择,但我不确定远程 class 加载和 OSGi 环境一起玩的效果如何。
- 我可能 modify/extend JUnit 插件测试启动器添加连接到现有应用程序服务器的功能。
- Apache Sling 似乎具有此功能 (https://sling.apache.org/documentation/bundles/org-apache-sling-junit-bundles.html),但它的实现似乎与整个 Sling 架构紧密耦合。由于我正在使用一个已有的应用程序,该应用程序已经拥有自己的 container/webservice 架构,所以我不确定是否可以修改它以使用 Sling,而且我不确定 Sling 是否可以与其他 web/servlet 框架。
- Stubbing/mocking/faking 以避免需要完整的应用程序是我广泛研究的一个选项,并且本来是我的首选选项。但是,所讨论的应用程序广泛使用了自定义 RDBMS 持久性体系结构,偶尔会混合使用原始 SQL 调用。 Mocks 不够准确,无法生成有用的测试,虽然我可以想出一个足够准确的假货,但它会像应用程序的持久性引擎本身一样复杂(而且根据定义不太准确),所以看起来更有意义的是简单地使用内置的持久性架构。
所以我有几个我已经排除的选项,在剩下的选项中,我有几个我可能可以通过足够的时间和精力来工作。然而,在投入这段时间和精力之前,我想在这里提出这个问题,希望我能避免任何死胡同或重新发明轮子。
任何help/suggestions/info赞赏。
我的公司在我们的一个应用程序中使用 Eclipse 中的 JUnit 插件测试,我们面临同样的问题,即启动和停止 Eclipse 应用程序需要很长时间。我不知道有什么东西可以满足您的需求 - 我们只是忍受了这些限制。
对于同样在 Eclipse 中运行的第二个项目,我们决定避免 JUnit 插件测试,更多地依赖模拟,同时根据需要引入一些 Eclipse 库。在这种情况下,我们不 运行 在 OSGI 的上下文中,而是作为一个更孤立的单元测试,依赖于模拟。
一点更新:
这个 post 背后的想法是我研究 Bnd/Bndtools 组合 (https://bnd.bndtools.org/) 的催化剂。它 out-of-the-box 还不支持它,但是它的 Github 存储库中有几个未解决的问题,并且有一个带有工作原型的分支。看起来这个功能可能会进入下一个版本 (4.3),希望很快就会出现。
更新 1:此功能并未包含在 Bndtools 的 4.3 版本中,但它现在作为捆绑包成为 4.4 开发快照的一部分 biz.aQute.tester .junit-platform。此处提供文档:https://bnd.bndtools.org/chapters/310-testing.html
更新2:Bndtools 4.4开发快照升级为5.0,2020年1月发布
祝你一切安好
我正在尝试找到一种更有效的方法来 运行 对 OSGi 应用程序进行一些测试。如果已经有人问过这个问题,我深表歉意,但经过一个小时左右的搜索,我无法在 SO 或网络上的任何地方找到这个问题。
目前,我正在使用 JUnit 和 Eclipse PDE 的内置 JUnit 插件测试启动器。它工作得相当好——它使用所有指定的包(包括测试包)和 OSGi 框架内的 运行s JUnit 测试启动完整的 OSGi 应用程序。结果在 IDE 中报告,就像标准的 JUnit 测试启动器一样,这很好,因为您不仅可以看到失败消息是什么而无需浏览日志,您还可以双击任何测试失败,它将带您直接到包含失败断言的代码行。有助于非常高效的测试驱动开发。
这种方法不是最佳的一件事是在启动和停止应用程序时有相当多的开销 - 几秒钟。如果您只使用一种特定的测试方法并且测试本身花费不到一秒的时间 运行.
,这将尤其痛苦我认为一个理想的解决方案是 Eclipse 中的 JUnit 启动器,它可以连接到已经 运行ning 的 OSGi 应用程序并在其中执行测试。如果启动器还可以在 运行ning 测试之前自动将测试包重新部署到 运行ning 应用程序,那就太好了。理想情况下,程序如下:
- 如果尚未启动应用程序测试实例,请启动它。
- 如果测试包已 changed/recompiled,请将更新后的测试包重新安装到 运行ning 应用程序中。
- 运行 应用程序中的测试。
- 收集测试结果并在 JUnit window 中报告(根据 JUnit 测试和 JUnit 插件测试启动器)。
理想情况下,测试启动框架至少会自动执行第 2-4 步。如果它还可以自动为您处理第 1 步,那就锦上添花了。
我还没有找到任何可以满足所有这些条件的选项。我考虑过:
- 在 运行ning 应用程序中手动部署和执行测试插件。这消除了等待应用程序启动的开销,但这是一个高度手动的过程,并且您还会丢失标准 JUnit 启动器具有的 IDE 测试结果报告。
- JUnit 插件测试启动器 - 这可以很好地在 IDE 中报告结果。但是,似乎无法将其配置为连接到 运行ning 应用程序实例 - 每次您 运行 它都想启动一个新的应用程序。我会非常高兴地发现我对此是错误的,并且 JUnit 插件测试启动器实际上可以完成我所要求的。
- 有一些使用远程 class 加载的 JUnit Remote 运行 用户(例如,https://github.com/ruediste/remote-junit, https://github.com/datastax/remote-junit-runner, https://github.com/Tradeshift/junit-remote)。这些看起来是一个很有前途的选择,但我不确定远程 class 加载和 OSGi 环境一起玩的效果如何。
- 我可能 modify/extend JUnit 插件测试启动器添加连接到现有应用程序服务器的功能。
- Apache Sling 似乎具有此功能 (https://sling.apache.org/documentation/bundles/org-apache-sling-junit-bundles.html),但它的实现似乎与整个 Sling 架构紧密耦合。由于我正在使用一个已有的应用程序,该应用程序已经拥有自己的 container/webservice 架构,所以我不确定是否可以修改它以使用 Sling,而且我不确定 Sling 是否可以与其他 web/servlet 框架。
- Stubbing/mocking/faking 以避免需要完整的应用程序是我广泛研究的一个选项,并且本来是我的首选选项。但是,所讨论的应用程序广泛使用了自定义 RDBMS 持久性体系结构,偶尔会混合使用原始 SQL 调用。 Mocks 不够准确,无法生成有用的测试,虽然我可以想出一个足够准确的假货,但它会像应用程序的持久性引擎本身一样复杂(而且根据定义不太准确),所以看起来更有意义的是简单地使用内置的持久性架构。
所以我有几个我已经排除的选项,在剩下的选项中,我有几个我可能可以通过足够的时间和精力来工作。然而,在投入这段时间和精力之前,我想在这里提出这个问题,希望我能避免任何死胡同或重新发明轮子。
任何help/suggestions/info赞赏。
我的公司在我们的一个应用程序中使用 Eclipse 中的 JUnit 插件测试,我们面临同样的问题,即启动和停止 Eclipse 应用程序需要很长时间。我不知道有什么东西可以满足您的需求 - 我们只是忍受了这些限制。
对于同样在 Eclipse 中运行的第二个项目,我们决定避免 JUnit 插件测试,更多地依赖模拟,同时根据需要引入一些 Eclipse 库。在这种情况下,我们不 运行 在 OSGI 的上下文中,而是作为一个更孤立的单元测试,依赖于模拟。
一点更新:
这个 post 背后的想法是我研究 Bnd/Bndtools 组合 (https://bnd.bndtools.org/) 的催化剂。它 out-of-the-box 还不支持它,但是它的 Github 存储库中有几个未解决的问题,并且有一个带有工作原型的分支。看起来这个功能可能会进入下一个版本 (4.3),希望很快就会出现。
更新 1:此功能并未包含在 Bndtools 的 4.3 版本中,但它现在作为捆绑包成为 4.4 开发快照的一部分 biz.aQute.tester .junit-platform。此处提供文档:https://bnd.bndtools.org/chapters/310-testing.html
更新2:Bndtools 4.4开发快照升级为5.0,2020年1月发布