簡體   English   中英

當 assert() 意外觸發時,如何抑制 Google 測試中的終止?

[英]How to suppress termination in Google test when assert() unexpectedly triggers?

這里討論了如何捕獲失敗的斷言,例如,您設置您的裝置,以便 assert() 失敗並且您會看到不錯的輸出。 但我需要的是相反的。 我想測試 assert() 是否成功。 但如果它失敗了,我想有很好的輸出。 那時它只是在它在 assert() 上卡住時終止。

#define LIMIT 5

struct Obj {
    int getIndex(int index) {
        assert(index < LIMIT);
        // do stuff;
    }
}

Obj obj;

TEST(Fails_whenOutOfRange) {
    ASSERT_DEATH(obj->getIndex(6), "");
}

TEST(Succeeds_whenInRange) {
    obj->getIndex(4);
}

以上是人為的例子。 我希望第二個測試在失敗時不終止,例如,如果我將 LIMIT 設置為 3。畢竟,當 assert() 失敗時,ASSERT_DEATH 會以某種方式抑制終止。

您應該嘗試使用命令行選項--gtest_break_on_failure

它旨在在調試器中運行測試,因此您會在測試失敗時獲得斷點。 如果您不使用調試器,您只會得到一個 SEGFAULT 並且執行將停止。

以下只是我的意見,但在我看來,您要么測試了錯誤的東西,要么使用了錯誤的工具。

Assert (C assert() ) 不是用於驗證輸入,而是用於捕獲不可能的情況。 例如,它將從發布代碼中消失,因此您不能依賴它。

您應該測試的是您的功能規范而不是實現 您應該決定,您對無效輸入值的規范是什么:

  • 未定義行為,所以assert是好的,但你不能用單元測試進行測試,因為不確定的行為,那么,不確定的。

  • 定義的行為。 那么無論是否存在NDEBUG您都應該保持一致。 在我看來,拋出異常是正確的做法,而不是調用std::abort ,這對用戶幾乎沒有用(不能被正確攔截和處理)。

如果assert觸發(失敗),您會得到“不錯的輸出”(或崩潰或斷言在您的環境中所做的任何事情)。 如果assert沒有觸發,那么什么都不會發生並且繼續執行。 你還需要知道什么?

這個(hack)向谷歌測試添加了一個EXPECT_NODEATH宏。 它與EXPECT_DEATH的“相反”在於,如果語句沒有斷言、中止或以其他方式失敗,它將通過。

總體思路很簡單,但我沒有花時間使錯誤消息更好看。 我試圖讓谷歌測試盡可能保持原樣,只是捎帶上已經存在的東西。 您應該能夠將其包含在內,而不會對 Google 測試的其余部分產生任何副作用

對於您的情況:

TEST(Succeeds_whenInRange) {
    EXPECT_NODEATH(obj->getIndex(4), "");
}

GTestNoDeath.h

暫無
暫無

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

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