一个通用的单元测试框架的思考和设计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)); } }