04月18, 2014

单元测试基础

一、单元测试与白盒测试的概念:

(一)什么是单元测试?

单元测试这个名词不陌生,但到底什么是单元测试,怎么给它下一个定义?我总结了一下,可以从以下几个方面来阐述:

1、 从名称来源上来说,单元测试这个概念是按照开发阶段对软件测试进行划分得到的一个概念。

2、 从测试的对象来说,单元测试针对的是最小可测模块,具体如何定义最小可测模块,依情况而定。

3、 从使用的测试技术/方法来说,单元测试可以通过黑盒、白盒测试技术来进行,但我们通常意义上所说的单元测试,是使用动态白盒测试技术进行的,属于白盒测试的范畴。

4、 从测试目的来说,单元测试主要是用来验证被测程序实现的跟我们的预期一致,功能逻辑符合需求。

(二)什么是白盒测试

与黑盒测试相对,白盒测试就是针对代码进行的测试。

1、 静态白盒测试:

比较常见的就是代码检查,可以通过人工检查或工具扫描的方式进行,原理都是一样,将被测程序与预先设定好的标准、规范进行比对,目的就是查找程序潜在的语法错误或隐藏的逻辑错误。

人工检查:将被测程序与代码检查清单进行比对。优点是能充分发挥人的逻辑思维优势,但是当代码量比较大的时候,单纯靠人工检查就会比较吃力。

工具扫描:将被测程序与工具预先设定好的规范进行比对,可以将代码检查工具理解为更严格的编译器。优点是只要设定好了我们关注的检查规则,工具就能帮我们检查程序是否违背了检查规则,当代码量比较大的时候,工具检查显然比人工更快。但同时,工具扫描会产生很多误报的信息,需要我们对报告结果进行筛选,找出我们真正关心的问题,忽略次要的问题。

常见的代码检查工具:

C++:pc-lint、c++test

Java:findbugs、PMD、jtest

2、 动态白盒测试:

可以与静态测试对比下,来说明动态白盒测试的概念和关注点。

首先,最明显的区别,静态测试不需要运行被测程序,而动态测试需要运行被测程序;

其次,动态测试,需要针对被测程序编写测试用例;

最后,动态测试与静态测试的关注点不同,动态测试主要是想验证程序实现的功能是否符合我们的预期,根据产品需求,在被测单元的代码逻辑上进行各种覆盖,验证正常、异常情况下程序的输出是否与我们的预期一致。而静态测试,尤其是使用代码检查工具进行的静态测试,与产品需求大多无关,针对不同的产品需求,我们的检查点基本都是固定的。

(三)白盒测试与单元测试的关系

1、它们是对软件测试的不同划分角度下得到的两个概念;

2、单元测试通常使用动态白盒测试技术进行。

二、为什么要做单元测试:

不应该把本应在单元测试时暴露的问题留到集成、系统测试时才暴露。

好处:

1、 降低bug定位、修复成本;

2、 提升了软件质量,也就相应地能够缩短软件开发周期。

三、如何做单元测试:

(一) 做单元测试,到底需要哪些工作?

A、 测试用例:使用动态白盒测试技术进行单元测试,必须得针对被测程序编写测试用例,这是必不可少的工作,也是单元测试的大部分工作。

B、 准备驱动模块:所谓的驱动模块,就是负责驱动测试程序执行的模块,使用单元测试框架,它内置的各种运行器就可以使我们免除驱动模块的编写。

C、 准备桩模块:用来模拟被测模块所调用的模块,比较常见的就是使用现成的mock工具/框架创建mock对象来代替被测模块依赖的模块。有些单元测试工具/框架能够针对被测程序自动创建一些桩模块,比如c++test。另外一些单元测试框架虽然不能自动生成桩模块,但可以和一些已有的mock框架比如easy mock,jmock结合使用。

D、 覆盖率统计:比较常用的比如EclEmma,eCobertura,这两个都是eclipse插件的形式。使用它们可以很直观的看到我们编写的测试用例覆盖对源代码的覆盖程度。

(二) 单元测试应该遵守的一些原则:

A、 解除被测模块与依赖模块之间的耦合

B、 测试程序与被测程序分离

C、 测试用例之间无依赖、互相独立(增加、删除不会对其他用例产生影响)

D、 测试用例无序(改变测试用例执行顺序,对测试结果不会产生影响)

E、 测试结束后的清理,还原到测试执行之前的状态

F、覆盖率

本文链接:http://blogs.360.cn/post/单元测试基础.html

-- EOF --

Comments