我们来看看TestCase的创建过程(UnitTestImpl::GetTestCase):
// 查找并返回一个指定名称的TestCase对象。如果对象不存在,则创建一个并返回 // // 参数: // // test_case_name: 测试案例名称 // set_up_tc: 事件函数SetUpTestCases的函数地址 // tear_down_tc: 事件函数TearDownTestCases的函数地址 TestCase* UnitTestImpl::GetTestCase(const char* test_case_name, const char* comment, Test::SetUpTestCaseFunc set_up_tc, Test::TearDownTestCaseFunc tear_down_tc) { // 从test_cases里查找指定名称的TestCase internal::ListNode<TestCase*>* node = test_cases_.FindIf( TestCaseNameIs(test_case_name)); if (node == NULL) { // 没找到,我们来创建一个 TestCase* const test_case = new TestCase(test_case_name, comment, set_up_tc, tear_down_tc); // 判断是否为死亡测试案例 if (internal::UnitTestOptions::MatchesFilter(String(test_case_name), kDeathTestCaseFilter)) { // 是的话,将该案例插入到最后一个死亡测试案例后 node = test_cases_.InsertAfter(last_death_test_case_, test_case); last_death_test_case_ = node; } else { // 否则,添加到test_cases最后。 test_cases_.PushBack(test_case); node = test_cases_.Last(); } } // 返回TestCase对象 return node->element(); } |
三、回过头看看TEST宏的定义
#define TEST(test_case_name, test_name)\ GTEST_TEST_(test_case_name, test_name, \ ::testing::Test, ::testing::internal::GetTestTypeId()) |
同时也看看TEST_F宏
#define TEST_F(test_fixture, test_name)\ GTEST_TEST_(test_fixture, test_name, test_fixture, \ ::testing::internal::GetTypeId<test_fixture>()) |