首页 文章

通过IDE集成在正在运行的OSGi应用程序中运行JUnit测试

提问于
浏览
1

我祈祷你很好 .

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

目前,我正在使用JUnit和Eclipse PDE的内置JUnit插件测试启动器 . 它工作得相当好 - 它使用所有指定的包(包括测试包)启动完整的OSGi应用程序,并在OSGi框架内运行JUnit测试 . 结果在IDE中报告,就像使用标准的JUnit Test启动程序一样,这很好,因为您不仅可以查看失败消息而无需浏览日志,还可以双击任何测试失败,它将会带你直接到包含失败的断言的代码行 . 实现非常有效的测试驱动开发 .

这种方法的一个优点是次优的是启动和停止应用程序时会有相当多的开销 - 几秒钟 . 如果您只处理一种特定的测试方法并且测试本身只需不到一秒的时间就可以运行,那么这一点尤为痛苦 .

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

  • 启动应用程序测试实例(如果尚未启动) .

  • 如果已更改/重新编译测试包,请将更新的测试包重新安装到正在运行的应用程序中 .

  • 在应用程序中运行测试 .

  • 收集测试结果并在JUnit窗口中报告它们(根据JUnit Test和JUnit Plug-in Test启动程序) .

理想情况下,至少步骤2-4将至少由测试启动框架自动化 . 如果它还可以自动为您处理第1步,那将是锦上添花 .

我没有设法找到任何能够满足所有这些标准的选项 . 我考虑过:

  • 在正在运行的应用程序中手动部署和执行测试插件 . 这消除了等待应用程序启动的开销,但这是一个高度手动的过程,您也丢失了标准JUnit启动程序所具有的测试结果的IDE报告 .

  • JUnit插件测试启动程序 - 这可以很好地在IDE中报告结果 . 但是,似乎无法将其配置为连接到正在运行的应用程序实例 - 它希望每次运行时都启动一个新的应用程序 . 我非常高兴地发现我错了,JUnit Plug-in Test启动器实际上可以做我要求的 .

  • JUnit远程运行程序(例如,https://github.com/ruediste/remote-junithttps://github.com/datastax/remote-junit-runnerhttps://github.com/Tradeshift/junit-remote)有一些使用远程类加载的化身 . 这些看起来像是一个很有前途的选择,但我不确定远程类加载和OSGi环境将如何完美地结合在一起 .

  • 我可以修改/扩展JUnit Plug-in Test启动程序,以添加连接到现有应用程序服务器的功能 .

  • Apache Sling似乎具有此功能(https://sling.apache.org/documentation/bundles/org-apache-sling-junit-bundles.html),但其实现似乎与整个Sling架构紧密耦合 . 当我正在使用已经拥有自己的容器/ web服务架构的预先存在的应用程序时,我不确定Sling是否与其他web / servlet框架很好地配合 .

  • 存根/ Mock /伪造以避免需要完整的应用程序是我广泛研究的一个选项,并且本来是我的首选选项 . 但是,有问题的应用程序广泛使用了与偶尔的原始SQL调用混合的自定义RDBMS持久性体系结构 . Mocks不够精确,不足以产生有用的测试,虽然我可以想象得到一个足够准确的假,但它应该像应用程序的持久性引擎本身一样复杂(并且定义不太准确),所以看起来似乎更简单地使用内置的持久性架构更有意义 .

所以我有几个选项,我已经排除了,其余的我有一些我可以得到足够的时间和精力工作 . 然而,在承诺这个时间和努力之前,我想在这里提出问题,希望我可以避免任何死胡同或重新发明轮子 .

任何帮助/建议/信息赞赏 .

1 回答

  • 0

    我的公司在Eclipse中使用JUnit Plug-In测试用于我们的一个应用程序,我们面临同样的问题,即启动和停止Eclipse应用程序需要很长时间 . 我不知道有什么能满足你的需求 - 我们只是和你一起生活限制 .

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

相关问题