簡體   English   中英

禁止來自Google測試斷言的輸出

[英]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);
    });
}

測試夾具上的成員Nxf只是用於初始化插值對象的參數。

我還嘗試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 ,同樣通過調用PrintFullTestCommentIfPresentOnTestEnd / PrintFailedTests 在這種情況下, ParseGoogleTestFlagsOnlyImplkColorEncodedHelpMessage可以包含您自己的控制詳細程度的選項。

否則(即,如果沒有重新編譯google test的選擇),可以將TestEventListener替換寫入默認的PrettyUnitResultPrinter (可能是從PrettyUnitResultPrinter本身得到的),如google test sample中所述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM