如何发信号通知测试想跳过自己

gex*_*ide 14 c++ googletest

我在谷歌测试中有一组打字的测试用例.但是,其中一些测试用例根本不适用于特定类型参数.考虑这个示例类型测试用例:

TYPED_TEST_P(TheTest, ATest){
    if(TypeParam::isUnsuitedForThisTest()){
        return;
    }
    // ... real test code goes here
}
Run Code Online (Sandbox Code Playgroud)

这很好用,简单地跳过测试.但是,在执行测试时,我看到了平常

[ RUN      ] XYZ/TheTest/0.ATest
[       OK ] XYZ/TheTest/0.ATest (0 ms) 
Run Code Online (Sandbox Code Playgroud)

因此,测试被忽略并不明显,看起来它只是成功了.我想以某种方式显示测试用例被跳过.谷歌测试中是否有某种方法可以表示跳过了测试用例.像这样的东西(这不存在):

TYPED_TEST_P(TheTest, ATest){
    if(TypeParam::isUnsuitedForThisTest()){
        SIGNAL_SKIPPED(); // This is what I would like to have
        return;
    }
    // ... real test code goes here
}
Run Code Online (Sandbox Code Playgroud)

然后,输出将更改为如下所示:

[ RUN      ] XYZ/TheTest/0.ATest
[  SKIPPED ] XYZ/TheTest/0.ATest (0 ms)
Run Code Online (Sandbox Code Playgroud)

gtest中是否有一个能够实现这种行为的功能?

gex*_*ide 9

我提出了一个简单但可接受的解决方案:

只需使用宏打印一个额外的跳过线:

#define CHECK_FEATURE_OR_SKIP(FEATURE_NAME) \
do{\
  if(!TypeParam::hasFeature(FEATURE_NAME)) {\
     std::cout << "[  SKIPPED ] Feature " << #FEATURE_NAME << "not supported" << std::endl;\
     return;\
  }\
} while(0)
Run Code Online (Sandbox Code Playgroud)

然后我可以简单地使用这个宏:

TYPED_TEST_P(TheTest, ATest){
    CHECK_FEATURE_OR_SKIP(MyFeatureXY);
    // ... real test code goes here
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

[ RUN      ] XYZ/TheTest/0.ATest
[  SKIPPED ] Feature MyFeatureXY not supported 
[       OK ] XYZ/TheTest/0.ATest (0 ms)
Run Code Online (Sandbox Code Playgroud)

唯一的小缺陷是仍然有一条OK线,但至少很明显,测试用例被跳过,并且缺少的功能也整齐地显示出来.另一个缺陷是GUI测试运行器不会显示整齐的跳过,但我不关心这一点,因为我只使用命令行工具来运行测试用例.