使用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
相关产品推荐
相关产品推荐

