`
rocket
  • 浏览: 90692 次
  • 性别: Icon_minigender_1
  • 来自: 金城
社区版块
存档分类
最新评论

4层结构的单元测试构架

阅读更多

通常我们的bs模式应同都是5层构架体系的:DAO  BL  Action Taglib JSP
在这5层之中,只有jsp是非java代码的,所以也是比较难以进行单元测试的一层
而且jsp作为表现层来说呢,通常变化也比较大。所以对jsp编写代码测试的代价要远大于人工直接对页面样式进行测试。

这篇文章主要将针对除去jsp以外的另外4层相关单元测试的基本框架进行了一些讨论:
首先我们要在单元测试前问自己一个问题:单元测试的目的究竟是为了什么?
为了让我们的项目更加时髦?为了让我写的代码没有bug?
我个人觉得单元测试的目的就是为了能够用轻易的重复对代码的测试!

下面我将对每一层的目的是什么,单元测试的目的是什么,还有改层单元测试的相关问题进行讲述

1、DAO层
DAO的目的:根据指定的参数对相关的数据对象进行处理
                         基本操作有查询操作  对数据源无影响 有返回值 
                                             增改操作 影响数据源 无返回值
                                             删除操作 影响数据源 无返回值

从上面我们可以看出,DAO的test主要是针对DAO的3种操作进行测试
对于查询操作我们可以从返回的结果集来进行判断
而对于增改操作和删除操作我们就是只能在方法调用后对数据源进行判断了

这里,现在一般DAO层我们都会使用Spring+hibernate来进行构建,那么一个DAO的实例就需要引入到spring和DAO的相关配置了。而且由于牵扯到外部环境,所以这里外部环境的处理可以采用两种方式,一种是直接使用数据库,这里就需要有一个真实的数据源存在了 二是模拟一个数据源,比如使用内存数据库或者文本数据库来建立一个模拟环境,方便单机进行测试

而且由于DAO是由Spring来进行管理的,所以在测试的时候需要加载Spring的上下文来获取dao的bean,关于spring的加载我使用的是spring-mock,它的好处是在事物处理后可以对相关的数据库操作进行rollback

2、BL层
BL层的目的:根据业务逻辑对业务处理进行封装
以往其实我们有时候习惯把一些业务逻辑代码放置到上层DAO或者下层Action,taglib中
所以我总结了一下,基本的业务逻辑有:
参数的验证和判断
业务逻辑错误处理
业务规则判断

所以针对于这些功能我们可以把原本属于BL的代码归还给BL了,然后针对于bl的几个功能就可以清晰地编写单元测试了,这时候一般会用到做单元测试时比较有用的一个副产品:重构。而这个副产品的价值将会在你重构后体现出来,DAO,BL,ACTION,taglib的代码职责更加明晰了,该做什么判断的就座什么判断

BL这层一般也是用Spring来进行管理的,所以我们还是需要加载spring的上下文,当然也可以不加载Spring,然后根据接口模拟一个DAO出来,但是我一般觉得这种模拟花消比较大,这个代价是否值得一直是我所怀疑的

3、Action层
action层的目的:对于请求进行跳转控制
一个控制层方法的主要功能有:获取参数,调用BL对参数进行执行,根据执行的结果进行页面参数赋值,跳转到结果页面
当然上面除了跳转的到结果页以外其他功能都不是必须的

针对于上述功能action的单元测试基本框架是:封装请求参数,发送请求,判断所需的页面bean和跳转的结果页面是否正确
这里牵扯到对于请求环境的模拟,一般不同的前台构架会有不同的模拟方法,struts下我使用的是strutstescase,它可以较为完整的读取Struts配置文件

当然一般在action中会用到Spring的上下文获取bl,由于之前已经对bl进行了测试确认,所以我建议可以直接使用实际的bl,而不是再花费代价开发一个模拟的BL

4、taglib层
taglib层目的:根据参数在页面上按照固定的样式输出
一个标签的基本功能有:获取参数,调用BL对参数进行执行,把执行结果放到指定样式中,把得到的页面代码输出

相对来说获取参数,调用BL对参数进行执行,把得到的页面代码输出,比较固定,测试的意义不大,所以主要测试的就是把执行结果放到指定样式中这个功能。这个功能通常就是给一个结果集参数然后组合返回一个StringBuffer,所以测试起来也比较容易

但是taglib在使用的时候也需要的Spring甚至Struts的配置,这就需要在初始化的时候把相关环境也要加载进来

这里大家因该可以看出我的单元测试并不是完全独立的,而是伴随渐进的按照DAO,BL,Action,taglib这样的顺序引入环境,这样一个可以减少测试开发的代价,一个是可以增加测试的准确性

在上面的描述中我们基本上了解了4层单元测试的基本目的和结构

下一篇文章中我会针对各个层的具体测试方法是用代码进行讲解 :)

 

 

 


 

分享到:
评论
14 楼 rocket 2007-03-28  
直接页面测试叫做调试,而测试的目的是让你开发的目的明确,不然我所有代码都写道页面上也可以调试啊
13 楼 giscat 2007-03-22  
直接页面测试就可以了
      如果流程,页面显示结果都对了
        结果就正确了,其他层不需要测试
12 楼 adamzhao 2007-03-20  
xmx0632 写道
这个头像看多几次,有一种很奇怪的感觉


哈,这个头像有点像gigix...
11 楼 yiding_he 2007-03-19  
xmx0632 写道
daquan198163 写道
yiding_he 写道
单元测试干吗要分层。

因为被测组件是分层的,而且各层组件的测试策略不同

建议楼上的换个头像

这个头像看多几次,有一种很奇怪的感觉



都这么说,我还是换掉好了~~~
10 楼 xmx0632 2007-03-19  
daquan198163 写道
yiding_he 写道
单元测试干吗要分层。

因为被测组件是分层的,而且各层组件的测试策略不同

建议楼上的换个头像

这个头像看多几次,有一种很奇怪的感觉
9 楼 yiding_he 2007-03-19  
我的意思是说:在单元测试面前,有“层”的概念吗?
8 楼 daquan198163 2007-03-19  
yiding_he 写道
单元测试干吗要分层。

因为被测组件是分层的,而且各层组件的测试策略不同

建议楼上的换个头像
7 楼 yiding_he 2007-03-19  
单元测试干吗要分层。
6 楼 祁兴明 2007-03-19  
rocket 写道
引用
basicbest     2007-01-29 22:00
楼主分层的依据是什么??为什么把taglib和jsp分开?action又属于什么层?
楼主有把层的概念和所用技术绑定的嫌疑



呵呵,我主要是针对我代码的层次结构,具体来说就是包的结构我通常一个应用的包路径是
root.action
root.dao
root.manager
root.taglib
然后jsp代码又在docroot下面,所以这里的层次不是通常意义上MVC的层次。
我个人觉得单元测试的目的就是为了能够用轻易的重复对代码的测试!如何理解?
5 楼 rocket 2007-02-07  
引用
basicbest     2007-01-29 22:00
楼主分层的依据是什么??为什么把taglib和jsp分开?action又属于什么层?
楼主有把层的概念和所用技术绑定的嫌疑



呵呵,我主要是针对我代码的层次结构,具体来说就是包的结构我通常一个应用的包路径是
root.action
root.dao
root.manager
root.taglib
然后jsp代码又在docroot下面,所以这里的层次不是通常意义上MVC的层次。
4 楼 rocket 2007-02-07  


引用

eyejava     2007-01-30 09:53

引用
我个人觉得单元测试的目的就是为了能够用轻易的重复对代码的测试!

这话怎么读?


其实就是自动化测试,因为人工测试要重复代价较高
3 楼 eyejava 2007-01-30  
引用
我个人觉得单元测试的目的就是为了能够用轻易的重复对代码的测试!

这话怎么读?
2 楼 basicbest 2007-01-29  
楼主分层的依据是什么??为什么把taglib和jsp分开?action又属于什么层?
楼主有把层的概念和所用技术绑定的嫌疑
1 楼 mingisme 2007-01-18  
建议楼主把测试环境和持续集成环境讲一下

相关推荐

    ( ASP.NET+SQL2005)BBS诚信论坛欢迎下载学习 源代码+数据库文件

    4.1单元测试计划 15 第5章 测试用例及测试报告 16 5.1单元测试 16 5.2集成测试 16 5.3软件项目审核评审检验表 17 5.4测试审核检验表 17 5.5测试报告 17 第6章 BBS操作手册 19 6.1功能列表 19 6.2界面示例 20 6.3开发...

    基于Node.js—Express框架的博客LittleBlog.zip

    测试所有单元测试用例保存在tests文件夹,主要提供了对Servers(服务层)的测试。所有测试用例均以xxx.test.js格式命名。单元测试由Mocha模块提供支持,进行单元测试请在终端中执行以下命令:mocha 测试用例.test.js...

    最全最细PHP相关面试总结

    对单元测试的支持更加出色 缺点: a. 清晰的构架以代码的复杂性为代价, 对小项目优可能反而降低开发效率 b. 降低了系统的性能, 例如业务造访数据库现在必须通过中间层来完成 c. 控制层和表现层有时会过于紧密, ...

    论坛网设计文档

    5.1单元测试 24 5.2集成测试 24 5.3软件项目审核评审检验表 25 5.4测试审核检验表 25 5.5问题报告 25 5.6测试报告 25 第6章 团购评价网安装手册 28 6.1功能 29 6.2系统解决方案 29 6.3开发平台 29 6.4系统资源需求与...

    高级软件架构师复习提纲

    它有以下类型:单元测试;功能测试;签入测试;构造验证测试;回归测试 7、使用内部发布的好处:将复杂项目分解为多个可管理的任务;易于实现对计划的变更;提高了解决方案的整体质量;提供了一个相对容易实现的...

    uml建模实例讲解,项目的开发目录结构与RUP核心工件

    uml建模实例讲解 软件开发没有银弹 统一通道平台开发项目简介 项目的开发目录结构与RUP核心工件 贯穿全局的统一UML模型 用前景文档定义目标系统 ...契约式开发与单元测试 自动化构建与持续集成 迭代开发模式

    [软件工程].曾强聪.文字版

    9.4.1 面向对象单元测试 9.4.2面向对象集成测试 9.4.3面向对象确认测试 9.5软件调试 9.5.1 调试方法 9.5.2 调试策略 9.6 自动测试工具 9.7软件可靠性评估 9.7.1可靠性概念 9.7.2估算系统平均无故障时间 9.7.3估算...

    软件工程 曾强聪

    9.4.1 面向对象单元测试 9.4.2面向对象集成测试 9.4.3面向对象确认测试 9.5软件调试 9.5.1 调试方法 9.5.2 调试策略 9.6 自动测试工具 9.7软件可靠性评估 9.7.1可靠性概念 9.7.2估算系统平均无故障时间 ...

    集成与构建指南(二)

    6集成构建基本流程6.1概述在构建开始前,构架师应当确定项目初步的基本源码包组织结构,和包...6.2集成过程说明实施员在私有的开发工作站上,按照项目统一的源码结构组织其单元开发目录,完成源码和单元测试代码的编制

    软件工程知识点

    单元测试也以“详细设计说明书”为依据,用于检验每个基本模块在功能、算法与数据结构上是否符合设计要求。 4.系统集成测试 所谓系统集成也就是根据概要设计中的软件结构,把经过测试的模块,按照某种选定的集成...

    ASP.NET Night Words

    基 础 知 识. 第1章 asp.net介绍 2 1.1 xhtml语言 2 1.2 静态网页 3 1.3 动态网页 3 1.4 iis的安装和配置 3 1.5 asp.net开发的预备知识 4 ...22.6 网站项目和单元测试项目说明 447 22.7 总结... 448

    AOP快速开发框架IronFramework.zip

    Common Service LocatorAsp.net Web Form 强类型绑定模型自定义服务端分页控件层次型数据结构模型Enterprise Library 扩展Entity Framework async and T4 template 模板代码生成基于 Enterprise Library Application...

    豌豆框架0.6 - 支持分层敏捷开发的PHP框架

    集成有单元测试/对象模仿功能, 还有依赖注入构架, 更好的支持敏捷开发. 框架多处参考了JAVA中的技术, 并对这些技术更一步发挥. 框架还有很多不足之处, 还需不断完善, 欢迎多提意见, 如有什么问题, 请向我们反馈. ...

    Products:阿迪达斯产品清单

    建造科技类编程语言: 设计架构模式: 开发工具: 单元测试: 用户界面测试: 依赖管理: 第三方库: 构架:任务: 设计产品清单。 设计产品详细信息。 设计添加评论。 REST网络API调用。 实现日志记录机制。 单元...

    基于FPGA的自定义CPU架构设计

    在自定义指令集CPU的改进型架构中,使用了并行计算的结构,使得运算速度大幅提升。最后,结合实际应用案例,移植电流环计算中的FOC算法到自定义CPU中运算。并用ModelSim软件进行仿真,测试其计算时间仅需7.48 μs。

    sd-project-2018-alvarosuarez:sd-project-2018-alvarosuarez由GitHub Classroom创建

    Alvaro Suarez del Cueto-主动聊天监视和可疑聊天检测。 设计模式: 在FactoryFactory类中使用Factory->,并在MainController类中使用它。... 单元测试,输入验证: 从用户输入的所有数据都经过验证。

    NGN与软交换概述

    络传送的基础设施、网络体系架构的研究、IP网络技术的研究、网络融合技术的研究、互通和互 操作的研究、新型的控制、管理和运维机制、各网络单元的研究、新网络协议的研究、网络安全 体系和技术的研究、测试技术的...

    OpenStack实战演练及开发入门完整全套培训

    课时48、OpenStack 自动化测试 - 单元测试 课时49、OpenStack 自动化测试 - 集成测试 课时50、Nova 源码结构 课时51、Nova 调用流程源码解析 课时52、Nova 分层架构与业务模型剖析 课时53、Nova 自定义 API 扩展编码...

    OpenStack实战演练及开发入门完整全套培训__百度云视频链接

    课时48、OpenStack 自动化测试 - 单元测试 课时49、OpenStack 自动化测试 - 集成测试 课时50、Nova 源码结构 课时51、Nova 调用流程源码解析 课时52、Nova 分层架构与业务模型剖析 课时53、Nova 自定义 API 扩展编码...

Global site tag (gtag.js) - Google Analytics