c ++ Google test(gtest):如何创建自定义断言并期望?

时间:2017-07-21 14:27:19

标签: c++ unit-testing googletest

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

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

我必须编写两个检查,因为如果我省略ASSERT_TRUEmyObject碰巧无效,则myObject.GetSomeAttributre()调用崩溃。即使在测试中,这也不好。

我想要的是写下这样的东西:

EXPECT_XXX_EQ(myObject.GetSomeAttribute(), expectedValue);

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

如何编写自定义断言/期望?

1 个答案:

答案 0 :(得分:3)

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

,第二种技术也可以产生很好的错误消息