您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 开源C++单元测试框架Google Test介绍
开源C++单元测试框架GoogleTest介绍GoogleTestGoogletest是针对c/c++的开源测试项目。采用的协议是BSDlicense,有很多著名的开源项目采用了它,包括Chromium(谷歌浏览器开发版)。安装配置下载主页:官方资料文档:://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide当前的最新版本是1.5。包含3种tar.bz2,tar.gz和zip格式。解压后的目录结构:其中的msvc就是VS的工程目录,可以直接打开进行编译(vs2008则需要进行工程升级转化),生成相应的lib静态库文件。在vs中需要在工程中设置3个地方,和ACE的设置一样:1.设置gtest的头文件注:如果测试代码需要上库,附加包含目录建议设置为相对路径。2.设置gtest的lib文件注:如果测试代码需要上库,附加依赖项建议不要带绝对路径。3.设置运行时的多线程库支持如果是Release版本,RuntimeLibrary设为/MT。当然,其实你也可以选择动态链接(/MD),前提是你之前编译的gtest也使用了同样是/MD选项。如果是在Linux下,就比较方便,和普通的开源软件一样,采用1../configure–prefix=/yourinstallpath(如果不带参数默认为/usr/local下面)2.make3.makeinstall然后就可以在工程中进行使用(如果指定了安装目录,则需要-I和-L来指明,同时也在最后的link加上-lpthread–lgtest)下面是一个简易的写法:Bytheway:我在192.168.100.119上采用的是默认安装,所以直接加上-lgtest和-lpthread就可以了简单例子如果需要使用gtest,则需要包含#includegtest/gtest.h下面是一个简单例子:编译运行的结果:下面来依次解释:myadd是待测试函数名,TEST是作为gTest的一次测试(其实它是由gTest包装过的一个宏),第一个参数Test_myadd是测试用例名,第二个参数IsReturnAdd是测试名(这两个参数都是自己任意定义的)。在随后的测试结果中将以“测试用例名.测试名”的形式呈现EXPECT_EQ用于测试两个数据是否相等。第一个参数可以是你提前预定义的数据,第二个为测试函数名。main主函数中:testing::InitGoogleTest用来处理程序的命令行参数。RUN_ALL_TEST也是一个宏,用来运行所有的测试用例(本例中就只有一个TEST)。测试结果英文也很清晰,我就不画蛇添足了。最后再补充一点,编译后的二进制文件支持gtest的命令行参数,可以将数据直接转化为xml断言gtest采用了大量的宏来包装断言,此断言不同于c语言的断言(assert),按照使用方法分为2类:1.ASSERT系列(ASSERT_*系列的断言,当检查点失败时,退出当前函数,并非退出当前案例);2.EXPECT系列(EXPECT_*系列的断言,当检查点失败时,继续往下运行)按照常用功能依次分为12类,平常主要用到的是以下几类:1.布尔值比较2.数值型数据比较3.字符串比较4.浮点数比较5.近似数比较6.异常检测7.自定义格式函数与参数检查布尔值比较ASSERT_TRUE(condition)EXPECT_TRUE(condition)condition==trueASSERT_FALSE(condition)EXPECT_FALSE(condition)condition==false数值型数据比较ASSERT_EQ(expected,actual)EXPECT_EQ(expected,actual)expected==actualASSERT_NE(val1,val2)EXPECT_NE(val1,val2)val1!=val2ASSERT_LT(val1,val2)EXPECT_LT(val1,val2)val1val2ASSERT_LE(val1,val2)EXPECT_LE(val1,val2)val1=val2ASSERT_GT(val1,val2)EXPECT_GT(val1,val2)val1val2ASSERT_GE(val1,val2)EXPECT_GE(val1,val2)val2=val2字符串比较ASSERT_STREQ(str1,str2)EXPECT_STREQ(str1,str2)两个C字符串内容相同(同时支持char*和wchar_t*类型)ASSERT_STRNE(str1,str2)EXPECT_STRNE(str1,str2)两个C字符串内容不同(同时支持char*和wchar_t*类型)ASSERT_STRCASEEQ(str1,str2)EXPECT_STRCASEEQ(str1,str2)两个C字符串内容相同,忽略大小写(只支持char*类型)ASSERT_STRCASENE(str1,str2)EXPECT_STRCASENE(str1,str2)两个C字符串内容不同,忽略大小写(只支持char*类型)浮点数比较ASSERT_FLOAT_EQ(val1,val2)EXPECT_FLOAT_EQ(val1,val2)thetwofloatvaluesarealmostequalASSERT_DOUBLE_EQ(val1,val2)EXPECT_DOUBLE_EQ(val1,val2)thetwodoublevaluesarealmostequal近似数比较ASSERT_NEAR(val1,val2,abs_error)EXPECT_NEAR(val1,val2,abs_error)两个数值val1和val2的绝对值差不超过abs_error异常检查ASSERT_THROW(statement,exception_type)EXPECT_THROW(statement,exception_type)抛出指定类型异常ASSERT_THROW(statement)EXPECT_THROW(statement)抛出任意类型异常ASSERT_NO_THROW(statement)EXPECT_NO_THROW(statement)不抛异常函数值与参数检查(目前最多只支持5个参数)ASSERT_PRED1(pred1,val1)EXPECT_PRED1(pred1,val1)pred1(val1)returnstrueASSERT_PRED2(pred2,val1,val2)EXPECT_PRED2(pred2,val1,val2)pred2(val1,val2)returnstrueWindowsHRESULTASSERT_HRESULT_SUCCEEDED(expression)EXPECT_HRESULT_SUCCEEDED(expression)expressionisasuccessHRESULTASSERT_HRESULT_FAILED(expression)EXPECT_HRESULT_FAILED(expression)expressionisafailureHRESULT自定义格式函数与参数检查(目前最多支持5个参数)ASSERT_PRED_FORMAT1(pred1,val1)EXPECT_PRED_FORMAT1(pred1,val1)pred1(val1)issuccessfulASSERT_PRED_FORMAT1(pred1,val1,val2)EXPECT_PRED_FORMAT1(pred1,val1,val2)pred2(val1,val2)issuccessful下面将用一个实例来演示:我们编写了一个Configure的class,提供了3个对外的接口方法:1.get_size(void)2.add_item(stringstr)3.get_item(intindex)现在需要对其进行测试,那么就应该依次有这3个文件:1.Configure.h2.Configure.cpp3.main.cpp首先是Configure.h:接着是Configure.cpp:最后是主函数调用:进行编译后的执行:事件机制Gtest提供了多种事件机制方便在测试用例之前或者完成以后进行一些操作,按照使用方法分为3类:1.全局事件:在所有测试用例执行之前和完成之后生效。可以在全局事件中完成一些测试环境的初始化和资源回收工作,比如预留内存申请/回收,组件对象初始化/析构等。2.TestSuite级别:在指定的测试套第一个测试用例之前,最后一个测试用例之后。如果根据子模块定义测试套,那么就可以在TestSuite事件中完成一些子模块的线程、消息队列等的初始化和资源回收工作。3.TestCase级别:在每个测试用例执行前后,即在每个测试代码的断言前后进行执行。以下分别是3类事件的用法:全局事件:必须通过继承testing::Environment类,实现里面的SetUp和TearDown方法:1.SetUp()方法在所有用例执行前执行;2.TearDown()方法在所有用例执行后执行;完成继承类方法实现以后,还需要告诉gtest添加全局事件,我们需要在main函数中通过testing::AddGlobalTestEnvironment方法添加该全局事件。如果需要增加全局事件,也可以写多个继承类,然后将事件都添加到测试用例之前。以下是运行全局事件以后的显示结果:TestSuite事件:需要通过继承testing::Test类,实现里面的SetUpTestCase和TearDownTestCase两个静态方法:1.SetUpTestCase()方法在TestSuit的第一个TestCase之前执行;2.TearDownTestCase()方法在TestSuite的最后一个TestCase之后执行;在编写测试用例时,需要使用TEST_F宏,第一个参数必须是上面的继承类名字,代表一个TestSuite。以下是运行TestSuite事件以后的显示结果:TestCase事件:与TestSuite事件实现方法相同,需要通过继承testing::Test类,但是只需要实现里面的SetUp和TearDown两个方法:1.SetUp()方法在每个TestCase之前执行;2.TearDown()方法在每个TestCase之后执行;在编写测试用例时,需要使用TEST_F宏,第一个参数必须是上面的继承类名字,代表一个TestSuite,并且在测试套中添加测试用例。以下是运行TestSuite事件以后的显示结果:参数化在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况,以前的做法一般是写一个通用方法,然后编写在测试案例调用它,即使使用了通用方法,也需要很多重复性的工作。以下是一般的测试方法,如果需要测试N个数字,则需要拷贝复制粘贴N次:gTest在这里提供了一个灵活的函数参数化测试的方案:1.告诉gtest参数类型:必须添加一个继承类testing::TestWithParamT,其中T就是需要参数化的参数类型。以上面为例,需要参数化一个int型的参数;2.参数类型确定以后,需要使用一个新的宏TSET_P进行测试用例,在TEST_P宏里,使用GetParam()方法获取当前的参数的具体值;3.使用INSTANTIATE_TEST_CASE_P宏来确定测试的参数取值范围;其中:第一个参数是测试案例的前缀,可以任意取;第二个参数是测试案例的名称,需要和之前定义的参数化的类的名称相同,如:ParameterTest;第三个参数是可以理解为参数生成器,上面的例子使用testing::Values表示使用括号内的参数。G
本文标题:开源C++单元测试框架Google Test介绍
链接地址:https://www.777doc.com/doc-4215988 .html