我们在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)

所有这些都可以完美工作,重新定义google-test TEST宏,以使用stringify技巧修改测试套件名称。

但是以下方法不起作用:
#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.EqualityTestTEST(StringTestSuite,EqualityTest)这样的输出,使用TEST_F的输出如下:
TEST_SUITE_NAME(StringTestSuite).EqualityTest
我可以通过一些简单的调整来使其工作吗?

供参考,这是GTEST_TEST_的gtest代码。在gtest.h中,GTEST_TEST定义为:
#define GTEST_TEST(test_case_name, test_name)\
  GTEST_TEST_(test_case_name, test_name, \
              ::testing::Test, ::testing::internal::GetTestTypeId())

最佳答案

只需添加一个宏即可实现更高级别的间接调用,这样就可以在该级别上评估宏:

#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.

08-18 14:54