我们在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.EqualityTest
的TEST(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.