這篇文章主要總結(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)
<testcase name="Demo" status="run" time="0" classname="AddTest"> <failure message="Value of: Add(1, 2) Actual: 4 Expected: 3" type=""><![CDATA[g:/myproject/c++/gtestdemo/gtestdemo/gtestdemo.cpp:16Value of: Add(1, 2) Actual: 4Expected: 3]]></failure></testcase>
如果你對(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è)例子:
TEST(StringCmpTest, Demo){ char* pszCoderZh = "CoderZh"; wchar_t* wszCoderZh = L"CoderZh"; std::string strCoderZh = "CoderZh"; std::wstring wstrCoderZh = L"CoderZh"; EXPECT_STREQ("CoderZh", pszCoderZh); EXPECT_STREQ(L"CoderZh", wszCoderZh); EXPECT_STRNE("CnBlogs", pszCoderZh); EXPECT_STRNE(L"CnBlogs", wszCoderZh); EXPECT_STRCASEEQ("coderzh", pszCoderZh); //EXPECT_STRCASEEQ(L"coderzh", wszCoderZh); 不支持 EXPECT_STREQ("CoderZh", strCoderZh.c_str()); EXPECT_STREQ(L"CoderZh", wstrCoderZh.c_str());}
直接返回成功:SUCCEED();
返回失敗:
| Fatal assertion | Nonfatal assertion |
| FAIL(); | ADD_FAILURE(); |
TEST(ExplicitTest, Demo){ ADD_FAILURE() << "Sorry"; // None Fatal Asserton,繼續(xù)往下執(zhí)行。 //FAIL(); // Fatal Assertion,不往下執(zhí)行該案例。 SUCCEED();}
| 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 |
例如:
int Foo(int a, int b){ if (a == 0 || b == 0) { throw "don't do that"; } int c = a % b; if (c == 0) return b; return Foo(b, c);}TEST(FooTest, HandleZeroInput){ EXPECT_ANY_THROW(Foo(10, 0)); EXPECT_THROW(Foo(0, 5), char*);}
在使用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è)東西怎么用。
bool MutuallyPrime(int m, int n){ return Foo(m , n) > 1;}TEST(PredicateAssertionTest, Demo){ int m = 5, n = 6; EXPECT_PRED2(MutuallyPrime, m, n);}
當(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 |
| ... | ... |
用法示例:
testing::AssertionResult AssertFoo(const char* m_expr, const char* n_expr, const char* k_expr, int m, int n, int k) { if (Foo(m, n) == k) return testing::AssertionSuccess(); testing::Message msg; msg << m_expr << " 和 " << n_expr << " 的最大公約數(shù)應(yīng)該是:" << Foo(m, n) << " 而不是:" << k_expr; return testing::AssertionFailure(msg);}TEST(AssertFooTest, HandleFail){ EXPECT_PRED_FORMAT3(AssertFoo, 3, 6, 2);}
失敗時(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)致代碼編不過,難得用處就在這?看下面的例子:
template <typename T> class FooType {public: void Bar() { testing::StaticAssertTypeEq<int, T>(); }};TEST(TypeAssertionTest, Demo){ FooType<bool> fooType; fooType.Bar();}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注