我们在 2 种不同的配置下构建了一个 MSVC++ 单元测试项目,以针对不同的实现运行相同的测试。由于每个测试运行两次,我们使用预处理器 ugliness 破解测试名称:
#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
宏以使用字符串化技巧修改测试套件名称。
但是以下不有效:
#define TEST_F(test_fixture, test_name)\
GTEST_TEST_(TEST_SUITE_NAME(test_fixture), test_name, test_fixture, \
::testing::internal::GetTypeId<test_fixture>())
不是使用 TEST(StringTestSuite,EqualityTest)
输出类似 StringTestSuite_XXX.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)
关于c++ - 多级预处理器宏搞乱了字符串化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25603522/