随笔分类 - 单元测试
摘要:01)概述基于DBunit做基于数据库的单元测试,数据库表的准备数据由框架负责插入和自动清理,目前数据库中很多业务操作是基于视图的(包括普通视图和物理视图),hop测试框架本身并不支持对视图的直接插入和更新操作,因此对视图做测试准备数据的时候,必须造出与视图相关联的各个表的数据,再进行测试02)普通视图一般性的视图,对这种视图做准备数据只有找到该视图的关联表,利用框架提供的工具类DbunitManager造出测试数据(造的数据必须和视图逻辑关联),然后运行单元测试用例,这种视图只要基础表里插入了数据,则视图中会自动实时同步过来(可以把这类视图简单理解为只读视图)。03)物化视图物化视图是ora
阅读全文
摘要:一个通用的单元测试框架的思考和设计01-思考篇一个通用的单元测试框架的思考和设计02-设计篇一个通用的单元测试框架的思考和设计03-实现篇-核心类源码一个通用的单元测试框架的思考和设计04-实现篇-自动管理测试数据一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入一个通用的单元测试框架的思考和设计06-实现篇-自动管理测试数据-如何临时关闭数据外键约束一个通用的单元测试框架的思考和设计07-实现篇-自动管理测试数据-如何为自增长主键id赋值有时候,仅仅依靠框架提供的xml方式来插入和删除数据时不够的,有的时候需要在测试代码中执行一些sql语句,以下是介绍如何便捷的做到
阅读全文
摘要:项目中使用SQL Server2008做为数据库,表的主键大都设置为identity自增长类型,用dbunit准备数据时却遇到了问题,准备的测试数据插入不到数据中,因为id的类型为自增长,不允许为其手动赋值,如何解决?查看了dbunit的文档,对于MS SQL的自增长主键,提供了一个InsertIdentityOperation类,用这个类就可以解决手动输入主键id的问题具体实现:在setUp和teraDown操作中替换一下默认的DatabaseOperation类databaseTester.setSetUpOperation(InsertIdentityOperation.REFRESH)
阅读全文
摘要:第4节中提出了通过dbunit插件来自动管理测试数据,但是在实际操作时发现了一些问题,在设计数据库表时各个表之间可能存在外键关联,在我们准备测试数据库时经常会遇到因外测试数据外键问题导致无法插入数据或者是在清理测试数据的时候因为测试数据的顺序问题导致测试数据无法删除成功,如何解决这个问题?这里使用了一种比较傻瓜但是也比较直接的方式--临时将数据库的外键约束删除,测试完成后将数据恢复到先前状态。操作步骤1.在AbstractDatasetProviderListener类的beforeTest方法之前将外键约束去除String[] tables = dataSet.getTableNames()
阅读全文
摘要:这篇文章将继续上一篇的问题,实现我们的iunit框架与Guice框架的整合,这个模块主要用于那些用Guice来做DI容器的项目做测试用的,包括guice框架的启动与在测试类中自动注入@Inject标注的字段1.目标测试类的庐山真面目package com.crazycoder2010.guice.sample; import org.junit.Test; import com.crazycoder2010.iunit.AbstractIUnitTestCase;
import com.crazycoder2010.iunit.GuiceStratupListener;
import co..
阅读全文
摘要:上篇文章罗列了整个框架的核心接口,这篇文章将提供IunitExecutionListener的一个实现类-DatasetProviderListener,主要用来将测试数据插入到数据库中,待测试完成后自动删除数据1.dbunit为核心的db测试 dbunit是个很好的数据库测试框架,提供了多种准备数据的操作策略来简化测试数据的插入或更新操作,参考http://www.dbunit.org/components.html#deleteall操作描述DatabaseOperation.UPDATE使用准备数据更新现有db中的数据(根据准备数据主键ID值),如果数据库中不存在准备数据中的ID,报错退
阅读全文
摘要:第二节里我们介绍了iunit整体的设计思路以及核心类之间的关系,这篇将以源码+解释的方式来演示核心类的实现方式1.IUnitRunner 类这个类是测试的入口类,直接继承自junit4.8的BlockJunit4ClassRunner,在构造函数里,我们把iunit框架的扩展功能添加了进来,因为整个框架呃设计都是基于Listener的,所以只需要把监听器在框架运行的时候加载进来即可--见构造函数,listener的注册是通过注解来进行的,因为测试类本身可能会有继承关系,因此需要遍历父类中的Listener,把子类+所有父类中的Listener合并起来,当然还要注意剔除掉重复注册的Listene
阅读全文
摘要:第一节里介绍了我们框架设计的目标,这篇主要介绍的是这个框架主要的设计思路和关键技术点1.如何扩展junit的功能,使junit在启动时可以做一些我们定制化的功能? junit4建立了以Runner为核心的测试框架运行机制,在junit3的版本中,我们知道要运行一个junit测试用例,必须继承一个TestCase基类,junit4则不需要这个限制,只需要标注一下要运行测试的方法为@Test就可以了,怎么做到的呢?就是这个Runner机制,这里不介绍Junit4的运行机制,可以从org.junit.runner.BlockJUnit4ClassRunner中得到答案,像spring test框架也
阅读全文
摘要:1.先从问题说起 写过程序的同学都知道,做好单元测试提高代码覆盖率对整个项目意味着什么,但是做好单元测试并不是一件那么简单的事情,因为实际业务逻辑和运行环境的复杂性,导致了我们的单元测试代码不可能都像那些helloWord那么简单,比如现在的业务系统绝大多数都是基于数据库的,怎么做单元测试才能做到每次做单元测试时都是一个干净的测试环境-即上次单元测试的数据库操作不会影响本次测试的结果(比如一个createUser操作,第一次单元测试运行成功了,但是第二次运行却失败了,因为代码里做了重名判断),还有web层的单元测试如何进行,web框架如何启动,那些万恶的httpServletRequest,H
阅读全文