[英]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.