gtest是Google开源的C++单元测试框架,之前稍接触过boost::unittest和cmockery,这些框架的使用基本上是大同小异。因为项目涉及到gtest,那我就借此机会学习一下。 ios
首先是从网站上下载最新的版本:http://code.google.com/p/googletest/downloads/list ubuntu
以前在网上浏览了一些gtest相关的资料,听说是须要编译器支持C++ TR1。还好目前我用的两个环境ubuntu gcc 4.2.4和vs2010还不须要担忧这个问题。 框架
下了源码包以后,首先在vs2010下编译。在msvc目录下有个工程文件,打开一共有4个工程:gtest, gtest_main, gtest_prod_test和gtest_unittest。把debug和release都bulid一下,前两个生成了静态库.lib,后两个生产了可执行文件.exe。目前我只关心第一个gtest,企业的之后再慢慢研究。新建了一个做为单元测试的工程,把gtest的include路径、lib路径和文件都设好。 函数
第一次bulid出了一大堆错误... 单元测试
提示是符号重复定义,库冲突了。加上连接参数/NODEFAULTLIB:libCMTD,再bulid,仍是一大堆相似的错误,只libcmtd.lib变成了libcpmtd。胡乱地加上/NODEFAULTLIB:libCPMTD,这回既有重复定义,又有未定义符号错误。试试反过来/NODEFAULTLIB:libMSVCRTD,仍是不行。看来方向不对。 学习
认真查资料得知,libCMTD.lib等库是vs默认选用的运行库。千辛万苦去对比gtest工程和个人工程的构建编译连接参数,终于发现C++代码生成里面runtime library项不同:个人工程里用的是Multi-threaded Debug DLL (/MDd),而gtest用的是Multi-threaded (/MT)。因而尝试把个人工程参数也改过来,发现仍是有错。通过几轮组合尝试,终于在/MTd和/NODEFAULTLIB:libCMTD参数下构建成功。后来,我试着把gtest的编译参数改为/MTd从新生成。这一回个人工程参数只要跟gtest保持一致用/MTd就构建成功了。运行看到RUN OK PASSED等字样,感受这真是不容易啊.... 测试
到这里库冲突问题算是已经解决,但当中的原理还不是太清楚,之后研究... 网站
最后小结gtest最基本的接口宏: google
TEST(test_case_name, test_name) - 像定义一个函数那样创建一个测试用例,一般用于功能比较独立的测试 spa
TEST_F(test_fixture, test_name) - 像定义一个函数那样创建一个测试夹具,须要一个夹具类协助,一般用于须要上下文的测试
RUN_ALL_TESTS() - 放在main函数里的东西,表示测试开始
EXPECT/ASSERT_*(expected, actual) - 测试检查点,EXPECT/ASSERT区别是前者失败会继续执行,后者将退出当前函数