通常这是通过创建全局对象来完成的,它们在构建时调用注册方法。这在C++中通常被认为是“良好实践”(参见https://isocpp.org/wiki/faq/ctors#static-init-order),所以在尝试这样的实现之前,您应该非常精通这些问题。
无论如何,这是googletest使用方法 - 在TEST
预处理宏最终归结为(GTEST-internal.h):
// Helper macro for defining tests.
#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
public:\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
private:\
virtual void TestBody();\
static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
};\
\
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
::test_info_ =\
::testing::internal::MakeAndRegisterTestInfo(\
#test_case_name, #test_name, NULL, NULL, \
(parent_id), \
parent_class::SetUpTestCase, \
parent_class::TearDownTestCase, \
new ::testing::internal::TestFactoryImpl<\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
所以,当你使用这个宏,的全局实例这个类调用了::testing::internal::MakeAndRegisterTestInfo
,其参数对应于测试用例。
感谢您的回复。 那么根据你的设计一个不使用静态初始化就能达到相同结果的系统的好方法呢? 或者,没有其他办法吗? –
如果你想在'main'被调用之前发生一些事情,你将不得不依靠静态初始化。显然Google选择这样实现它 - 我只是警告必须非常小心才能正确实现 - 因为如C++ FAQ中所述,创建不稳定的实现将非常容易。 – MuertoExcobito
您的帮助非常感谢:) 非常感谢。 –