第 4 章 ClearWork单元测试

4.1. Unit Test——介绍一下单元测试

4.1.1. 什么是单元测试

单元测试是最小粒度的测试,以测试某个功能或代码块。 一般由程序开发者来做,因为做单元测试需要知道程序设计和编码的细节。 单元测试的对象是软件设计的最小单位——模块。 单元测试的依据是详细设描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。 单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。

单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。 在一种传统的结构化编程语言中,比如C,要进行测试的单元/模块一般是函数或子过程。 在象 Java 这样的面向对象的语言中,要进行测试的基本单元/模块是类。 单元测试的原则同样被扩展到第四代语言(4GL)的开发中,在这里基本单元被典型地划分为一个菜单或显示界面。

单元测试不仅仅是作为无错编码一种辅助手段在一次性的开发过程中使用, 同时,单元测试必须是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。 因此,所有的测试都必须在整个软件系统的生命周期中进行维护。

经常与单元测试联系起来的另外一些开发活动包括:代码走读(Code review),静态分析(Static analysis)和动态分析(Dynamic analysis)。 静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。 动态分析就是通过观察软件运行时的动作,来提供执行跟踪,时间分析,以及测试覆盖度方面的信息。

4.1.2. 单元测试的任务

  1. 模块接口测试

  2. 模块局部数据结构测试

  3. 模块边界条件测试

  4. 模块中所有独立执行通路测试

  5. 模块的各条错误处理通路测试

4.1.3. 单元测试的工具

CppUnit,这是C++单元测试工具的鼻祖,免费的开源单元测试框架。 想了解CppUnit的朋友,建议读一下Cpluser所作的《CppUnit测试框架入门》。

C++Test,这是Parasoft公司的产品。C++Test是一个功能强大的自动化C/C++单元级测试工具, 可以自动测试任何C/C++函数、类,自动生成测试用例、测试驱动函数或桩函数, 在自动化的环境下极其容易快速的将单元级的测试覆盖率达到100%。

对于Java语言的单元测试,JUnit无疑是首选产品。它是由Erich Gamma和Kent Beck编写的一个回归测试框架(Regression Testing Framework)。 JUnit是一套框架(Framework)。对于JUnit的应用,简单来说,继承其TestCase类,就可以进行自动测试了。

4.2. ClearWork单元测试框架

利用JUnit可以很方便的对业务逻辑层进行单元测试,对于ClearWork来说,最简单的只需要继承 junit.framework.TestCase 类就可以了,因为ClearWork的Spring Bean加载工具可以直接从classpath中的配置文件加载Bean。

但是,针对控制层(Controller,例如:Struts Action, Servlet)、 数据操作对象(DAO, Data Access Object)、 数据库单元(Database Unit)的测试, 单纯的JUnit就显得不足了,因此,ClearWork针对这三种场景提供了自己的单元测试支持—— 抽象出相应的基类供测试单元继承,就像使用JUnit时继承 TestCase 一样。它们分别是:

  • net.sf.clearwork.core.testcase.AbstractActionTestCase ——作为对 strutstest 开源项目的扩展;测试Servlet/Struts Action的单元测试基类;自动加载了web / spring / struts的配置。Example:

    							
    	setRequestPathInfo("/login.do");
    	addRequestParameter("username","admin");
    	addRequestParameter("password","clearwork");
    	actionPerform();
    	verifyForward("success");
    	assertEquals("clearwork",(String) getSession().getAttribute("admin"));
    	verifyNoActionErrors();
    							
    						

  • net.sf.clearwork.core.testcase.AbstractDaoTestCase ——继承自Spring Framework的 AbstractTransactionalDataSourceSpringContextTests 。作为ClearWork/Spring数据操作对象(DAO)单元测试的基类, 它可以自动加载ClearWork的数据源配置(Spring Bean Name = “dataSource” )。

  • net.sf.clearwork.core.testcase.AbstractDBUnitTestCase ——对 dbunit 开源项目的扩展;作为基于ClearWork数据源单元测试的基类, 它可以自动加载ClearWork的数据源配置(Spring Bean Name = “dataSource” )。