![](/img/trans.png)
[英]How to suppress runtime errors caused by assert() using google test?
[英]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), "");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.