如何向gtest发出测试想要跳过自身的信号

How to signal to gtest that a test wants to skip itself

本文关键字:信号 gtest 测试      更新时间:2023-10-16

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

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

这样做效果很好,只需跳过测试即可。然而,在执行测试时,我看到了一个常见的

[ RUN      ] XYZ/TheTest/0.ATest
[       OK ] XYZ/TheTest/0.ATest (0 ms) 

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

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      ] XYZ/TheTest/0.ATest
[  SKIPPED ] XYZ/TheTest/0.ATest (0 ms)

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

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

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

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

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

TYPED_TEST_P(TheTest, ATest){
    CHECK_FEATURE_OR_SKIP(MyFeatureXY);
    // ... real test code goes here
}

结果如下:

[ RUN      ] XYZ/TheTest/0.ATest
[  SKIPPED ] Feature MyFeatureXY not supported 
[       OK ] XYZ/TheTest/0.ATest (0 ms)

唯一的小缺陷是仍然有一行OK,但至少很明显,测试用例被跳过了,并且丢失的功能也被整齐地显示了出来。另一个缺陷是GUI测试运行程序不会那么整齐地显示跳过,但我不在乎这一点,因为我只使用命令行工具来运行测试用例。

由于gtest版本11.10.0GTEST_SKIP()可用,因此您可以执行以下操作:

TYPED_TEST_P(TheTest, ATest){
    if(TypeParam::isUnsuitedForThisTest()){
        GTEST_SKIP();  // this ends the test here so no need for return
    }
    // ... real test code goes here
}