国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

Google開源C++單元測(cè)試框架gTest 2:gTest斷言

2019-11-07 23:19:32
字體:
供稿:網(wǎng)友

一、前言

這篇文章主要總結(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í)行。

二、示例

// int型比較,預(yù)期值:3,實(shí)際值:Add(1, 2)EXPECT_EQ(3, Add(1, 2))// 

 

假如你的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)

復(fù)制代碼<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>復(fù)制代碼

 

如果你對(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 assertionNonfatal assertionVerifies
ASSERT_TRUE(condition);EXPECT_TRUE(condition);condition is true
ASSERT_FALSE(condition);EXPECT_FALSE(condition);condition is false

 

四、數(shù)值型數(shù)據(jù)檢查

Fatal assertionNonfatal assertionVerifies
ASSERT_EQ(expectedactual);EXPECT_EQ(expectedactual);expected == actual
ASSERT_NE(val1val2);EXPECT_NE(val1val2);val1 != val2
ASSERT_LT(val1val2);EXPECT_LT(val1val2);val1 < val2
ASSERT_LE(val1val2);EXPECT_LE(val1val2);val1 <= val2
ASSERT_GT(val1val2);EXPECT_GT(val1val2);val1 > val2
ASSERT_GE(val1val2);EXPECT_GE(val1val2);val1 >= val2

 

五、字符串檢查 

Fatal assertionNonfatal assertionVerifies
ASSERT_STREQ(expected_stractual_str);EXPECT_STREQ(expected_stractual_str);the two C strings have the same content
ASSERT_STRNE(str1str2);EXPECT_STRNE(str1str2);the two C strings have different content
ASSERT_STRCASEEQ(expected_stractual_str);EXPECT_STRCASEEQ(expected_stractual_str);the two C strings have the same content, ignoring case
ASSERT_STRCASENE(str1str2);EXPECT_STRCASENE(str1str2);the two C strings have different content, ignoring case

 

*STREQ*和*STRNE*同時(shí)支持char*和wchar_t*類型的,*STRCASEEQ*和*STRCASENE*卻只接收char*,估計(jì)是不常用吧。下面是幾個(gè)例子:

復(fù)制代碼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());}復(fù)制代碼

 

六、顯示返回成功或失敗

直接返回成功:SUCCEED();

返回失敗: 

Fatal assertionNonfatal assertion
FAIL();ADD_FAILURE();

 

復(fù)制代碼TEST(ExplicitTest, Demo){    ADD_FAILURE() << "Sorry"; // None Fatal Asserton,繼續(xù)往下執(zhí)行。    //FAIL(); // Fatal Assertion,不往下執(zhí)行該案例。    SUCCEED();}復(fù)制代碼

七、異常檢查

Fatal assertionNonfatal assertionVerifies
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

 

例如:

復(fù)制代碼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*);}復(fù)制代碼

八、Predicate Assertions

在使用EXPECT_TRUE或ASSERT_TRUE時(shí),有時(shí)希望能夠輸出更加詳細(xì)的信息,比如檢查一個(gè)函數(shù)的返回值TRUE還是FALSE時(shí),希望能夠輸出傳入的參數(shù)是什么,以便失敗后好跟蹤。因此提供了如下的斷言:

Fatal assertionNonfatal assertionVerifies
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è)東西怎么用。 

復(fù)制代碼bool MutuallyPrime(int m, int n){    return Foo(m , n) > 1;}TEST(PredicateAssertionTest, Demo){    int m = 5, n = 6;    EXPECT_PRED2(MutuallyPrime, m, n);}復(fù)制代碼

 

當(dāng)失敗時(shí),返回錯(cuò)誤信息:

error: MutuallyPrime(m, n) evaluates to false, wherem evaluates to 5n evaluates to 6

如果對(duì)這樣的輸出不滿意的話,還可以自定義輸出格式,通過如下:

Fatal assertionNonfatal assertionVerifies
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
......

 

用法示例:

復(fù)制代碼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);}復(fù)制代碼

失敗時(shí),輸出信息:

error: 3 和 6 的最大公約數(shù)應(yīng)該是:3 而不是:2

是不是更溫馨呢,呵呵。 

九、浮點(diǎn)型檢查

Fatal assertionNonfatal assertionVerifies
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 assertionNonfatal assertionVerifies
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);

 

十、Windows HRESULT assertions

Fatal assertionNonfatal assertionVerifies
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)致代碼編不過,難得用處就在這?看下面的例子:

復(fù)制代碼template <typename T> class FooType {public:    void Bar() { testing::StaticAssertTypeEq<int, T>(); }};TEST(TypeAssertionTest, Demo){    FooType<bool> fooType;    fooType.Bar();}

復(fù)制代碼


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 砚山县| 长海县| 镇雄县| 濮阳县| 香格里拉县| 汉阴县| 荣昌县| 石狮市| 栾城县| 罗源县| 若羌县| 浦城县| 丹江口市| 清苑县| 新巴尔虎右旗| 双流县| 大渡口区| 柘城县| 乐平市| 翼城县| 三门县| 三门县| 崇信县| 博白县| 清水河县| 五原县| 乐山市| 江都市| 青河县| 竹溪县| 聂拉木县| 湖口县| 新龙县| 天全县| 同江市| 阳城县| 廊坊市| 渭南市| 烟台市| 辛集市| 麻城市|