检测辅助方法中的断言失败

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

我希望在我的测试中有一个辅助方法来涵盖一些经常执行的检查。考虑这个例子:

void checkAsserts(int a, int b, int c) {
  EXPECT_EQ(a, b);
  EXPECT_GT(b, c);
  EXPECT_TRUE(isPrime(c));
}

这样做的问题是在后面的代码中:

checkAsserts(firstVal, secondVal, thirdVal);
checkAsserts(X, Y, Z):

如果断言失败,我不知道在哪个helper中。理想情况下我会这样做

ASSERT_TRUE(checkAsserts(firstVal, secondVal, thirdVal));
ASSERT_TRUE(checkAsserts(X, Y, Z));

但是,实现这一目标的唯一方法是重复助手中的每个断言,这很糟糕:

bool checkAsserts(int a, int b, int c) {
  bool passed = true;
  EXPECT_EQ(a, b);
  passed = passed && a == b;
  EXPECT_GT(b, c);
  passed = passed && b > c;
  EXPECT_TRUE(isPrime(c));
  passed = passed && isPrime(c);
  return passed;
}

理想情况下,我想要的是这样的:

bool checkAsserts(int a, int b, int c) {
  AssertSentinel sentinel;
  EXPECT_EQ(a, b);
  EXPECT_GT(b, c);
  EXPECT_TRUE(isPrime(c));
  return sentinel.failures().empty();
}

gtest 提供类似的东西吗?或者还有其他方法可以实现我的目标吗?

c++ googletest
1个回答
0
投票

正如我所理解的那样,您想知道众多调用者中的哪一个导致了测试失败。

SCOPED_TRACE()
就是为了这样的目的。

SCOPED_TRACE("");
checkAsserts(firstVal, secondVal, thirdVal);
SCOPED_TRACE("");
checkAsserts(X, Y, Z):

如果

checkAsserts()
测试用例失败,它将转储文件名和最近的上范围跟踪行。

您可以使用任何有用的消息扩展范围跟踪,对我来说,空字符串对于所有情况都非常好。

© www.soinside.com 2019 - 2024. All rights reserved.