如果期望在子程序中失败,如何使googletest打印整个跟踪

时间:2016-09-18 03:27:38

标签: googletest

我的googletest具有以下结构:

void
check(Arg a1, Arg a2)
{
   EXPECT_TRUE(a1 == a2);
}

TEST(s, t)
{
   a1 = make_arg1();
   a2 = make_arg2();
   check(a1, a2);

   a11 = make_arg1();
   a22 = make_arg2();
   check(a11, a22);

   ...... many other check() calls ......
}

现在当测试失败时,错误打印输出只显示check()的源代码行,而不是TEST()行。

我所知道的唯一解决方案是使用SCOPED_TRACE,如下所示:

TEST(s, t)
{
   SCOPED_TRACE("100");
   a1 = make_arg1();
   a2 = make_arg2();
   check(a1, a2);

   SCOPED_TRACE("200");
   a11 = make_arg1();
   a22 = make_arg2();
   check(a11, a22);

   ...... many other check() calls ......
}

但添加所有SCOPED_TRACE有点乏味,这里有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

如果检查是否相等,最好使用from hypothesis import given from hypothesis.strategies import lists, integers @given(integers(min_value=0, max_value=5).flatmap(lambda n: lists(lists(integers(min_value=1, max_value=5), min_size=n, max_size=n), min_size=1, max_size=50))) def test(l): # ... 而不是EXPECT_EQ。如果您的EXPECT_TRUE只包含这一行,那么请不要使用函数,只需在测试中使用check()

如果您的EXPECT_EQ功能更复杂且您不想复制&粘贴,你总是可以使用宏而不是函数。

答案 1 :(得分:0)

我可能会编写一个宏来打包check以添加SCOPED_TRACE。另外,我认为您当前使用SCOPED_TRACE的方式可能会为每个实例添加跟踪。

也许尝试类似的事情:

#define CHECK(msg, ...) \
do { SCOPED_TRACE(msg); check(__VA_ARGS__); } while(0)

如果您只想要行号并且不需要额外信息,也可以将msg替换为""