一个基于面向对象语言的白盒测试模式(以Java为例)
作者:廖光明 (liaogm2002@hotmail.com)
1 概要
1.1 目的
规范项目单元与集成测试过程,统一集成测试、单元测试架构和用例设计,达到测试用例维护性,复用性较好,路径覆盖高的目的。
1.2 术语说明
为便于沟通,引入如下术语表述:
1) Unit
对于过程性软件,指程序模块或组件;对于面向对象软件指Class,如果Class太大时,也可以操作/方法作为单元。
2) Unit Test
以Unit为范围,测试一个功能集中很详细具体的单个方面,也称为Logic Unit test。
对面向对象软件的单元测试,指对某个单独的类编写测试用例. 一般指对类的方法独立进行的测试,测试方法之间无依赖关系,而测试所依赖的外部环境依靠mock或者stubs来控制,logic unit tests 是白盒测试的基础,一般由开发此程序单元的人员负责完成。
3) Integration test
用于检查已通过Logic Unti test 的Class的集成协作操作是否符合需求设计说明,也称为Integration Unti test。
在面向对象程序设计中,Integration unit tests是白盒测试的关键。
4) Functional unit test
用于检查已经通过Integration Unti test的Class Package输入接口、输出接口是否与需求说明一致,以级检查Package内部可能的冗余代码。
当Integration test满足覆盖性要求(包括正常功能覆盖与异常处理覆盖)时,Functional Unit test测试方法类似于系统测试,不关注内部代码实现,其测试过程可参考本人后续的系统测试规范。
三种测试单元关系如下图:
2 适用范围
适用于面向对象编程的系统。
3 测试框架
使用Junit + Ant + CodeCoverage 作为测试框架。
4 单元测试基本规则
4.1 单元测试范围
4.1.1需要进行单元测试的类
除自动生成的Entity EJB外所有的Java类都需要实施单元测试,其中对Servlet、JSP暂缓实施。
4.1.2 需要进行单元测试的方法
原则:对其他对象可能会访问的所有方法需要进行显式的单元测试;
1) 对public和缺省访问权限的方法都需要进行显式的单元测试;
2) 对private、protected方法的单元测试已经隐含在(1)中,无需再进行单独的单元测试;
3) 对setter/getter方法无需进行单元测试,除非它们执行了set/get其属性以外的其他动作;
4.2 测试用例的设计
测试用例是针对方法的,亦即方法的实参用例。测试用例应该包括所有的可能输入情况。
所有单元集成测试都应该实现的测试用例:
1) 正常运行的测试用例;
2) 设计的应当出错(发生异常)的测试用例;
3) 参数为特殊值的测试用例;
4) 常见的各类参数的特殊值:
A. Object类型的参数值为null