[英]Suppress output from google test assertions
我有两个测试连续函数插值的测试,当我的实现由于某种原因失败时,我从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()
进行测试, 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
的调用包装到on_interpolated_grid
中,但这没有帮助。
据我所知,问题是EXPECT_NEAR
在这种情况下ASSERT_NEAR
行为更像EXPECT_NEAR
。
出现这种情况的原因是Google Test在ASSERT_*
使用return
但没有异常 。 请参阅他们的常见问题解答,以了解为什么要这样做(简而言之:即使禁用了例外,它也可以运行测试,但是在某些情况下,例如try
-blocks中的ASSERT
,它还有其他优点。
这种方法的缺点就是您所拥有的: ASSERT_
如果在子函数(或您的情况下为lambda)中使用,则不会传播致命故障。 GTest高级主题页面上有关于此问题的部分 。 使用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);
});
}
要查看完整的测试输出(如果需要),只需删除添加的行。
最近,我提出了类似的问题( 减少gtest的输出,使其看起来类似于cxxtest的输出 )。
如果要完全抑制输出,可以使用::testing::EmptyTestEventListener
。 出于任何幻想,您必须实现自定义侦听器(例如,参见此处 )。
您甚至可以在main()
添加一个选项,以根据程序参数更改侦听器。
您说过要彩色输出。 googletest的维护者增加了以彩色文本打印功能。 我知道您不应该这样做,但是如果您声明这些功能,则可以访问它们。
看来Google测试AssertionResult是按设计打印到标准输出的。 没有内置的命令行选项来禁用该输出的特定部分。
如果调整谷歌测试本身是一个选项,那么最简单的很可能是周围添加一个条件PrintTestPartResult
呼叫PrettyUnitTestResultPrinter::OnTestPartResult
,同样通过调用PrintFullTestCommentIfPresent
在OnTestEnd
/ PrintFailedTests
。 在这种情况下, ParseGoogleTestFlagsOnlyImpl
和kColorEncodedHelpMessage
可以包含您自己的控制详细程度的选项。
否则(即,如果没有重新编译google test的选择),可以将TestEventListener
替换写入默认的PrettyUnitResultPrinter
(可能是从PrettyUnitResultPrinter
本身得到的),如google test sample中所述 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.