`
rocket
  • 浏览: 92286 次
  • 性别: 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  
建议楼主把测试环境和持续集成环境讲一下

相关推荐

    C#连连看三层构架

    【C#连连看三层构架】是一个基于C#编程语言开发的连连看游戏,它采用了软件设计中的三层架构模式,这种架构模式对于大型项目来说,能够提供更好的可维护性、可扩展性和模块化。下面我们将深入探讨这个项目的知识点:...

    三层构架例子

    4. 易于测试:由于各层职责分明,可以独立编写单元测试,提高软件质量。 三层架构的缺点: 1. 开发复杂性增加:更多的组件和接口意味着更高的开发和调试成本。 2. 性能可能受影响:由于数据需要经过多层传递,可能...

    影院售票管理系统,三层构架实现

    【标题】:“影院售票管理系统,三层构架实现”这一项目是针对电影院售票场景设计的一款管理软件,采用经典的三层架构模式进行开发。三层架构是一种将应用软件分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL...

    三层构架简单的源码三层构架简单的源码三层构架简单的源码

    三层架构是一种常见的软件开发模式,它将应用程序分为三个主要部分:表示层(WebUI)、业务逻辑层(BLL)和数据访问层(DAL...此外,这样的设计也有利于单元测试,因为每一层都可以独立进行测试,确保其功能的正确性。

    系统构架设计应考虑的因素

    4. **测试策略**:构建自动化测试框架,包括单元测试、集成测试和端到端测试,确保代码质量。 5. **持续集成/持续部署(CI/CD)**:实施CI/CD流程,加快开发速度,确保每次代码变更都能快速、可靠地部署。 系统...

    三层架构网站

    - **测试友好**:每层都可以单独进行单元测试。 在“上海带福特网站”这个项目中,我们可以推测这是一个关于汽车销售或者服务的网站,其三层架构可能是这样的: - 表现层:用户可以浏览车辆信息、下订单、预约试驾...

    如何构建三层构架

    - **接口设计**:每一层之间通过接口进行通信,而不是直接引用具体的实现类,这样可以降低耦合度,易于单元测试和替换组件。 - **事务管理**:在业务逻辑层处理事务,确保数据的一致性。对于复杂的事务,可能需要跨...

    新闻文章系统N层构架

    4. **模型层(Model Layer)**:模型层代表了应用程序的数据结构和状态,包括实体类和值对象。它们封装了数据和相关的行为,为业务逻辑层提供数据载体。 5. **服务层(Service Layer)**:服务层作为业务逻辑层的一...

    c# 完美构架完美网站

    "三层架构"是C#开发中的一个重要概念,它为大型、复杂的应用程序提供了良好的组织结构和可维护性。以下是对"完美构架完美网站"这一主题的详细解释。 三层架构是一种设计模式,将应用程序分为三个主要部分:表现层...

    MFC学习MFC构架

    最后,要成为一名高级工程师,不仅需要精通MFC,还需要熟悉软件工程的最佳实践,如代码复用、单元测试、版本控制等。还要关注现代编程趋势,如UI/UX设计、跨平台开发、云计算技术等,以便适应不断变化的技术环境。

    系统构架设计

    系统构架设计是软件开发过程中的关键步骤,它定义了软件系统的整体结构、组件划分以及它们之间的交互方式。本文将深入探讨系统构架设计的重要性和其中涉及的关键因素,同时也会提及开发文档在这一过程中的作用。 一...

    新能源汽车动态工况EMI测试系统构架设计与关键技术分析.pdf

    本文将分析新能源汽车动态工况EMI测试系统的架构设计与关键技术。 首先,系统需求分析是构建高效EMI测试系统的基础。针对现有测试系统速度慢、不适用于多频率测试以及系统集成化程度低的问题,设计应注重提高测试...

    一个三层架构的进销存管理系统设计方案word

    * 单元测试:对每个模块进行独立测试。 * 集成测试:对系统的每个组件进行集成测试。 * 系统测试:对整个系统进行测试。 *验收测试:对系统进行验收测试,以确保系统满足用户需求。 通过这个进销存管理系统设计方案...

    asp.net(C#)三层结构新闻发布系统源码毕业论文(优质论文)

    - 测试与优化:讨论系统测试的方法,包括单元测试、集成测试,以及性能调优策略。 - 应用与前景:分析该系统在实际应用中的优势,以及未来可能的发展方向。 此毕业论文可以作为学习ASP.NET开发和三层架构设计的参考...

    软件测试过程与规范(ALAN ZHOU Version 1.0)

    - **单元测试**:针对软件的最小可测试单元进行的测试,旨在验证单元的内部结构和功能。 - **集成测试**:确保各个单元结合在一起后能正常协作,并验证集成后的行为是否正确。 - **系统测试**:在整个系统环境中,对...

    图书馆管理系统 三层构架 .net语言书写

    2. 开发工具:Visual Studio提供强大的集成开发环境,支持调试、单元测试、代码分析等功能。 3. 安全性:内置的安全机制如身份验证、授权等,便于构建安全的系统。 4. 可移植性:随着.NET Core的推出,应用程序可以...

    电影购票系统 使用三层架构实现展示电影,

    - **测试**:系统需要进行详尽的测试,包括单元测试、集成测试和压力测试,以确保所有功能的正确性和系统的稳定性。 - **版本控制**:使用Git等版本控制系统,可以跟踪代码的变更,便于团队协作和问题排查。 - **...

Global site tag (gtag.js) - Google Analytics