Google测试:断言两个值之一的相等性

时间:2015-08-05 06:13:58

标签: googletest

GoogleTest中是否包含以下内容:

ASSERT_EQ_ONE_OF_TWO(TestValue, Value1, Value2)

测试TestValue == Value1 || TestValue == Value2

此变体:

ASSERT_TRUE(TestValue == Value1 || TestValue == Value2)

没问题,但如果失败,它在日志中不会显示TestValue的值。

3 个答案:

答案 0 :(得分:2)

  

GoogleTest中是否存在类似

的内容

我想不。

  

没关系,但它在日志中没有显示TestValue具有的值   失败。

您可以添加以下附加日志信息:

TEST (ExampleTest, DummyTest)
{
    // Arrange.
    const int allowedOne =  7;
    const int allowedTwo = 42;
    int real             =  0;
    // Act.
    real = 5;
    // Assert.
    EXPECT_TRUE (real == allowedOne || real == allowedTwo)
            << "Where real value: "   << real
            << " not equal neither: " << allowedOne
            << " nor: "               << allowedTwo << ".";
}

此代码在失败时将生成以下日志:

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from ExampleTest
[ RUN      ] ExampleTest.DummyTest
/home/gluttton/ExampleTest.cpp:13: Failure
Value of: real == allowedOne || real == allowedTwo
  Actual: false
Expected: true
Where real value: 5 not equal neither: 7 nor: 42.
[  FAILED  ] ExampleTest.DummyTest (0 ms)
[----------] 1 test from ExampleTest (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] ExampleTest.DummyTest

答案 1 :(得分:1)

您可以将 EXPECT_THAT() 与容器和 Contains() 匹配器结合使用来实现此目的:

EXPECT_THAT((std::array{ Value1, Value2 }), Contains(TestValue));

注意,列表初始化需要array后面的大括号,array周围的括号是需要的,因为宏(如EXPECT_THAT())不理解大括号,否则将两个参数解释为三个参数。

这将提供与此类似的输出(使用 GTest 1.10 创建)

error: Value of: (std::array{ Value1, Value2 })
Expected: contains at least one element that is equal to 42
  Actual: { 12, 21 }

专业:

  • 打印所有值
  • 单线
  • 开箱即用

缺点:

  • 在输出中找到 TestValue 的值并不容易
  • 语法不简单
  • 需要现代编译器功能
    • 需要 C++11,因为 std::arraylist initialization(仍然不可用)
    • 由于 CTAD 需要 C++17,在 C++11/14 上使用 std::initializer_list<T>{ ... }。或者,可以使用自由函数来推断数组的大小和类型。

答案 2 :(得分:0)

我还没有发现任何东西可以满足您的要求,但是谓词断言应该能够处理您要的断言类型。此外,断言失败时,GoogleTest将自动打印出参数及其值。

您要使用的断言是

ASSERT_PRED3(<insert predicate>, TestValue, Value1, Value2)

谓词是返回bool的函数或函子,其中false使断言失败。对于谓词,可以使用如下函数:

bool OrEqual(int testValue, int option1, int option2)
{
  if (testValue == option1 ||
      testValue == option2)
  {
    return true;
  }
  else
  {
    return false;
  }
}

当然,这是一个简单的示例。由于您可以提供采用提供的参数的任何函数或函子,因此可以对谓词断言进行很多操作。

以下是文档:https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#predicate-assertions-for-better-error-messages