這篇文章主要總結(jié)gtest中的所有斷言相關(guān)的宏。 gtest中,斷言的宏可以理解為分為兩類,一類是ASSERT系列,一類是EXPECT系列。一個(gè)直觀的解釋就是:
1. ASSERT_* 系列的斷言,當(dāng)檢查點(diǎn)失敗時(shí),退出當(dāng)前函數(shù)(注意:并非退出當(dāng)前案例)。
2. EXPECT_* 系列的斷言,當(dāng)檢查點(diǎn)失敗時(shí),繼續(xù)往下執(zhí)行。
假如你的Add(1, 2) 結(jié)果為4的話,會(huì)在結(jié)果中輸出:
g:/myPRoject/c++/gtestdemo/gtestdemo/gtestdemo.cpp(16): error: Value of: Add(1, 2) Actual: 4Expected:3如果是將結(jié)果輸出到xml里的話,將輸出:(關(guān)于將結(jié)果輸出為xml,見:http://www.cnblogs.com/coderzh/archive/2009/04/10/1432789.html)
如果你對(duì)自動(dòng)輸出的出錯(cuò)信息不滿意的話,你還可以通過操作符<<將一些自定義的信息輸出,通常,這對(duì)于調(diào)試或是對(duì)一些檢查點(diǎn)的補(bǔ)充說明來說,非常有用!
下面舉個(gè)例子:如果不使用<<操作符自定義輸出的話:
for (int i = 0; i < x.size(); ++i) { EXPECT_EQ(x[i], y[i]);}看到的結(jié)果將是這樣的,你根本不知道出錯(cuò)時(shí) i 等于幾:
g:/myproject/c++/gtestdemo/gtestdemo/gtestdemo.cpp(25): error: Value of: y[i] Actual: 4Expected: x[i]Which is: 3
如果使用<<操作符將一些重要信息輸出的話:
for (int i = 0; i < x.size(); ++i){ EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;}從輸出結(jié)果中就可以定位到在 i = 2 時(shí)出現(xiàn)了錯(cuò)誤。這樣的輸出結(jié)果看起來更加有用,容易理解:
g:/myproject/c++/gtestdemo/gtestdemo/gtestdemo.cpp(25): error: Value of: y[i] Actual: 4Expected: x[i]Which is: 3Vectors x and y differ at index 2
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition is true |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | condition is false |
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_EQ(expected, actual); | EXPECT_EQ(expected, actual); | expected == actual |
ASSERT_NE(val1, val2); | EXPECT_NE(val1, val2); | val1 != val2 |
ASSERT_LT(val1, val2); | EXPECT_LT(val1, val2); | val1 < val2 |
ASSERT_LE(val1, val2); | EXPECT_LE(val1, val2); | val1 <= val2 |
ASSERT_GT(val1, val2); | EXPECT_GT(val1, val2); | val1 > val2 |
ASSERT_GE(val1, val2); | EXPECT_GE(val1, val2); | val1 >= val2 |
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_STREQ(expected_str, actual_str); | EXPECT_STREQ(expected_str, actual_str); | the two C strings have the same content |
ASSERT_STRNE(str1, str2); | EXPECT_STRNE(str1, str2); | the two C strings have different content |
ASSERT_STRCASEEQ(expected_str, actual_str); | EXPECT_STRCASEEQ(expected_str, actual_str); | the two C strings have the same content, ignoring case |
ASSERT_STRCASENE(str1, str2); | EXPECT_STRCASENE(str1, str2); | the two C strings have different content, ignoring case |
*STREQ*和*STRNE*同時(shí)支持char*和wchar_t*類型的,*STRCASEEQ*和*STRCASENE*卻只接收char*,估計(jì)是不常用吧。下面是幾個(gè)例子:
直接返回成功:SUCCEED();
返回失敗:
Fatal assertion | Nonfatal assertion |
FAIL(); | ADD_FAILURE(); |
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_THROW(statement, exception_type); | EXPECT_THROW(statement, exception_type); | statement throws an exception of the given type |
ASSERT_ANY_THROW(statement); | EXPECT_ANY_THROW(statement); | statement throws an exception of any type |
ASSERT_NO_THROW(statement); | EXPECT_NO_THROW(statement); | statement doesn't throw any exception |
例如:
在使用EXPECT_TRUE或ASSERT_TRUE時(shí),有時(shí)希望能夠輸出更加詳細(xì)的信息,比如檢查一個(gè)函數(shù)的返回值TRUE還是FALSE時(shí),希望能夠輸出傳入的參數(shù)是什么,以便失敗后好跟蹤。因此提供了如下的斷言:
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_PRED1(pred1, val1); | EXPECT_PRED1(pred1, val1); | pred1(val1) returns true |
ASSERT_PRED2(pred2, val1, val2); | EXPECT_PRED2(pred2, val1, val2); | pred2(val1, val2) returns true |
... | ... | ... |
Google人說了,他們只提供<=5個(gè)參數(shù)的,如果需要測(cè)試更多的參數(shù),直接告訴他們。下面看看這個(gè)東西怎么用。
當(dāng)失敗時(shí),返回錯(cuò)誤信息:
error: MutuallyPrime(m, n) evaluates to false, wherem evaluates to 5n evaluates to 6
如果對(duì)這樣的輸出不滿意的話,還可以自定義輸出格式,通過如下:
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_PRED_FORMAT1(pred_format1, val1);` | EXPECT_PRED_FORMAT1(pred_format1, val1); | pred_format1(val1) is successful |
ASSERT_PRED_FORMAT2(pred_format2, val1, val2); | EXPECT_PRED_FORMAT2(pred_format2, val1, val2); | pred_format2(val1, val2) is successful |
... | ... |
用法示例:
失敗時(shí),輸出信息:
error: 3 和 6 的最大公約數(shù)應(yīng)該是:3 而不是:2
是不是更溫馨呢,呵呵。
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_FLOAT_EQ(expected, actual); | EXPECT_FLOAT_EQ(expected, actual); | the two float values are almost equal |
ASSERT_DOUBLE_EQ(expected, actual); | EXPECT_DOUBLE_EQ(expected, actual); | the two double values are almost equal |
對(duì)相近的兩個(gè)數(shù)比較:
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_NEAR(val1, val2, abs_error); | EXPECT_NEAR(val1, val2, abs_error); | the difference between val1 and val2 doesn't exceed the given absolute error |
同時(shí),還可以使用:
EXPECT_PRED_FORMAT2(testing::FloatLE, val1, val2);EXPECT_PRED_FORMAT2(testing::DoubleLE, val1, val2);
Fatal assertion | Nonfatal assertion | Verifies |
ASSERT_HRESULT_SUCCEEDED(expression); | EXPECT_HRESULT_SUCCEEDED(expression); | expression is a success HRESULT |
ASSERT_HRESULT_FAILED(expression); | EXPECT_HRESULT_FAILED(expression); | expression is a failure HRESULT |
例如:
CComPtr shell;ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L"Shell.application"));CComVariant empty;ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty));
類型檢查失敗時(shí),直接導(dǎo)致代碼編不過,難得用處就在這?看下面的例子:
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注