最近对测试(集成测试+单元测试)代码进行了一下重构, 导致很多以前运行通过的测试现在都无法通过了, 由于我们的test case在测试前需要加载一堆spring配置文件, 而这个加载过程耗尽了99%的测试时间, 无尽的等待实在让人心烦. 虽然使用TestSuite可以对这些spring配置文件只需要加载一次, 但是如果需要对一个个的testcase进行单个调试修改的话, 就比较耗时了.
当然我们的测试也需要调整, 现在的spring配置文件耦合还是比较紧, 导致某一个测试需要依赖一些无关的bean, 虽然我们采用了spring bean的延迟加载策略, 但是依然是杯水车薪, 效果不是很明显.
好吧, 转入正题, 这里我们需要利用OSGi的动态加载和热替换特性, 将test case与spring container采用bundle的组织形式进行分离. 然后测试和spring container在OSGi容器中运行. 这样当我们需要对单个test case运行的时候就不再需要加载spring container了, 直接使用bundle中的spring container了.除非对spring container中的bean进行了修改需要重启加载spring container之外, 其他时候则不需要重启之. 对test case也采用同样的处理方式, 这样可以采用边改边测. 大幅度的提高了修改test case的效率.
下面说说大致做法
首先将spring 配置相关的东东使用一个bundle封装起来, 并对外提供一个类似这样的暴露接口:
public interface SpringContext {
public ApplicationContext getApplicationContext();
}
并实现一个对外提供服务的Activator:
public class SpringContextActivator implements BundleActivator {
private ServiceRegistration sf;
public void start(final BundleContext context) throws Exception {
sf = context.registerService(SpringContext.class.getName(), new SpringContextImpl(), null);
}
public void stop(BundleContext context) throws Exception {
sf.unregister();
}
}
然后将test case用另外一个bundle进行封装, 也就是将原有的工程转换成plug-in工程. 这里我们采用的测试框架是Unitils 3.1, 需要对SpringModule进行重载, 改写其中创建ApplicationContext的过程:
public class OsgiSpringModule extends SpringModule {
@Override
public boolean isApplicationContextConfiguredFor(Object testObject) {
return true;
}
@Override
public void invalidateApplicationContext(Class<?>... classes) {
}
@Override
public void init(Properties configuration) {
}
@Override
public ApplicationContext getApplicationContext(Object testObject) {
return SpringContextHolder.get();
}
}
然后提供一个执行指定测试类的Activator:
public class TestActivator implements BundleActivator {
private static final Log logger = LogFactory.getLog(TestActivator.class);
private ServiceReference sr;
public void start(BundleContext context) throws Exception {
sr = context.getServiceReference(SpringContext.class.getName());
SpringContext ctx = (SpringContext) context.getService(sr);
SprongContextHolder.set(ctx.getApplicationContext());
//执行指定测试类或方法...
}
public void stop(BundleContext context) throws Exception {
SpringContextHolder.remove();
}
}
怎么通过代码方式来执行指定的类和方法,
这里我有写, 可以参考下.
同时使用了一个SpringContextHolder, 用来在Activator和SpringModule之间传递ApplicationContext:
public class SpringContextHolder {
public static ThreadLocal<ApplicationContext> inner = new ThreadLocal<ApplicationContext>();
public static ApplicationContext get() {
return inner.get();
}
public static void set(ApplicationContext value) {
inner.set(value);
}
public static void remove() {
inner.remove();
}
}
另外使用到了DataSet, 而里面的测试数据的路径也需要改写, 以前采用是与测试文件同路径, 当采用OSGi之后, 路径全变了, 采用的是bundleresources协议的URL, 而原有test采用的是file协议的URL, 因此需要在二者之间进行一个转换.具体做法我已经在
OSGi小结里面进行了说明.
这些就是大致的做法, 里面还有一些细节需要注意, 否则很难跑起来:(
分享到:
相关推荐
8. **测试策略**:在 "osgi_component_test" 中,可能包含了单元测试、集成测试,用于验证 OSGi 组件的功能、交互和依赖关系,确保 RCP 应用程序的正确性和稳定性。 9. **配置文件**:OSGi 组件的配置通常存储在 ...
这些工具可以将OSGi环境集成到Tomcat中,允许OSGi bundles作为Web应用的一部分运行。 Apache Felix WebConsole是一个基于Web的管理界面,可以用来管理和控制OSGi环境。你可以将其作为一个OSGi bundle部署到Tomcat中...
集成Servlet在OSGi中的步骤如下: 1. **创建Servlet Bundle**:首先,我们需要创建一个OSGi Bundle,包含Servlet类。这可以通过使用Maven的BND插件或者使用Apache Felix的Maven Bundle Plugin实现。在bundle的...
描述中的"源码,文档,配置文件,给初学osgi的朋友"进一步确认了资源的内容,包括源代码、相关文档、配置文件,这些都是学习者理解并实践Tomcat与OSGi集成的重要材料。特别是对于初学者,这些资源能够提供详尽的步骤和...
在OSGI(Open Service Gateway Initiative)应用环境中,整合Spring、Mybatis和Spring MVC可以...在实际项目中,这样的集成可以显著提高开发效率,因为每个模块都可以独立开发、测试和部署,而无需重启整个应用服务器。
- 测试策略:提供针对OSGi应用的测试方法,包括单元测试、集成测试和系统测试。 通过这些资料的学习,读者可以全面了解OSGi技术,掌握如何构建模块化、动态化的Java应用程序,并将其应用于各种实际项目中。
《企业OSGi实战》一书是OSGi企业应用的权威指南,它不仅涵盖了OSGi在企业环境中的应用,还提供了Java企业版(Java EE)与OSGi特性的融合方法。本书详细介绍了模块化编程的重要性,以及OSGi如何强化Java的模块化能力...
在Web容器中部署OSGi,特别是像Tomcat这样的应用服务器,可以实现更灵活的应用部署和管理。 首先,我们需要理解如何在Tomcat中集成OSGi。Tomcat本身并不直接支持OSGi,但可以通过一些开源项目如Pax Web或Apache ...
3. **调试与测试**:在OSGi环境中进行调试和测试可能比传统的Java应用更为复杂。 4. **兼容性**:不是所有的Java库都与OSGi兼容,可能需要额外的工作进行封装。 通过阅读《OSGi原理与最佳实践》和《OSGI实战》这两...
7. **测试与调试**:了解如何对OSGI环境中的Web服务进行单元测试和集成测试,以及如何使用OSGI的调试工具进行问题定位。 通过这个例子,新手不仅可以掌握OSGI的基本概念和操作,还能了解到如何将OSGI模块与Web服务...
2. **集成测试**:模拟OSGi环境,测试bundle间的交互和服务通信。 3. **系统测试**:在实际OSGi容器中运行所有bundle,验证整个系统的功能和稳定性。 五、OSGi实践 1. **插件系统**:利用OSGi创建可扩展的应用程序...
在本例中,`osgi.impl`可能依赖于`osgi` Bundle提供的服务,而`OSGITest1`可能用于测试或消费这些服务。在运行时,OSGi框架会自动处理这些依赖关系,确保正确加载和启动Bundle。 6. **运行与调试** 一旦配置完成,...
8. **测试应用程序**:介绍如何在OSGi环境下进行单元测试、集成测试等。 9. **调试应用程序**:讲解在OSGi环境中调试应用程序的最佳实践。 10. **组件模型**:介绍OSGi中的组件模型,以及如何使用组件模型来简化开发...
9. **例子**:压缩包中提到的“osgi编程的例子”,可能包含一个或多个示例项目,演示了如何从零开始创建和运行OSGI应用,以及如何在Eclipse中调试和测试OSGI Bundle。 10. **最佳实践**:如何编写符合OSGI规范的...
7. **最佳实践**:提供在实际项目中应用OSGi的建议,如如何设计模块化的系统架构,如何进行测试和调试,以及性能优化策略。 《OSGi in Action》可能涵盖: 1. **实战指南**:通过实际案例,展示如何将OSGi应用于...
**OSGi**(Open Service Gateway Initiative)提供了一个动态的应用程序执行环境,在这种环境中,组件(bundle)可以在运行过程中被安装、更新或删除。同时,它还支持模块化和版本化。 **Spring OSGi**的目标在于简化...
3. **使用Spring DM(Declarative Services)或Blueprint API**: Spring DM是Spring与OSGi集成的早期解决方案,现在已经由Blueprint API取代。这些API允许我们声明OSGi服务,并将它们注册为Spring beans,反之亦然。...
标题中的“tomcat-osgi”指的是将开源的Java应用服务器Apache Tomcat与OSGi(Open Service Gateway Initiative)框架集成的版本。OSGi是一种模块化系统,主要用于Java应用程序,它允许开发者将应用程序分解为一系列...
书中可能涵盖了如bundle的设计原则,如何优化服务注册,如何处理依赖注入,以及如何调试和测试OSGI应用等内容。这些实践指导有助于开发者避免常见陷阱,提升开发效率,构建更加稳定、可维护的系统。 通过学习这些...
在本书中,作者介绍了OSGi的基本概念和高级语义,并且通过实例演示了如何使用Maven、Bndtools等工具来构建OSGi应用。Bndtools是一个强大的构建工具,它带有BND插件,可以帮助开发者打包、测试和调试OSGi Bundles。...