c++ - 抑制谷歌测试断言的输出

标签 c++ unit-testing googletest

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

/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 中,但没有帮助。

最佳答案

据我所知,问题是因为 ASSERT_NEAR 在这种情况下表现得更像 EXPECT_NEAR

此行为的原因是 Google Test 使用 returnASSERT_* 中没有异常。参见 their FAQ为什么他们这样做(简而言之:它允许在禁用异常的情况下运行测试,但在某些情况下具有其他优势,例如 try block 中的 ASSERT

这种方法的缺点正是您所拥有的: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);

    });
}

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

关于c++ - 抑制谷歌测试断言的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22021555/

相关文章:

ruby-on-rails - Rails 测试和 Mocha : How to stub specific model - conditional any_instance?

unit-testing - 如何从多个维度构建 BDD 单元测试?

c++ - 从文件中删除记录 C++

python - 在 Django 中用于测试的模拟图像

c++ - 谷歌测试 : how to EXPECT_EQ non printable ASCII values

c++ - 将 googletest 与通过 std::cin 从用户获取输入的功能一起使用?

c++ 和 gtest,需要帮助理解为什么看似简单的测试失败

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 初始化字符矩阵时出现 EAccess 冲突

c++ - 容器中的 begin() 和 end() 方法应该始终具有相同的返回类型吗?