我有几个测试用于测试连续函数的插值,当我的实现由于某种原因失败时,我从我的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);
});
}
测试夹具上的成员N
,x
和f
只是初始化插值对象的参数。
我还尝试将调用打包到on_interpolated_grid
中的ASSERT_NO_FATAL_FAILURES
,但它没有帮助。
答案 0 :(得分:1)
据我所知,问题的结果是ASSERT_NEAR
在这种情况下的行为更像EXPECT_NEAR
。
此行为的原因是 Google测试使用return
但ASSERT_*
中没有例外。请参阅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
。在这种情况下,您自己选择控制详细程度可以包含在ParseGoogleTestFlagsOnlyImpl
和kColorEncodedHelpMessage
中。
否则(即如果重新编译google test不是一个选项),可以将TestEventListener
替换写入默认的PrettyUnitResultPrinter
(可能受到PrettyUnitResultPrinter
本身的启发),如文档所述在google test samples。