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));
}
}
分享到:
相关推荐
《通用软件架构设计文档》这份压缩包包含了软件开发过程中至关重要的一个环节——软件架构设计。软件架构设计是软件开发的基石,它定义了系统的整体结构、组件及其相互关系,为软件项目的成功实施提供了蓝图。这份...
这个"ASP.NET通用作业批改系统设计(源代码+论文)"的压缩包内容可能包含了一个完整的项目,包括源代码和相关的技术文档,旨在实现一个在线作业批改平台。以下是基于这个主题的详细知识点: 1. **ASP.NET架构**:ASP...
1. "test":通常这是一个测试目录,包含了单元测试或集成测试的代码,用于验证Struts2动作类、服务层和DAO层的功能是否正确。JUnit或者TestNG可能是用来编写这些测试的工具,通过测试可以了解代码的预期行为,并确保...
配置Hibernate的SessionFactory,建立实体类与数据库表的映射,编写DAO(数据访问对象)接口和实现类,实现CRUD(创建、读取、更新、删除)操作。 2.3 添加Spring应用 Spring作为依赖注入框架,整合其他组件,管理...
- 定义了一个框架,该框架规定了完成高质量软件所需的任务序列和步骤。 ### 5. 生命周期/过程模型 - **瀑布模型**:线性顺序的过程模型,每个阶段必须在下一个阶段开始之前完成。 - **快速原型模型**:通过快速...
对于描述中的“调试dubbo协议脚本”,Dubbo是阿里巴巴开源的一个高性能、轻量级的Java RPC框架。在JMeter中,你可以创建自定义的脚本来模拟Dubbo服务的调用,测试服务提供者的响应时间和吞吐量。这通常涉及到设置...
百度智能小程序平台是一套基于百度App的开放平台,旨在提供一个全新的智能小程序开发和运行环境。智能小程序是轻量级的应用程序,它们运行在主要的移动操作系统之上,通过百度智能小程序平台提供的框架和API进行开发...
【电影时光实战实例.zip】是一个针对微信小程序的实践项目,...记得在学习过程中,不仅要关注代码实现,还要思考如何优化代码结构、提高用户体验,以及如何应对可能出现的问题,这将有助于你成为一个更优秀的开发者。
12. **不采用MVC架构**:MVC(模型-视图-控制器)模式有助于分离业务逻辑和显示逻辑。 13. **不了解基本设计原则**:如KISS(保持简单和愚蠢)、DRY(不要重复自己)、MVC、OOP、REST等。 14. **在函数或类中直接...
SID(Shared Information/Data Model)作为知识库的代表,组织集合了商业体系和系统实体的定义及UML模型,并提供通用的信息/数据语言,明确实体间的相互关系,从而确保商业需求驱动系统设计和实现。 ETOM模型的作用...
第一部分 重新思考Web应用 第1章 一种新的Web设计方法 1.1 为什么需要Ajax富客户端? 1.1.1 比较用户体验 1.1.2 网络延迟 1.1.3 异步交互 1.1.4 独占或瞬态的使用模式 1.1.5 忘掉Web 1.2 Aiax的四个基本原则 1.2.1 ...
19.1 一个较为激进的示例:Ruby on Rails框架中的ActiveRecord库 396 19.2 使用动态特征实现Scala 中的动态调用 397 19.3 关于DSL的一些思考 402 19.4 本章回顾与下一章提要 402 第20章 Scala的领域...
**AngularCRUD** 是一个基于 **Angular** 框架构建的示例项目,它展示了如何在实际开发中实现创建、读取、更新和删除(CRUD)操作。这个项目特别强调了“代码优先”的测试驱动开发(TDD)方法,意味着在编写业务逻辑...
15. 不了解或使用单元测试:单元测试可以验证单个代码单元的正确性。 16. 返回HTML而非数据:返回数据使得前端处理更加灵活。 17. 硬编码消息和配置参数:使用配置文件存储这些信息,便于管理和替换。 18. 不优化...