在GTest中检查EXPECT_ *宏的结果或在ASSERT_ *失败时运行代码

时间:2013-09-11 08:11:19

标签: c++ testing googletest

我用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并在测试失败时得到通知,但是这不会给我想要写入文件的数据,它离我想要的地方“很远”它有。所以我的问题是:有没有办法在测试结束时运行代码如果失败(例如捕获异常?)。


要问更一般的问题:你会如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

On the advanced guide 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可能就是你想要的。 (我已经很晚了,但也有同样的问题。)

答案 1 :(得分:0)

解决方法:

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

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