为什么需要单元测试

为什么需要单元测试

软件开发的标准过程包括以下几个阶段:『需求分析阶段』→『设计阶段』→『实现阶段』→『测试阶段』→『发布』。其中测试阶段通过人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。测试过程按4步骤进行,即单元测试、集成测试、系统测试及发版测试。其中功能测试主要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件功能是否完全、正确。系统测试主要对已经过确认的软件纳入实际运行环境中,与其他系统成份组合在一起进行测试。单元测试、集成测试由开发人员进行,是我们关注的重点,下文对两者进行详细说明。

单元测试

单元测试是开发者编写的一小段代码,用于检验目标代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试用于判断某个特定条件或特定场景下某个特定函数的行为。例如,用户可能把一个很大的值放入一个有序List中,然后确认该值出现在List 的尾部。或者,用户可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。

单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。

在一般情况下,一个功能模块往往会调用其他功能模块完成某项功能,如业务层的业务类可能会调用多个DAO完成某项业务。对某个功能模块进行单元测试时,我们希望屏蔽对外在功能模块的依赖,以便将焦点放在目标功能模块的测试上。这时模拟对象将是最有力的工具,它根据外在模块的接口模拟特定操作行为,这样单元测试就可以在假设关联模块正确工作的情况下验证本模块逻辑的正确性了。

集成测试

单元测试和开发工作是并驾齐驱的工作,甚至是前置性的工作。除了一些显而易见的功能外,大部分功能(类的方法)都必须进行单元测试,通过单元测试可以保障功能模块的正确性。而集成测试则是在功能模块开发完成后,为验证功能模块之间匹配调用的正确性而进行的测试。在单元测试时,往往需要通过模拟对象屏蔽外在模块的依赖,而集成测试恰恰是要验证模块之间集成后的正确性。

举个例子,当对UserService这个业务层的类进行单元测试时,可以通过创建UserDaoLoginLogDao模拟对象,在假设DAO类正确工作的情况下对UserService进行测试。而对UserService进行集成测试时,则应该注入真实的UserDaoLoginLogDao进行测试。

所以一般来讲,集成测试面向的层面要更高一些,一般对业务层和Web层进行集成测试,单元测试则面向一些功能单一的类(如字符串格式化工具类、数据计算类)。当然,我们可能对某一个类既进行单元测试又进行集成测试,如UserService在模块开发期间进行单元测试,而在关联的DAO类开发完成后,再进行集成测试。

测试好处

在编写代码的过程中,一定会反复调试保证它能够编译通过。但代码通过编译,只是说明了它的语法正确。无法保证它的语义也一定正确,没有任何人可以轻易承诺这段代码的行为一定是正确的。幸运的是,单元测试会为我们的承诺做保证。编写单元测试就是用来验证这段代码的行为是否与我们期望的一致。有了单元测试,我们可以自信地交付自己的代码,减少后顾之忧。总之进行单元测试,会带来以下好处:

软件质量最简单、最有效的保证;

是目标代码最清晰、最有效的文档;

可以优化目标代码的设计;

是代码重构的保障;

是回归测试和持续集成的基石。

 

——本段文字节选自《Spring 3.x 企业应用开发实战》一书

图书详细信息:

http://www.cnblogs.com/broadview/archive/2012/03/06/2382519.html

posted @ 2012-03-06 19:54  博文视点(北京)官方博客  阅读(241)  评论(0编辑  收藏  举报