c++ Google 测试(gtest):如何创建自定义断言和期望?

c++ Google test (gtest): how to create custom asserts and expects?

我正在使用 gtest 为我的 C++ 程序创建单元测试。在我的测试中,我必须写很多这样的检查:

ASSERT_TRUE(myObject.IsValid());
EXPECT_EQ(myObject.GetSomeAttribute(), expectedValue);

我必须写这两个检查,因为如果我省略 ASSERT_TRUE 并且 myObject 碰巧无效,那么 myObject.GetSomeAttributre() 调用就会崩溃。即使在测试中也不好。

我想要的是这样写:

EXPECT_XXX_EQ(myObject.GetSomeAttribute(), expectedValue);

这行代码应该与原来的两行大致相同(有可选的好处,如果 myObject 无效,将报告, GetSomeAttribute() 不会被调用,但是测试将继续 运行).

我怎么写这样的习惯assert/expect?

Advanced Guide 中,我们可以看出有几种方法可以做到这一点。

最简单的方法是 using assertions in a subroutine:

template<typename T>
void AssertAttributeEquals(MyObject const& obj, T value) {
    ASSERT_TRUE(obj.IsValid());
    // googletest has the assumption that you put the
    // expected value first
    EXPECT_EQ(value, obj.GetAttribute());
}

你可以这样称呼它:

AssertAttributeEquals(myObject, expectedValue);

尽管您可能想使用 SCOPED_TRACE 来获得更好的失败消息:

{
    SCOPED_TRACE("whatever message you want");
    AssertAttributeEquals(myObject, expectedValue);
}

或者,您可以 use a function that returns an AssertionResult:

template<typename T>
::testing::AssertionResult AttributeEquals(MyObject const& obj, T value) {
    if (!obj.IsValid()) {
        // If MyObject is streamable, then we probably want to include it
        // in the error message.
        return ::testing::AssertionFailure() << obj << " is not valid";
    }
    auto attr = obj.GetAttribute();

    if (attr == value) {
        return ::testing::AssertionSuccess();
    } else {
        return ::testing::AssertionFailure() << attr << " not equal to " << value;
    }
}

可以这样使用:

EXPECT_TRUE(AttributeEquals(myObject, expectedValue));

第二种技术的好处是即使您不使用 SCOPED_TRACE

也能生成漂亮的错误消息