4

我用 GTest 编写了 C++ 测试,基本上是这样工作的

MyData data1 = runTest(inputData);
MyData data2 = loadRegressionData();

compareMyData(data1,data2);

void compareMyData(MyData const& data1, MyData const& data2)
{
  ASSERT_EQ(data1.count, data2.count);
  //pseudo:
  foreach element in data1/data2:
    EXPECT_EQ(data1.items[i], data2.items[i]);
}

现在我想将data1内容保存到一个文件 IFF 测试失败并且我还没有看到一个优雅的解决方案。


第一种方法:返回compareMyData比较结果。这不能与ASSERT_EQ致命的一起工作。写作if (!EXPECT_EQ(...))无法编译,所以我发现的唯一方法是

bool compareMyData(MyData const& data1, MyData const& data2)
{
  EXPECT_EQ(data1.count, data2.count);
  if (data1.count != data2.count)
    return false;
  //pseudo:
  foreach element in data1/data2:
  {
    EXPECT_EQ(data1.items[i], data2.items[i]);  
    if (data1.items[i]!= data2.items[i])
      return false;
  }
}

不是很优雅:-(


第二个想法:测试失败时运行代码

我知道::testing::EmptyTestEventListener如果测试失败,我可以实施并得到通知,但这并没有给我想要写入文件的数据,而且它离我想要的地方“很远”。所以我的问题是:如果测试失败(例如捕获异常?),有没有办法在测试结束时运行代码。


更笼统地问:你将如何解决这个问题?

4

2 回答 2

2

在 VladLosev 链接的高级指南中,它说,

Similarly, HasNonfatalFailure() returns true if the current test has at least one non-fatal failure, and HasFailure() returns true if the current test has at least one failure of either kind.

所以打电话HasNonfatalFailure可能是你想要的。(我来晚了,但有同样的问题。)

于 2014-10-26T13:28:41.300 回答
0

周围的方法:

bool HasError = false;
FAIL() << (HasError = true);
if (HasError){
 // do something
}

代替 FAIL() 可以是 ASSERT_.. EXPECT_... 等等。(在输出中您会看到“true”,这是快捷方式的费用)。

于 2019-05-31T16:55:15.997 回答