为此很有必要设计一套能良好管理和添加测试用例的体系结构。
当一个功能有很多组测试数据时,我们可以将测试用例数据全部存放在文件中,使测试用例和测试代码分离开。由于测试用例脱离测试代码而存在,可以很方便的进行管理和维护。我们可以为每个要测试的函数(或功能)建个目录,每个测试用例放在一个单独的文本文件中,将所有对应于该函数的测试数据文件全部放入该目录下,当测试数据量很大时还可以在目录下再创建相应的子目录,分类进行管理。这样可以方便测试用例的管理,而测试程序也只用专注于测试逻辑。还以测试周期会议预约功能的例子为基础进行讨论。
图2-1 测试用例目录结构图
由图2-1上可以看到,当某个函数(或功能)的测试用例很多时,还可以在“某功能测试用例总目录”下再使用子目录来划分,若觉得划分不够细还可以继续加深目录层次,直到分类比较清晰为止。
由于测试用例数据和测试代码进行了分离,以后对于某个函数(或功能)有了新的测试用例时不用再去修改测试代码,只需在该功能的测试数据目录下添加新的测试用例文件即可。该功能的测试程序每次运行时对于相应测试数据目录下的每个测试用例文件(包括各级子目录下的用例文件)都要执行一遍。
使用了目录结构对它们进行了分门别类方便了以后的管理,正如良好的程序应具有好的可读性和维护性一样,良好的测试数据也应具有好的可读性和维护性。
2.2测试用例文件结构
测试用例文件中存放测试用例初始化数据和测试完毕后的验证数据。数据的结构采用一般配置文件的格式,详见图2-2。
图2-2 测试用例文件结构图
1)段名
配置文件中使用了段的概念,段相当于C++中的NameSpace,每个段内的关键字(Key)与其它段内的关键字互不影响,Section即为段名。
2)关键字
关键字用来标志不同元素的值,Key即为关键字的名字,关键字的名字不区分大小。
3)值
每个关键字都对应一个值,Value 即为值,值要区分大小。
4)注释
支持单行注释,字符“#”后面的内容为注释。
5)行结构
一行的结构只能是以下几种:
[Section]
Key=Value
空行
以上三中情况之一加上注释
2.3测试程序通用库
测试数据从测试代码中分离出来后,增加了管理测试数据文件和解析测试数据文件的代码,这部分代码是通用的,可以将它们组织成库供开发测试程序时使用。
图2-3 测试程序和测试通用库关系图
2.3.1管理测试数据文件的库
管理测试数据文件的库的功能如下:
1)获取目录下所有测试文件路径的接口
能找出某个目录下 (包括该目录下所有子目录)所有的测试文件(如“*.ini”文件)的路径并存起来。
2)获取下一个测试文件的接口
向用户提供下一个测试文件的路径,若已没有下一测试文件则返回空。
2.3.2解析测试文件的库
解析测试文件的库的功能如下:
1)文件解析接口
按照 2.2测试用例文件结构 中的文件结构解析出一个测试文件。
2)获取值的接口
向用户提供测试文件中某个段内某个关键字对应的值。
由于测试文件的结构和一般配置文件结构一致,可以使用已有的库来实现(如PWLIB中配置文件解析类)。
3.总结
一个完整的测试用例包含测试数据和测试代码,当测试数据和代码混在一起时给测试用例的维护带来了很大困难,而且给测试代码带来许多冗余。本文提出了将测试数据和测试代码分离的想法,并对怎样进行分离进行了阐述。测试数据从测试代码中分离出来后,使得测试数据维护简单、方便。
4.参考资料
CppUnit 主页 : http://cppunit.sourceforge.net/
xprogramming 主页 :http://www.xprogramming.com