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));
}
}