[分享我的经验]Cpp项目测试方案设计及实现
时间:2010-07-15 来源:charlescui
代码结构:
bin: 该目录存放的文件是httpd, 这份可执行文件是集成测试的web服务.
build:
该目录分两级, 分别存放debug版本和release版本测试代码的编译结果. 测试期间,我们只需要用到debug版本,该版本的代码都是可以通过gdb进行调试的.
data:
该目录中各子目录以模块区分, 分别存放各个模块的测试数据, 其余顶层目录中的文件为本测试项目共享测试数据.
include:
该目录分两级,
第一级为各个模块编译成可执行文件时所需要的头文件, 此时的编译结果为每个模块一个编译结果,结果中包含该模块的全部测试集.
第二集为bvt测试头文件, bvt测试头文件和上一层头文件的区别是,bvt的头文件中会注释掉某些测试集或测试用例, 并且会把各个模块的测试代码编译到一个输出文件中去,当执行bvt编译后的文件时, 那些在bvt头文件目录下的各个头文件中没有注释的测试用例就会执行. 这样做最大的好处是,测试代码不需要维护两份,只需要多维护一份头文件即可.
lib: 存放的是测试工程所依赖的第三方库文件
logs: 该目录存放的是集成测试web服务的日志文件
report:
该目录存放的是测试报告数据文件, 其中report.xsl是用于渲染测试报告xml文件的样式文件.
source:
该目录存放的是各个模块的测试代码,以模块名区分, 以及bvt的入口函数文件,还有utils工具类文件,
以sorce中的webserver测试代码为例: source/webserver:
该模块的类实现必须放到: <模块名>_test.cpp文件中, 该模块的测试代码放到test_开头的cpp文件中, 该模块编译可执行程序是所需的入口函数必须单独放到main.cpp文件中,绝不可和其它文件混淆.
这样的设计保证了: 1.测试类的实现与测试用例分开.各测试用例所用到测试模块的公共部分可以放到类实现中去,比如setup和teardown函数. 2.做bvt编译的时候,如果多个模块都具有main函数,由于main方法重复定义,编译会无法通过, 3.做bvt编译的时候,负责编译的Makefile可以通过排除式查找,将文件名不为main.cpp代码文件统一编译,
比如可以通过如下简洁的命令实现多个CPP文件的编译: BVT_CPP=$(shell find $(HOME)/source -name '*.cpp' -type f|grep -v 'main.cpp'|grep -v 'performance.cpp') 这条命令说明: 查找HOME下source目录下名为cpp后缀的非main.cpp文件,并且拍出performance.cpp文件,将剩下的文件作为bvt所需的cpp文件来编译.
views: 该目录存放了集成测试web服务所需要的视图文件.
Makefile:
该文件实现各个模块的编译与清理, 共用的部分都定义为一个变量, 需要集成编译的cpp比如bvt的cpp,通过制定上面source目录的规则,让find命令可以将cpp搜索出来, 这样就不需要把很多的cpp文件写死到Makefile中了.
其它依赖: 1.Cppunit1.12.1:本次测试采用Cppunit作为基础框架 2.libcurl:该库实现了http请求的发送以及实现urlencode 3.syslog:测试过程中的详细都输出到同一日志中,由syslog负责收集. 其它
集成测试平台:
TestFixure:
左边是测试用例集,每个用例集包含了不同数量的 TestCase ,分别对应被测试的各个模块,
( performance_test 是性能测试用例集,不单独对应某个模块)
ExecStdout:
右边是每个测试用例集的执行结果,可以通过点击每个用例集右边的超链接 Run 来执行某个用例集。
(需要注意 的是, webserver_test 用例最多,并且包含很多大文本测试,执行起来速度很慢,要耐心等待)
Run:
测试执行,当点击每个测试集后面的 Run 时,页面会弹出提示,告诉你耐心等待。
(大家可以拿 translation_engine_test 来试用下,该用例执行速度很快)
测试执行结束后,系统会跳出提示框通知执行者 Case 执行完毕,并且可以在 ExecStdout 中看到执行的结果。
执行结果的最后,目前有如下重要的信息:
0.01user 0.00system 0:04.08elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+1649minor)pagefaults 0swaps
这两行信息包含了该测试集的 CPU 执行时间,用户态时间和内核态时间,还可以检测该程序所用的私有数据区大小,私有堆栈大小, Socket 输入输出字节数,文件读写 IO 情况等。
Report:
该区域展示的是某个模块的CppUnit测试执行报告。