介绍一个轻量级的C++ Unit test 框架: TUT
2007-10-12 13:30
633 查看
无论你是否采用测试驱动开发(TDD),编写Unittestcase都是重要的工作.在项目的各个阶段,我们都需要构建测试、运行测试、报告测试结果.有很多框架为这个工作提供便利,比如大名鼎鼎的xUnit系列.今天,我准备介绍的是一个轻量级的C++UnitTest框架:TUT(TemplateUnitTests的缩写)
大家第一个想问的问题估计就是:它和CppUnit有什么不同?它有什么特点?
我觉得最关键的地方在于TUT是一个轻量级的框架,TUT是使用template技术写的,完全没有macro.除去例子,它的代码一共只有两个头文件.我们完全不用build这个框架然后设置编译连接那么多麻烦,只要在编写Unittest的时候,把这两个头文件拷贝到项目目录或者设置一下头文件的包含路径就可以了.
TUT把Unittestcase通过group-test的层次组织,用户可以把相似的testcase放到同一个group,这个group有一个唯一的名字,group包含多个test,包含的test数量取决于你的编译器允许的template嵌套深度.用户可以选择运行所有的测试或者只是部分group,甚至部分test.在每个test里面,你可以使用TUT提供的一些方法来确认测试结果的正确性,告诉TUT这个测试是成功还是失败.
闲话少说,估计大家喜欢眼见为实,让我们写个例子来看看:
1.首先包含必要的头文件
3.写关于testgroup的代码
编译...结果我用的EditPlus+cygwin组合编译出现了问题,说我的template嵌套层次太多。看看tut.h:[/code]
[code]
[/code]
[/code]
大家第一个想问的问题估计就是:它和CppUnit有什么不同?它有什么特点?
我觉得最关键的地方在于TUT是一个轻量级的框架,TUT是使用template技术写的,完全没有macro.除去例子,它的代码一共只有两个头文件.我们完全不用build这个框架然后设置编译连接那么多麻烦,只要在编写Unittest的时候,把这两个头文件拷贝到项目目录或者设置一下头文件的包含路径就可以了.
TUT把Unittestcase通过group-test的层次组织,用户可以把相似的testcase放到同一个group,这个group有一个唯一的名字,group包含多个test,包含的test数量取决于你的编译器允许的template嵌套深度.用户可以选择运行所有的
闲话少说,估计大家喜欢眼见为实,让我们写个例子来看看:
1.首先包含必要的头文件
#include<stdio.h> #include"tut.h" #include"tut_reporter.h"
2.接着写了一个测试class //测试类,做的事情很简单,记住给它的最大的数字,我们就测试这个类 classmax_pool { intm_max; public: max_pool(intx=5):m_max(x){printf("%sinitmaxnum%d\n",__func__,x);} voidtry_set_value(intnum){if(num>m_max)m_max=num;} intget_max(){returnm_max;} };
3.写关于testgroup的代码
/*这个类用在test_basic里面, 我们可以用它来完成一些每个test都需要做的初始化和清理工作, 不过这里只是为了说明,只是输出点文字 */ classobj_init { public: obj_init(){printf("obj_initforeachtest\n");} ~obj_init(){printf("~objcleanforeachtest\n");} };
namespacetut { structtest_basic { max_poolm; obj_initxxx; }; //每个测试用例,都会重新构造和析构test_basic里面的m和xxx, //假如有什么需要每个测试都需要初始化和销毁的,放在这里 typedeftest_group<test_basic>factory; typedeffactory::objectobject; factorytf("max_poll_test_name");//这里设置了测试group的名字 } 4.写两个testcase
namespacetut { /** *Checksinsertoperation */ template<> template<> voidobject::test<1>() { printf("\truntestcase<1>\n"); m.try_set_value(4); ensure(m.get_max()==5);//告诉TUT假如这里==5就是测试OK } template<> template<> voidobject::test<2>() { printf("\truntestcase<2>\n"); m.try_set_value(8); ensure(m.get_max()==8);//告诉TUT假如这里==8就是测试OK } } 5.终于写到main()了,运行所有测试:
[code]usingtut::reporter; usingtut::groupnames; namespacetut { test_runner_singletonrunner; } intmain() { reportervisi; tut::runner.get().set_callback(&visi); tut::runner.get().run_tests(); return0; }
编译...结果我用的EditPlus+cygwin组合编译出现了问题,说我的template嵌套层次太多。看看tut.h:[/code]
[code]template<classData,intMaxTestsInGroup=50> classtest_group:publicgroup_base{...
[code]
[/code]
原来是test_group<test_basic>缺省有50个test,也就是说编译器需要能支持50层的template嵌套, 我修改了一下typedeftest_group<test_basic,15>factory;这样编译器只要能支持15层嵌套就可以通过了。
大家注意,VC6也是无法兼容TUT的,需要VS2003或者以上版本的支持.
最后运行的结果当然是测试通过了,结果如下,大家可以注意到structtest_basic里面对象在每个test的输出:
max_poolinitmaxnum5obj_initforeachtest
runtestcase<1>~objcleanforeachtest
max_poll_test_name:.max_poolinitmaxnum5
obj_initforeachtest
runtestcase<2>
~objcleanforeachtest.max_poolinitmaxnum5
obj_initforeachtest
~objcleanforeachtest
[/code]
相关文章推荐
- 推荐:一个写的相当好的介绍C++单元测试框架Google Test (gtest) 教程
- 推荐:一个写的相当好的介绍C++单元测试框架Google Test (gtest) 教程
- 介绍一个轻量级iOS安全框架:SSKeyChain
- 介绍一个轻量级iOS安全框架:SSKeyChain
- selenium一个完整的unittest测试框架格式(单线程,非测试报告)
- Python+Selenium框架设计篇之2-简单介绍unittest单元测试框架
- 介绍一个轻量级iOS安全框架:SSKeyChain
- 一个轻量级Actor并发框架的c++实现, libgsc(Game Server Communication Library)(一)
- 介绍一个轻量级iOS安全框架:SSKeyChain
- C++ Unit Test Framework(单元测试框架)
- 介绍一个轻量级iOS安全框架:SSKeyChain
- selenium-unittest框架介绍(一)
- jphone项目设计介绍(一个基于C++的应用程序框架以及软电话和日志服务器应用)
- C++ 自己实现的一个testSuite 框架
- 介绍一个轻量级的C++开发工具——Relo
- 介绍一个非常好用的跨平台C++开源框架:openFrameworks
- c语言实现一个单元测试框架(Unit Test Framework)代码
- C/C++单元测试框架的选择(CppUTest vs. CppUnit vs. CppUnitLite vs. CppTest vs. GoogleTest vs. CxxTest vs. CUnit)
- selenium一个完整的unittest测试框架格式(单线程,非测试报告)
- 【Chromium】谷歌C++ unit test框架 -- gtest