使用谷歌测试期望给定范围内的值

问题描述 投票:0回答:6

我想指定一个值在上限和下限之间的期望值。

Google Test 提供了 LT,LE,GT,GE,但是无法测试我能看到的范围。您可以使用

EXPECT_NEAR
并兼顾操作数,但在许多情况下,这不如明确设置上限和下限那么清楚。

用法应类似于:

EXPECT_WITHIN_INCLUSIVE(1, 3, 2); // 2 is in range [1,3]

如何添加这种期望?

c++ unit-testing googletest
6个回答
23
投票

Google 测试具有更丰富的可组合匹配器:

// expect that x is >= 1 and <= 3
EXPECT_THAT(x, AllOf(Ge(1),Le(3)));

也许这对你有用。

请参阅此处“复合匹配器”部分下的googletest

matchers.md
文档


20
投票

只使用谷歌测试(不是模拟),那么简单明了的答案是:

EXPECT_TRUE((a >= 1) && (a <= 3)); // a is between 1 and 3 inclusive

我发现这比一些基于模拟的答案更具可读性。

--- 开始编辑 --

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

您可以使用

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));
}

7
投票

我会定义这些宏:

#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))

6
投票

google mock cheat sheet 中有一个很好的例子

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;
}

然后使用它:

TEST(MyTest, Name) {
    EXPECT_THAT(42, IsBetween(40, 46));
}

1
投票

最后我创建了一个宏来执行此操作,它类似于 Google 测试库中的其他宏。

#define EXPECT_WITHIN_INCLUSIVE(lower, upper, val) \
  do { \
    EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val, lower); \
    EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val, upper); \
  } while (0)

1
投票

在不需要谷歌模拟的谷歌测试中使用现有的布尔函数。链接非常具体。

这是例子。

// Returns true iff m and n have no common divisors except 1.
bool MutuallyPrime(int m, int n) { ... }
const int a = 3;
const int b = 4;
const int c = 10;

断言 EXPECT_PRED2(MutuallyPrime, a, b);会成功,而 断言 EXPECT_PRED2(MutuallyPrime, b, c);将失败 讯息

!MutuallyPrime(b, c) is false, where

b is 4

c is 10
© www.soinside.com 2019 - 2024. All rights reserved.