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

les*_*nik 3 c++ unit-testing googletest

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

ASSERT_TRUE(myObject.IsValid());
EXPECT_EQ(myObject.GetSomeAttribute(), expectedValue);
Run Code Online (Sandbox Code Playgroud)

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

我想要写的是这样的:

EXPECT_XXX_EQ(myObject.GetSomeAttribute(), expectedValue);
Run Code Online (Sandbox Code Playgroud)

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

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

Jus*_*tin 5

从“ 高级指南”中,我们可以看到有两种方法可以执行此操作。

最简单的方法是在子例程中使用断言

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());
}
Run Code Online (Sandbox Code Playgroud)

您可以这样称呼它:

AssertAttributeEquals(myObject, expectedValue);
Run Code Online (Sandbox Code Playgroud)

尽管您可能想使用它SCOPED_TRACE来获取有关失败的更好的消息:

{
    SCOPED_TRACE("whatever message you want");
    AssertAttributeEquals(myObject, expectedValue);
}
Run Code Online (Sandbox Code Playgroud)

另外,您可以使用返回以下内容的函数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;
    }
}
Run Code Online (Sandbox Code Playgroud)

可以这样使用:

EXPECT_TRUE(AttributeEquals(myObject, expectedValue));
Run Code Online (Sandbox Code Playgroud)

第二种技术的好处是即使您不使用也会产生良好的错误消息 SCOPED_TRACE