You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::pair作为gtest参数化测试参数时,错误信息不清晰如何解决?

在Google Test中美化std::pair参数化测试的错误输出

当在Google Test(gtest)中使用std::pair作为参数化测试的参数时,测试失败后的错误输出只会显示字节对象信息,例如:

[ FAILED ] 1 test, listed below:
[ FAILED ] MyTest/MyFixtureTest.MyTest/1, where GetParam() = (4-byte object <00-00 00-00>, 4-byte object <01-00 00-00>)

我们希望能让错误信息更直观,比如显示枚举类型的名称或整数值。以下是示例测试代码:

enum class A
{
  A=0,
  B,
  C
};

enum class B
{
  A=0,
  B,
  C
};

B convertAtoB(A a)
{
  if (a==A::A)
  {
    return B::A;
  }
  else if (a==A::B)
  {
    return B::B;
  }
  else
  {
    return B::C;
  }
}

class MyFixtureTest :
  public ::testing::TestWithParam<std::pair<A, B>>
{ 
};

TEST_P(MyFixtureTest, MyTest) {
  A a = GetParam().first;
  EXPECT_EQ(convertAtoB(a), GetParam().second);
  
}

INSTANTIATE_TEST_CASE_P(
        MyTestP,
        MyFixtureTest,
        ::testing::Values(
                std::make_pair(A::A, B::B),
                std::make_pair(A::B, B::B),
                std::make_pair(A::C, B::C)
  )
);

解决方法

Google Test允许通过重载PrintTo函数自定义类型的输出格式,只需为枚举类型和std::pair<A,B>分别实现该函数即可。

1. 为枚举类型实现PrintTo函数

给枚举A和B编写打印函数,将枚举值转换为对应名称或整数值:

#include <ostream>

void PrintTo(A a, std::ostream* os) {
    switch(a) {
        case A::A: *os << "A::A"; break;
        case A::B: *os << "A::B"; break;
        case A::C: *os << "A::C"; break;
        default: *os << "A::Unknown(" << static_cast<int>(a) << ")";
    }
}

void PrintTo(B b, std::ostream* os) {
    switch(b) {
        case B::A: *os << "B::A"; break;
        case B::B: *os << "B::B"; break;
        case B::C: *os << "B::C"; break;
        default: *os << "B::Unknown(" << static_cast<int>(b) << ")";
    }
}

2. 为std::pair<A,B>实现PrintTo函数

为参数类型std::pair<A,B>实现打印函数,调用上述枚举打印函数格式化输出:

void PrintTo(const std::pair<A, B>& p, std::ostream* os) {
    *os << "(";
    PrintTo(p.first, os);
    *os << ", ";
    PrintTo(p.second, os);
    *os << ")";
}

3. 效果验证

添加上述代码后,测试失败时的错误输出会变为:

[ FAILED ] MyTest/MyFixtureTest.MyTest/0, where GetParam() = (A::A, B::B)

这样能清晰看到参数的具体枚举值,方便定位问题。

注意:这些PrintTo函数需要放在全局命名空间中,或与枚举类型同命名空间,确保Google Test能正确找到它们。

内容的提问来源于stack exchange,提问作者roschach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:11:17