【问题标题】:Quick and easy way to test OSGi bundlesOSGi 测试
【发布时间】:2010-09-09 14:06:41
【问题描述】:

目前,作为大学最后一年项目的一部分,我正在开发一个新的版本控制系统。我们的想法是使其具有高度的适应性和可插拔性。

我们使用 OSGi 框架(Equinox 实现)来管理我们的插件。我的问题是我找不到一个简单易用的方法来测试 OSGi 包。

目前,我必须使用 Maven 构建捆绑包,然后执行测试工具。我正在寻找类似 Eclipse 的 JUnit 测试运行器之类的东西,因为它可以为我节省大量时间。

有没有一种快速简便的方法来测试 OSGi 包?

编辑:我不需要测试 Eclipse 插件或 GUI 组件,只需要 OSGi 包。

EDIT2:是否有一些框架支持 JUnit4?

【问题讨论】:

    标签: java testing osgi


    【解决方案1】:

    Spring Dynamic Modules 对 testing OSGi bundles 有很好的支持。

    【讨论】:

    • 使用 SpringDM,我得到了这个:junit.framework.AssertionFailedError: Exception in constructor: testOSGiStart (java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 有什么想法吗?我已经添加了顺便说一句,公共日志记录到构建路径。
    • 另外,SpringDM 好像不支持 JUnit4,对吗?
    • NoClassDefFoundError 在 jvm 在运行时找不到 .class 文件时发生,尽管它在编译时可用。所以这不是 SpringDM 的错,你只需要重新构建你的项目。如果您通过 maven 使用 maven 构建,或者您的 eclipse 启用了自动构建设置,只需在您的 java 文件中稍作更改并保存即可。之后你就不会收到这个错误了。
    【解决方案2】:

    Eclipse 有一个启动配置类型,用于在 Eclipse(即 OSGi)应用程序的上下文中运行 JUnit 测试:

    http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.pde.doc.user/guide/tools/launchers/junit_launcher.htm

    【讨论】:

    • 这看起来更像是在测试 Eclipse 插件。我的问题不清楚吗?
    • 很久以前,但为了完整性:Eclipse 插件是 OSGi 包,因此您可以使用普通的 Eclipse SDK 测试 OSGi 包。
    【解决方案3】:

    如果您需要测试 GUI 组件,我发现 SWTBot 可以完成工作。

    【讨论】:

    • 谢谢,但我不需要测试 GUI 组件或 Eclipse 插件。
    【解决方案4】:

    在 OPS4J (ops4j.org) 上有一个专用的开源 OSGi 测试框架,名为 Pax Drone

    您可能想看看 Pax Drone ([http://wiki.ops4j.org/confluence/x/KABo]),它使您能够在测试中使用所有 Felix 版本以及 Equinox 和 Knopflerfish。

    干杯, 托尼

    【讨论】:

    • 嗯... Maven 似乎无法找到 Pax Drone,而且我找不到您的链接中提到的任何替代存储库。有什么帮助吗?
    • 感谢您的指点。我刚刚为此更新了网站。仅供参考:你可以在这里找到它:repository.ops4j.org/maven2
    • 网站似乎已关闭。有人还在用这个框架吗?
    • Pax Exam 好像是新版本,看@l10i 的回答。
    【解决方案5】:

    Treaty 是一个合同(测试)框架,它非常学术,但有一些不错的想法。有一些论文发表在它上面,人们目前正在努力改进它。

    【讨论】:

      【解决方案6】:

      最近,您应该看看 Pax Exam: http://team.ops4j.org/wiki/display/paxexam/Pax+Exam

      这是 OPS4J 当前与测试相关的工作。

      【讨论】:

      【解决方案7】:

      以下是一些尚未提及的工具:

      • 我正在使用Tycho,这是一个使用 Maven 构建 Eclipse 插件的工具。如果您在自己的插件或插件片段中创建测试,Tycho 可以在其自己的 OSGi 实例中运行每组测试,以及所有所需的依赖项。 Introfurther info。这对我来说效果很好。

      • jUnit4OSGI 看起来很简单。您创建 OSGiTestCase 的子类,并获得 getServiceReference() 等方法。

      • Pluginbuilder,一个用于 OSGi 包 / Eclipse 插件的无头构建系统,具有称为 Autotestsuitea test-running framework。它在构建步骤之后在 OSGi 环境的上下文中运行测试。但是,它似乎并没有被维护好几年。我认为许多 Eclipse 项目正在从 Pluginbuilder 迁移到 Tycho。

      • 另一种选择是启动 一个 OSGi 容器的实例您的单元测试,您可以直接运行它,如 here 所述。

      • 有人写了一个小的bundle test collector,它会搜索 JUnit (3) 测试并运行它们。

      【讨论】:

        【解决方案8】:

        对于单元测试,请使用 EasyMock 框架或创建您自己的测试所需接口的实现。

        【讨论】:

          【解决方案9】:

          ProSyst Test Execution Environment 是一个有用的 OSGi 捆绑测试工具。它还支持 JUnit 测试作为可能的测试模型之一。

          【讨论】:

            【解决方案10】:

            在过去的几年里,Tycho——一个新的基于 Maven 的 OSGi 构建系统——在 Eclipse 基金会中变得相当流行。该框架还包括使用 Maven Surefire 在单独的测试平台中测试 OSGi 包的方法...

            【讨论】:

              【解决方案11】:

              我认为我们遇到了同样的问题,我们制定了自己的解决方案。解决方案有不同的部分:

              • 一个 junit4runner,它捕获所有定义了特殊属性的 OSGi 服务。它使用 JUnit4 引擎运行这些捕获的服务。 JUnit 注释应该放在服务实现的接口中。
              • 一个 maven 插件,用于启动 OSGi 框架(可以创建自定义框架作为 maven 依赖项)并在集成测试 maven 生命周期内运行单元测试。
              • 部署者 OSGi 包。如果将其放入您的 OSGi 容器中,将打开一个简单的始终位于顶部的窗口,您可以在其中放置项目文件夹(来自总指挥官或来自 eclipse)。然后,这将重新部署该捆绑包。

              使用这些工具,您可以执行 TDD 并让书面测试也始终在 maven 集成阶段运行。建议将 eclipse 与 m2e 和 maven-bundle-plugin 一起使用,因为在这种情况下,只要在源中保存类,就会重新生成 target/classes/META-INF/MANIFEST.MF,以便您可以拖放项目到部署程序窗口。您开发的 OSGi 包不必具有任何特殊功能(例如作为 eclipse 插件或其他东西)。

              整个解决方案是开源的。你可以在http://cookbook.everit.org找到教程

              【讨论】:

                【解决方案12】:

                bnd-testing-maven-plugin 怎么样?

                它允许在 Felix 或 Equinox 等正在运行的容器中运行 JUnit。 如果您使用 BNDTools 进行 eclipse,这非常相似,但只是 maven 没有 Eclipse 并且没有 UI。

                https://github.com/bndtools/bnd/tree/master/maven/bnd-testing-maven-plugin

                还可以查看 maven 的有效osgi 原型。这将为您构建项目或添加测试提供一个良好的起点。

                https://github.com/effectiveosgi

                【讨论】:

                【解决方案13】:

                我想有很多方法可以测试 OSGi 组件。进行测试的一种方法是使用 Robot Framework。我所做的是使用 Robot Framework 进行测试,并将远程库安装在 OSGi 中,或者让它们通过套接字与 OSGi 测试组件对话,机器人将与这些模块对话并通过它们运行测试。

                所以,基本上你的 OSGi 模块应该有接口来做一些事情并产生一些输出。因此,在我的设置中,我有一个测试组件,可以对实际的 OSGi 组件进行服务调用,然后会有一个监听服务来捕获事件/服务调用(由被测模块进行),这些结果可以被机器人问。因此,基本上通过这种方式,您可以将大型系统拆分为小组件,并让系统在生产/生产环境中运行,并在组件级别自动对其进行测试,或者统一测试一些实际组件。

                【讨论】:

                  【解决方案14】:

                  与其他提到的 mockito 一起模拟插件依赖项(引用等)非常方便。见https://www.baeldung.com/mockito-annotations

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-10-23
                    • 1970-01-01
                    • 2016-07-25
                    • 1970-01-01
                    • 2012-09-04
                    • 2012-03-14
                    • 2014-04-29
                    • 2017-08-18
                    相关资源
                    最近更新 更多