您的位置:首页 > 其它

测试配置为连接数据源单独的jar

2009-08-31 09:46 169 查看

问题描述

 

以前我们做的项目基于未来适应多项目的要求进行了产品/ 项目的分拆,项目可以重复利用产品的产出。这 样就需要对代码进行分离,分离后产品对外提供的接口暂时包括EJB 接口、SOAP 接口、JMS 接口以及直接的jar 提供。前三种方式在独立的产品环境很容 易进行功能测试,但是对于直接提供的jar 中代码如何测试呢?jar 中包括service (基于spring 和独立的)、dao (ibatis )等逻辑, 讨厌的是ibatis 中连接配置的是weblogic 的datasource ,因为采用的这种方式,单元测试和功能测试都很麻烦,单元测试需要修改连接数据库的方式;功能测试,jar 又没有暴露任何对外接口,要测试它怎么办?

 

背景

 

1 。无论是单元测试还是功能测试都是我们CI 环境的一部分,因此需要统计其覆盖率。

2 。无论什么测试,都不能影响最终产出的jar 文件(不增不减代码)。

3 。所有的service 层都分为接口和实现。

 

解决方案(临时)

 

1 。做单元测试

   将ibatis 的连接数据库的方式改为直接连,而不通过datasource ,而在测试完毕后通过ant 脚本将连接方式改为datasource 连接。

 

    优点:可以进行测试,覆盖率可以统计到,没有影响最终产出。

    缺点:SVN 中存在的ibatis 的配置文件是错误的,需要通过ant 进行修改,增加了复杂性。

 

2 。做功能测试

    如果jar 中代码对其他第三方jar 没有依赖,可以直接在weblogic 启动时中加载这个jar ,然后通过Hessian 来暴露这些service ,然后写client 进行测试。

    我们的jar 要依赖很多第三方jar ,如果通过上面的方式,会在启动时加载jar 时报错,除非在启动时也加载这些依赖jar ,但是这样又跟我们已经存在的 war 、ear 中的jar 产生冲突,因此决定将产出的独立jar 结合其依赖的jar 以及利用hessian 做成一个独立的war ,发布后,写client 进行测试。

 

    优点:可以进行测试,覆盖率可以统计到,没有影响最终产出,没有影响任何已存在的代码,包括svn 中的原代码。

    缺点:额外的增加了一个测试war 的工作量。

 

最后,我们选择了方案2 ,原因是不影响已经存在的东西,而且新的方案实施起来也很简单。

 

下面是方案2 的实施细节:

 

对于单独的不依赖spring 的service ,仅通过new XXXService 就可以执行的接口,只需要做如下配置即可,在测试war 的web.xml 中:

   

<servlet>
<servlet-name>axisService</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>com.bitfone.smartdm.facade.service.impl.CCManagementServices</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>com.bitfone.smartdm.facade.service.ICCManagementServices</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>axisService</servlet-name>
<url-pattern>/axisService</url-pattern>
</servlet-mapping>
 

 

将war 发布后,如下测试

   

public void testGetAllValidReleasedUpdatePackageById() throws Exception{
String url = "http://16.158.48.31:8001/odtest/axisService";

HessianProxyFactory factory = new HessianProxyFactory();
ICCManagementServices cc = (ICCManagementServices) factory.create(ICCManagementServices.class, url);

String ap = cc.getAllValidReleasedUpdatePackageById(10001);

assertEquals(ap, "10001");
}
 

 

对 于依赖spring 的service ,原先我们就有singleton 的ServiceFactory 进行spring 配置的加载以及bean 的获取,因 此在war 中增加一个service 接口和实现,对于原service 的方法进行代理。(增加的service 接口和实现是在测试的war 中, 而不是原有的代码中)。

增加的接口和实现如下:

public interface IOdomainService {

public String getGroupNameById(String groupId);
}
 


import com.bitfone.smartdm.facade.service.IBulkServices;
import com.bitfone.smartdm.facade.util.ServiceFactory;
import com.bitfone.smartdm.odomain.test.service.IOdomainService;

public class OdomainService implements IOdomainService {

public String getGroupNameById(String groupId){
IBulkServices bs = (IBulkServices)ServiceFactory.getInstance().getService(IBulkServices.class);

String groupName = bs.getGroupNameById(groupId);

return groupName;

}

}
 

 

 

然后进行如下web.xml 配置

   

<servlet>
<servlet-name>odomainService</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>com.bitfone.smartdm.odomain.test.service.impl.OdomainService</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>com.bitfone.smartdm.odomain.test.service.IOdomainService</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>odomainService</servlet-name>
<url-pattern>/odomainService</url-pattern>
</servlet-mapping>
 

 

最后测试代码如下

   

public void testGetGroupNameById() throws Exception{
String url = "http://16.158.48.31:8001/odtest/odomainService";

HessianProxyFactory factory = new HessianProxyFactory();
IOdomainService os = (IOdomainService) factory.create(IOdomainService.class, url);

String groupName = os.getGroupNameById("42287");

assertNotNull(groupName);

assertEquals(groupName, "go2");
}
 

 

更好的解决方案,期待您的share 。

 

参考http://hessian.caucho.com/#Documents

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: