C++的单元测试框架——CxxUnit
2010-04-14 10:00:24| 分类:
R&D
| 标签:
|举报
|字号大中小 订阅
TUT(Template Unit Test)是一个不错的C++单元测试方案。它是用Template完成的(其实,CppUnit和CxxTest都有模板的部分)。随着C++编译器的进步,在大多数情况下,模板都是可以顺利通过编译的。但是,不要忘了,还有一种环境叫嵌入式,那里的编译器基本上还是很原始的,模板并不见得能够顺利的通过编译。
CxxUnit结构框架的复杂性处于TUT介于boost::test之间。添加新的测试工作量非常小;无须注册测试用例;可移植性很好;便于装卸;控制异常、崩溃方面的能力也不错;拥有良好的断言功能;支持多种输出方式;支持测试套件。
因为C++不支持reflection,所以,必须要做一些额外的工作,让框架知道相关内容的存在。CppUnit的做法是用宏进行注册。这种做法要求我们每添加一个测试,就要考虑用相应的宏进行注册,这种做法很繁琐,最大的问题在于由于疏忽而遗漏,这种靠人工保证的东西不可靠。CxxTest采用的方法比较特殊,有一个专门的脚本做这件事。通过这个脚本扫描分析C++的源文件,从中抽取测试方法,创建TestSuite。语法与JUnit非常相似,没有使用高级的C++特性,也没有定义特别的宏,无须写额外的代码。唯一的问题是引入了一个脚本,而且这个脚本一般是由某些动态语言写成的(目前的CxxTest有Perl和Python的脚本),从而引入了对这种语言的依赖。
优点:编译即测试方式,并且可以双击结果行立即定位到相应的源代码,相当吸引人;支持多种输出,输出结果较为详细;编写测试简单;
缺点:需要用到脚本对测试代码进行文法扫描,生成可执行代码,需要用到makefile文件(不是必须),准备工作比较麻烦。
vs2003中使用CxxTest测试框架
1. 下载CxxTest测试框架,并解压。
http://jaist.dl.sourceforge.net/sourceforge/cxxtest/cxxtest-3.10.1.zip
2. 假设测试项目project1。在project1目录新建新建空白项目testpriject1。
3. 打开项目属性,修改属性“生成事件|预生成事件”,添加命令:
{path to cxxtest}\cxxtestgen.pl --error-printer -o runner.cpp *.h
4. 修改属性“c/c++|附加包含目录”,添加{path to cxxtest}。
5. 在当前项目目录新建空白的cpp文件 runner.cpp并添加到项目中。
6. 编译执行。
vc命令行:
新建runtest.bat:
..\cxxtestgen.pl --error-printer -o runner.cpp TraitsTest.h
cl /GX /I.. -o runner.exe runner.cpp
.\runner.exe
vc GUI:
新建runtest.bat:
..\cxxtestgen.pl -o runner.cpp --gui=Win32Gui TraitsTest.h
cl /GX /I.. runner.cpp /link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /OUT:runner.exe
.\runner.exe -keep
gcc 命令行:(使用mingw)
新建runtest.bat:
set path=E:\MingW\bin;%path%
..\cxxtestgen.pl --error-printer -o runner.cpp ..\TraitsTest.h
g++ -o runner.exe -I .. runner.cpp
.\runner.exe
eclipse cdt中配置CxxTest
1. 首先下载插件CxxTest for Eclipse.解压安装。
2. 启动eclipse,可以创建CxxTest工程了。通过File->New ->C++ Project->Empty Project w/ CxxTest创建直接支持CxxTest的工程,或者创建完普通c++工程后在工程属性中选择CxxTest支持即可。
3. 测试,创建CxxTest工程UnitTest,在工程上点右键,选择new ,选择CxxTest Suite,Name输入Test,Header under Test空着,如果要对类进行单元测试,此处选中类的头文件即可,Finish。
自动生成头文件Test.h
#ifndef TEST_H_
#define TEST_H_
#include <cxxtest/TestSuite.h>
class Test : public CxxTest::TestSuite
{
public:
};
#endif /*TEST_H_*/
自己写一个简单的测试:
void testAddition(void)
{
TS_ASSERT(1+1>1);
TS_ASSERTEQUALS(1+1,2);
}
保存,自动编译,出现链接错误/usr/bin/ld: cannot find -lintl。在工程属性中选择C/C++ Build ->Settings->GCC C++ Linker ->Libraries,删除intl一项。再次编译,成功。直接出现CxxTest的窗口,当然少不了令人激动的绿条了。
加入一个失败的测试:
void testMultiplication(void)
{
TS_ASSERT_EQUALS(2*2,5);
}
编译。出现红条。
环境配置成功。
这个插件还提供了一个检查内存泄露的功能,很不错。
评论这张
转发至微博
转发至微博
评论