一个通用的单元测试框架的思考和设计09-实现篇-视图操作

01)概述

基于DBunit做基于数据库的单元测试,数据库表的准备数据由框架负责插入和自动清理,目前数据库中很多业务操作是基于视图的(包括普通视图和物理视图),hop测试框架本身并不支持对视图的直接插入和更新操作,因此对视图做测试准备数据的时候,必须造出与视图相关联的各个表的数据,再进行测试

02)普通视图

一般性的视图,对这种视图做准备数据只有找到该视图的关联表,利用框架提供的工具类DbunitManager造出测试数据(造的数据必须和视图逻辑关联),然后运行单元测试用例,这种视图只要基础表里插入了数据,则视图中会自动实时同步过来(可以把这类视图简单理解为只读视图)。

03)物化视图

物化视图是oracle数据库特有的一种视图,首先它属于视图的范畴,因此满足视图的定义,同时,有自身的特点,就是当向物理视图关联的数据库表插数据时,物理视图里的数据同步并不一定是实时的,为了保证我们造的测试数据能够实时的在物理视图中得以体现,必须在基础表数据插入后,对物理视图做手动刷新-强制物理视图同步最新数据。

使用方法

  • 准备于物化视图相关联的几张基础数据表的数据-通过dbunit xml格式,详细参考单元测试规范章节
  • 编写测试代码-和先前的做法完全一致
  • 在该测试用例执行前执行物化视图的刷新操作

public void testGetProductbyUserId() {

       String mv = "ECC_FND.PRODUCT_LINE_MV";//要进行刷新的物化视图的名字

        refeshMaterializedView(mv );//测试用例执行前刷新一下,保证准备好的基础数据同步到视图中

        List<CmiAssistmodel> list=baseSeachConditionService.getProductbyUserId();//执行具体的测试

        assertThat(list.size(), equalTo(2));//断言

    }

03)物化视图

刷新物化视图的操作见 void refeshMaterializedView(String materializedViewName)

/**
 * HOP测试框架的基类,定义了常用到的工具类
 * @author WangXuzheng
 * @see com.haier.openplatform.test.dbunit.XmlDatasetProviderListener
 * @see com.haier.openplatform.test.dbunit.IDatabaseTesterAware
 * @see org.springframework.test.context.transaction.TransactionalTestExecutionListener
 */
@TestExecutionListeners({ XmlDatasetProviderListener.class, TransactionalTestExecutionListener.class })
public class BaseHopTestCase extends AbstractJUnit4SpringContextTests implements IDatabaseTesterAware{
	protected IDatabaseTester databaseTester;
	@Override
	public void setIDatabaseTester(IDatabaseTester databaseTester) {
		this.databaseTester = databaseTester;
	}
	/**
	 * 利用dbunit的connection执行sql语句
	 * @param sql
	 */
	protected void executeSQL(String sql){
		Connection connection = null;
		Statement statement = null;
		try {
			connection = databaseTester.getConnection().getConnection();
			statement = connection.createStatement();
			statement.execute(sql);
		}catch (Exception e) {
			ReflectionUtils.handleReflectionException(e);
		}finally{
			closeStatement(statement);
			closeConnection(connection);
		}
	}
	/**
	 * 关闭数据库连接
	 * @param connection
	 */
	protected void closeConnection(Connection connection) {
		if(connection != null){
			try {
				connection.close();
			} catch (SQLException e) {
				ReflectionUtils.handleReflectionException(e);
			}
		}
	}
	/**
	 * 关闭sql语句对象
	 * @param statement
	 */
	protected void closeStatement(Statement statement){
		if(statement != null){
			try {
				statement.close();
			} catch (SQLException e) {
				ReflectionUtils.handleReflectionException(e);
			}
		}
	}
	
	/**
	 * 生成默认的刷新物化视图的sql语句--仅限于oracle
	 * @param materializedViewName 物化视图的名字
	 * @return
	 */
	protected String generateRefeshMaterializedViewSql(String materializedViewName){
		StringBuffer stringBuffer = new StringBuffer();
		stringBuffer.append("BEGIN")
		  .append("  DBMS_SNAPSHOT.REFRESH")
		  .append("  (LIST                 => '")
		  .append(materializedViewName).append("'")
		  .append("  ,PUSH_DEFERRED_RPC    => TRUE")
		  .append("  ,REFRESH_AFTER_ERRORS => FALSE")
		  .append("  ,PURGE_OPTION         => 1")
		  .append("  ,PARALLELISM          => 0")
		  .append("  ,ATOMIC_REFRESH       => TRUE")
		  .append("  ,NESTED               => FALSE);")
		  .append("  END;");
		return stringBuffer.toString();
	}
	
	/**
	 * 刷新指定的物化视图
	 * @param materializedViewName 物化视图名字
	 */
	protected void refeshMaterializedView(String materializedViewName){
		executeSQL(generateRefeshMaterializedViewSql(materializedViewName));
	}
}



posted @ 2012-04-24 09:17  java简单例子  阅读(283)  评论(0编辑  收藏  举报