玩转Google开源C++单元测试框架GoogleTest系列(gtest)之七-深入解析gtest.docx
上传人:sy****28 上传时间:2024-09-14 格式:DOCX 页数:12 大小:286KB 金币:18 举报 版权申诉
预览加载中,请您耐心等待几秒...

玩转Google开源C++单元测试框架GoogleTest系列(gtest)之七-深入解析gtest.docx

玩转Google开源C++单元测试框架GoogleTest系列(gtest)之七-深入解析gtest.docx

预览

免费试读已结束,剩余 2 页请下载文档后查看

18 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://www.cnblogs.com/coderzh/archive/2009/04/11/1433744.html"玩转Google开源C++单元测试框架GoogleTest系列(gtest)之七-深入解析gtest一、前言“深入解析”对我来说的确有些难度,所以我尽量将我学习到和观察到的gtest内部实现介绍给大家。本文算是抛砖引玉吧,只能是对gtest的整体结构的一些介绍,想要了解更多细节最好的办法还是看gtest源码,如果你看过gtest源码,你会发现里面的注释非常的详细!好了,下面就开始了解gtest吧。二、从TEST宏开始前面的文章已经介绍过TEST宏的用法了,通过TEST宏,我们可以非法简单、方便的编写测试案例,比如:TEST(FooTest,Demo){EXPECT_EQ(1,1);}我们先不去看TEST宏的定义,而是先使用/P参数将TEST展开。如果使用的是VistualStudio的话:1.选中需要展开的代码文件,右键-属性-C/C++-Preprocessor2.GeneratePreprocessedFile设置WithoutLineNumbers(/EP/P)或WithLineNumbers(/P)3.关闭属性对话框,右键选中需要展开的文件,右键菜单中点击:Compile编译过后,会在源代码目录生成一个后缀为.i的文件,比如我对上面的代码进行展开,展开后的内容为:classFooTest_Demo_Test:public::testing::Test{public:FooTest_Demo_Test(){}private:virtualvoidTestBody();static::testing::TestInfo*consttest_info_;FooTest_Demo_Test(constFooTest_Demo_Test&);voidoperator=(constFooTest_Demo_Test&);};::testing::TestInfo*constFooTest_Demo_Test::test_info_=::testing::internal::MakeAndRegisterTestInfo("FooTest","Demo","","",(::testing::internal::GetTestTypeId()),::testing::Test::SetUpTestCase,::testing::Test::TearDownTestCase,new::testing::internal::TestFactoryImpl<FooTest_Demo_Test>);voidFooTest_Demo_Test::TestBody(){switch(0)case0:if(const::testing::AssertionResultgtest_ar=(::testing::internal::EqHelper<(sizeof(::testing::internal::IsNullLiteralHelper(1))==1)>::Compare("1","1",1,1)));else::testing::internal::AssertHelper(::testing::TPRT_NONFATAL_FAILURE,".\\gtest_demo.cpp",9,gtest_ar.failure_message())=::testing::Message();}展开后,我们观察到:1.TEST宏展开后,是一个继承自testing::Test的类。2.我们在TEST宏里面写的测试代码,其实是被放到了类的TestBody方法中。3.通过静态变量test_info_,调用MakeAndRegisterTestInfo对测试案例进行注册。如下图:上面关键的方法就是MakeAndRegisterTestInfo了,我们跳到MakeAndRegisterTestInfo函数中://创建一个TestInfo对象并注册到GoogleTest;//返回创建的TestInfo对象////参数:////test_case_name:测试案例的名称//name:测试的名称//test_case_comment:测试案例的注释信息//comment:测试的注释信息//fixture_class_id:testfixture类的ID//set_up_tc:事件函数SetUpTestCases的函数地址//tear_down_tc:事件函数TearDownTestCases的函数地址//factory:工厂对象,用于创建测试对象(Test)TestInfo*M