抑制谷歌测试断言的输出

时间:2014-02-25 17:21:11

标签: c++ unit-testing googletest

我有几个测试用于测试连续函数的插值,当我的实现由于某种原因失败时,我从我的Google测试套件中得到 lot 输出,如下所示:

/home/tlycken/exjobb/Code/alpha-orbit-follower/test/interpolation/interpolation-tests.cpp:71: Failure
The difference between this->test_function_y_deriv(x,y) and this->getInterpObjectPtr()->evaluateAt(x,y,0,1) is 1.5395837072062037, which exceeds tol, where
this->test_function_y_deriv(x,y) evaluates to -1.5395837072062037,
this->getInterpObjectPtr()->evaluateAt(x,y,0,1) evaluates to 0, and
tol evaluates to 0.01.

由于我基本上遍历插值区间并在很多地方使用ASSERT_NEAR()进行测试,所以我并不感到惊讶,但是抑制每条错误消息的详细信息会很好,只看到传递/报告中测试用例的失败状态。如果测试失败,我不明白为什么,我可以重新启用输出并仔细观察。

但是,我找不到有关如何抑制这种输出的任何信息。也许我的Google-fu不够......

是否有命令行标记或其他方法来抑制单个ASSERT*调用的输出,只显示最终的测试报告?

代码示例:

由于这似乎很难重现,这就是我正在运行的代码。在我的测试夹具中,我有以下方法:

void on_interpolated_grid(std::function<void(double)> f) {
    double dxp = dx / 10;
    double xmax = xmin + (N - 1) * dx;

    for (double xp = xmin + 2 * dx; xp < xmax - 2 * dx; xp += dxp) {
        f(xp);
    }
}

并且测试定义如下:

TYPED_TEST(Interp1D_F, SecondOrderDerivative) {
    Interp1D itp(this->N, this->x, this->f);

    this->on_interpolated_grid([itp](double x) -> void {
        ASSERT_NEAR(-sin(x), itp.evaluateAt(x, 2), 1e-3);
    });
}

测试夹具上的成员Nxf只是初始化插值对象的参数。

我还尝试将调用打包到on_interpolated_grid中的ASSERT_NO_FATAL_FAILURES,但它没有帮助。

3 个答案:

答案 0 :(得分:1)

据我所知,问题的结果是ASSERT_NEAR在这种情况下的行为更像EXPECT_NEAR

此行为的原因是 Google测试使用returnASSERT_* 中没有例外。请参阅their FAQ了解他们为何这样做(简而言之:它允许在禁用例外的情况下运行测试,但在某些情况下还有其他优势,例如ASSERT中的try - 块。

这种方法的缺点正是你在这里所拥有的:ASSERT_如果在子函数中使用(或在你的情况下是lambda),则不会传播致命的失败。 GTest高级主题页面有a section regarding this problem。使用HasFatalFailure(),可以使用修改后的lambda方法解决您的情况:

#include "gtest/gtest.h"
#include "gtest/gtest-typed-test.h"
#include <functional>

void on_interpolated_grid(std::function<void(double)> f) {
    ///ADDED a few values here
    double dxp = 1.0 / 10.0;
    double xmin = 0.1;
    double dx = 0.1;
    int N = 100;
    double xmax = xmin + (N - 1) * dx;

    for (double xp = xmin + 2 * dx; xp < xmax - 2 * dx; xp += dxp) {
        f(xp);
    }
}



TEST(Interp1D_F, SecondOrderDerivative) {
    ///REMOVED. Not required for sample
    //Interp1D itp(this->N, this->x, this->f);

    on_interpolated_grid([](double x) -> void {
        ///ADDED:
        //Only check for further failures if no previous fatal failure ocurred
        if (!this->HasFatalFailure())
            ASSERT_NEAR(-sin(x),0 , 1e-3);

    });
}

要查看完整的测试输出(如果需要),只需删除添加的行。

答案 1 :(得分:0)

最近我问了类似的问题(Reducing output of gtest, to look similar to output of cxxtest)。

如果要完全抑制输出,可以使用::testing::EmptyTestEventListener。对于任何花哨的东西,你必须实现自定义监听器(参见例如here)。

您甚至可以在main()中添加一个选项,以根据程序参数更改侦听器。

你说你想要丰富多彩的输出。 googletest的维护者添加了以彩色打印文本的功能。我知道你不应该,但如果你宣布这些功能,你就可以访问它们。

答案 2 :(得分:0)

似乎谷歌测试AssertionResult被设计打印到标准输出。没有内置命令行选项来禁用该输出的特定部分。

如果调整google测试本身是一个选项,那么最简单的可能就是在PrintTestPartResult中围绕PrettyUnitTestResultPrinter::OnTestPartResult来电添加条件,同样在{PrintFullTestCommentIfPresent中调用OnTestEnd 1}} / PrintFailedTests。在这种情况下,您自己选择控制详细程度可以包含在ParseGoogleTestFlagsOnlyImplkColorEncodedHelpMessage中。

否则(即如果重新编译google test不是一个选项),可以将TestEventListener替换写入默认的PrettyUnitResultPrinter(可能受到PrettyUnitResultPrinter本身的启发),如文档所述在google test samples