`
jgsj
  • 浏览: 1001495 次
文章分类
社区版块
存档分类
最新评论

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



分享到:
评论

相关推荐

    通用软件架构设计文档.rar

    《通用软件架构设计文档》这份压缩包包含了软件开发过程中至关重要的一个环节——软件架构设计。软件架构设计是软件开发的基石,它定义了系统的整体结构、组件及其相互关系,为软件项目的成功实施提供了蓝图。这份...

    ASP.NET通用作业批改系统设计(源代码+论文).zip

    这个"ASP.NET通用作业批改系统设计(源代码+论文)"的压缩包内容可能包含了一个完整的项目,包括源代码和相关的技术文档,旨在实现一个在线作业批改平台。以下是基于这个主题的详细知识点: 1. **ASP.NET架构**:ASP...

    练习项目源码

    1. "test":通常这是一个测试目录,包含了单元测试或集成测试的代码,用于验证Struts2动作类、服务层和DAO层的功能是否正确。JUnit或者TestNG可能是用来编写这些测试的工具,通过测试可以了解代码的预期行为,并确保...

    基于struts2、spring、hibernate构建一个网上投票系统-毕业论文.doc

    配置Hibernate的SessionFactory,建立实体类与数据库表的映射,编写DAO(数据访问对象)接口和实现类,实现CRUD(创建、读取、更新、删除)操作。 2.3 添加Spring应用 Spring作为依赖注入框架,整合其他组件,管理...

    1软件工程名词解释.docx

    - 定义了一个框架,该框架规定了完成高质量软件所需的任务序列和步骤。 ### 5. 生命周期/过程模型 - **瀑布模型**:线性顺序的过程模型,每个阶段必须在下一个阶段开始之前完成。 - **快速原型模型**:通过快速...

    apache-jmeter-5.1.1.zip

    对于描述中的“调试dubbo协议脚本”,Dubbo是阿里巴巴开源的一个高性能、轻量级的Java RPC框架。在JMeter中,你可以创建自定义的脚本来模拟Dubbo服务的调用,测试服务提供者的响应时间和吞吐量。这通常涉及到设置...

    百度智能小程序平台的架构思考与实践.pdf

    百度智能小程序平台是一套基于百度App的开放平台,旨在提供一个全新的智能小程序开发和运行环境。智能小程序是轻量级的应用程序,它们运行在主要的移动操作系统之上,通过百度智能小程序平台提供的框架和API进行开发...

    电影时光实战实例.zip

    【电影时光实战实例.zip】是一个针对微信小程序的实践项目,...记得在学习过程中,不仅要关注代码实现,还要思考如何优化代码结构、提高用户体验,以及如何应对可能出现的问题,这将有助于你成为一个更优秀的开发者。

    phper陋习 PHP开发必读

    12. **不采用MVC架构**:MVC(模型-视图-控制器)模式有助于分离业务逻辑和显示逻辑。 13. **不了解基本设计原则**:如KISS(保持简单和愚蠢)、DRY(不要重复自己)、MVC、OOP、REST等。 14. **在函数或类中直接...

    一种基于ETOM模型的下一代电信运营支撑系统的架构与实现方案

    SID(Shared Information/Data Model)作为知识库的代表,组织集合了商业体系和系统实体的定义及UML模型,并提供通用的信息/数据语言,明确实体间的相互关系,从而确保商业需求驱动系统设计和实现。 ETOM模型的作用...

    【卷一/共两卷】AJAX实战pdf高清版90M

    第一部分 重新思考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 ...

    Scala程序设计(第2版)

    19.1 一个较为激进的示例:Ruby on Rails框架中的ActiveRecord库 396 19.2 使用动态特征实现Scala 中的动态调用 397 19.3 关于DSL的一些思考 402 19.4 本章回顾与下一章提要 402 第20章 Scala的领域...

    AngularCRUD:优先使用代码的Angular CRUD

    **AngularCRUD** 是一个基于 **Angular** 框架构建的示例项目,它展示了如何在实际开发中实现创建、读取、更新和删除(CRUD)操作。这个项目特别强调了“代码优先”的测试驱动开发(TDD)方法,意味着在编写业务逻辑...

    PHP程序员常见的40个陋习,你中了几个?

    15. 不了解或使用单元测试:单元测试可以验证单个代码单元的正确性。 16. 返回HTML而非数据:返回数据使得前端处理更加灵活。 17. 硬编码消息和配置参数:使用配置文件存储这些信息,便于管理和替换。 18. 不优化...

Global site tag (gtag.js) - Google Analytics