使用Google Test预期给定范围内的值

Dre*_*kes 12 c++ unit-testing googletest

我想指定一个值在上限和下限之间的期望值,包括在内.

Google Test提供LT,LE,GT,GE,但无法测试我能看到的范围.您可以使用EXPECT_NEAR和处理操作数,但在许多情况下,这并不像显式设置上限和下限那样清晰.

用法应该类似于:

EXPECT_WITHIN_INCLUSIVE(1, 3, 2); // 2 is in range [1,3]
Run Code Online (Sandbox Code Playgroud)

如何才能增加这种期望呢?

Bil*_*hue 12

Google mock拥有更丰富的可组合匹配器:

EXPECT_THAT(x, AllOf(Ge(1),Le(3)));
Run Code Online (Sandbox Code Playgroud)

也许这对你有用.


org*_*ads 6

谷歌模拟备忘单中有一个很好的例子:

using namespace testing;
MATCHER_P2(IsBetween, a, b,
           std::string(negation ? "isn't" : "is") + " between " + PrintToString(a)
           + " and " + PrintToString(b))
{
    return a <= arg && arg <= b;
}
Run Code Online (Sandbox Code Playgroud)

然后使用它:

TEST(MyTest, Name) {
    EXPECT_THAT(42, IsBetween(40, 46));
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我会定义这些宏:

#define EXPECT_IN_RANGE(VAL, MIN, MAX) \
    EXPECT_GE((VAL), (MIN));           \
    EXPECT_LE((VAL), (MAX))

#define ASSERT_IN_RANGE(VAL, MIN, MAX) \
    ASSERT_GE((VAL), (MIN));           \
    ASSERT_LE((VAL), (MAX))
Run Code Online (Sandbox Code Playgroud)

  • 简单高效...直到在宏之后使用“&lt;&lt;”运算符:它仅适用于第二个 (*_LE) googletest 宏。 (2认同)

Dan*_*iel 5

仅使用Google Test(不是模拟),那么简单明了的答案就是:

EXPECT_TRUE((a >= 1) && (a <= 3)); // a is between 1 and 3 inclusive
Run Code Online (Sandbox Code Playgroud)

我发现这比基于Mock的一些答案更具可读性.

---开始编辑 -

上面的简单答案没有提供任何有用的诊断

您可以使用它AssertionResult来定义一个自定义断言,它确实产生了一个有用的错误消息,如下所示.

#include <gtest/gtest.h>

::testing::AssertionResult IsBetweenInclusive(int val, int a, int b)
{
    if((val >= a) && (val <= b))
        return ::testing::AssertionSuccess();
    else
        return ::testing::AssertionFailure()
               << val << " is outside the range " << a << " to " << b;
}

TEST(testing, TestPass)
{
    auto a = 2;
    EXPECT_TRUE(IsBetweenInclusive(a, 1, 3));
}

TEST(testing, TestFail)
{
    auto a = 5;
    EXPECT_TRUE(IsBetweenInclusive(a, 1, 3));
}
Run Code Online (Sandbox Code Playgroud)

  • 这里的问题是失败不包括有关所涉及的值的任何有用信息. (4认同)