一 、前言 “深入解析”对我来说的确有些难度,所以我尽量将我学习到和观察到的 gtest内部实现介绍给大家。本文算是抛砖引玉吧,只能是对 gtest的整体结构的一些介绍,想要了解更多细节最好的办法还是看 gtest源码,如果你看过 gtest源码,你会发现里面的注释非常的详细!好了,下面就开始了解 gtest吧。 二、从 TEST宏开始 前面的文章已经介绍过 TEST宏的用法了,通过 TEST宏,我们可以非法简单、方便的编写测试案例,比如: TEST(FooTest, Demo) { EXPECT_EQ(1, 1); } 我们先不去看 TEST宏的定义,而是先使用/P参数将 TEST展开。如果使用的是 Vistual Studio的话: 1. 选中需要展开的代码文件,右键 - 属性 - C/C++ - Preprocessor 2. Generate Preprocessed File 设置 Without Line Numbers (/EP /P) 或 With Line Numbers (/P) 3. 关闭属性对话框,右键选中需要展开的文件,右键菜单中点击:Compile 编译过后,会在源代码目录生成一个后缀为.i的文件,比如我对上面的代码进行展开,展开后的内容为: class FooTest_Demo_Test : public ::testing::Test { public: FooTest_Demo_Test() {} private: virtual void TestBody(); static ::testing::TestInfo* const test_info_; FooTest_Demo_Test(const FooTest_Demo_Test &); void operator=(const FooTest_Demo_Test &); }; ::testing::TestInfo* const FooTest_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>); void FooTest_Demo_Test::TestBody() { switch (0) case 0: if (const ::testing::AssertionResult gtest_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::...