2014-09-01 76 views
1

我们在2种不同的配置下构建一个MSVC++单元测试项目,以针对不同的实现运行相同的测试。由于每个测试运行两次,我们使用预处理丑陋破解测试名称:多级预处理器宏搞乱字符串输出

#if defined(XXX) 
    #define _VER BUILDX 
#elif defined(YYY) 
    #define _VER BUILDY 
#endif 

#define _TEST_SUITE_NAME_PACKAGE(Suite,Package) Suite##_##Package 
#define TEST_SUITE_NAME_PACKAGE(Suite,Package) _TEST_SUITE_NAME_PACKAGE(Suite,Package) 
#define TEST_SUITE_NAME(Suite) TEST_SUITE_NAME_PACKAGE(Suite,_VER) 

#define TEST(test_case_name, test_name) GTEST_TEST(TEST_SUITE_NAME(test_case_name), test_name) 

这一切都完美的作品,重新定义谷歌测试TEST宏修改使用字符串化的招数测试套件的名称。

但下面不工作:使用TEST(StringTestSuite,EqualityTest),使用TEST_F

#define TEST_F(test_fixture, test_name)\ 
    GTEST_TEST_(TEST_SUITE_NAME(test_fixture), test_name, test_fixture, \ 
       ::testing::internal::GetTypeId<test_fixture>()) 

相反的输出像StringTestSuite_XXX.EqualityTest使输出,如:

TEST_SUITE_NAME(StringTestSuite).EqualityTest

我能得到这个与一些工作简单的调整?

仅供参考,这里是最新的GTEST_TEST_的代码。而在gtest.h,GTEST_TEST被定义为:

#define GTEST_TEST(test_case_name, test_name)\ 
    GTEST_TEST_(test_case_name, test_name, \ 
       ::testing::Test, ::testing::internal::GetTestTypeId()) 

回答

1

只需添加一个更宏观的实现间接的多了一个层次,使宏将在该水平进行评估:

#define TEST_F_I(test_fixture, test_name, original_name) \ 
    GTEST_TEST_(test_fixture, test_name, original_name, \ 
     ::testing::internal::GetTypeId<original_name>()) 

#define TEST_F(test_fixture, test_name) \ 
    TEST_F_I(TEST_SUITE_NAME(test_fixture), test_name, test_fixture) 

My macro live demo link.

Your macro live demo link.

+1

并说下一个程序员的祈祷.... – NicholasM 2014-09-15 00:39:37