我有几个测试连续函数插值的测试,当我的实现由于某种原因失败时,我从我的 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);
});
}
测试夹具上的成员N
、x
和f
只是插值对象初始化的参数。
我还尝试将对 on_interpolated_grid
的调用包装在 ASSERT_NO_FATAL_FAILURES
中,但没有帮助。
最佳答案
据我所知,问题是因为 ASSERT_NEAR
在这种情况下表现得更像 EXPECT_NEAR
。
此行为的原因是 Google Test 使用 return
但 ASSERT_*
中没有异常。参见 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/