【发布时间】:2019-01-08 12:01:13
【问题描述】:
我祈祷你一切都好。
我正在尝试寻找一种更有效的方法来为 OSGi 应用程序运行一些测试。如果已经有人问过这个问题,我深表歉意,但经过一个小时左右的搜索,我在 SO 或网络上的任何地方都找不到这个问题。
目前,我正在使用 JUnit 和 Eclipse PDE 的内置 JUnit 插件测试启动器。它工作得相当好——它使用所有指定的包(包括测试包)启动完整的 OSGi 应用程序,并在 OSGi 框架内运行 JUnit 测试。结果在 IDE 中报告,就像使用标准 JUnit 测试启动器一样,这很好,因为您不仅可以查看失败消息而无需浏览日志,还可以双击任何测试失败,它会将您直接带到包含失败断言的代码行。实现非常高效的测试驱动开发。
这种方法次优的一件事是启动和停止应用程序的开销相当大 - 几秒钟。如果您只使用一种特定的测试方法并且测试本身需要不到一秒钟的时间来运行,那么这尤其令人痛苦。
我认为一个理想的解决方案是 Eclipse 中的 JUnit 启动器,它可以连接到已经运行的 OSGi 应用程序中并执行测试。如果启动器还可以在运行测试之前自动将测试包重新部署到正在运行的应用程序中,那就太好了。理想情况下,程序如下:
- 如果应用程序测试实例尚未启动,请启动它。
- 如果测试包已更改/重新编译,请将更新后的测试包重新安装到正在运行的应用程序中。
- 在应用程序中运行测试。
- 收集测试结果并在 JUnit 窗口中报告它们(根据 JUnit 测试和 JUnit 插件测试启动器)。
理想情况下,至少步骤 2-4 将由测试启动框架自动完成。如果它也能自动为您处理第 1 步,那将是锦上添花。
我还没有找到任何可以满足所有这些条件的选项。我考虑过:
- 在正在运行的应用程序中手动部署和执行测试插件。这消除了等待应用启动的开销,但这是一个高度手动的过程,并且您还会丢失标准 JUnit 启动器具有的测试结果的 IDE 报告。
- JUnit 插件测试启动器 - 这可以很好地在 IDE 中报告结果。但是,似乎无法将其配置为连接到正在运行的应用程序实例——它希望每次运行时都启动一个新的应用程序。我会非常高兴地发现我错了,而 JUnit 插件测试启动器实际上可以满足我的要求。
- 有一些 JUnit Remote Runners 的化身(例如,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 架构紧密耦合。由于我正在使用一个已经拥有自己的容器/webservice 架构的预先存在的应用程序,我不确定我是否可以修改它以使用 Sling,并且我不确定 Sling 是否可以很好地与其他 web/servlet 框架配合使用。
- 存根/模拟/伪造以避免需要完整的应用程序是我广泛研究的一个选项,并且会是我的首选选项。但是,有问题的应用程序广泛使用了自定义的 RDBMS 持久性架构,并混合了偶尔的原始 SQL 调用。 Mocks 不够准确,无法产生有用的测试,尽管我可以想象出一个足够准确的假货,但它会像应用程序的持久性引擎本身一样复杂(并且根据定义不太准确),所以看起来更有意义的是简单地使用内置的持久性架构。
所以我有几个选项我已经排除了,剩下的几个我可能有足够的时间和精力来工作。然而,在投入这些时间和精力之前,我想在这里提出这个问题,希望我可以避免任何死胡同或重新发明轮子。
任何帮助/建议/信息表示赞赏。
【问题讨论】: