日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架

發(fā)布時(shí)間:2024/4/11 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

上一篇我們分析了gtest的一些內(nèi)部實(shí)現(xiàn),總的來說整體的流程并不復(fù)雜。本篇我們就嘗試編寫一個(gè)精簡版本的C++單元測試框架:nancytest ,通過編寫這個(gè)簡單的測試框架,將有助于我們理解gtest。

二、整體設(shè)計(jì)

使用最精簡的設(shè)計(jì),我們就用兩個(gè)類,夠簡單吧:

1. TestCase類
包含單個(gè)測試案例的信息。?

2. UnitTest類

負(fù)責(zé)所有測試案例的執(zhí)行,管理。

三、TestCase類

TestCase類包含一個(gè)測試案例的基本信息,包括:測試案例名稱,測試案例執(zhí)行結(jié)果,同時(shí)還提供了測試案例執(zhí)行的方法。我們編寫的測試案例都繼承自TestCase類。

class?TestCase
{
public:
????TestCase(
const?char*?case_name)?:?testcase_name(case_name){}

????
//?執(zhí)行測試案例的方法
????virtual?void?Run()?=?0;

????
int?nTestResult;?//?測試案例的執(zhí)行結(jié)果?
????const?char*?testcase_name;?//?測試案例名稱
};

?

四、UnitTest類

我們的UnitTest類和gtest的一樣,是一個(gè)單件。我們的UnitTest類的邏輯非常簡單:

1. 整個(gè)進(jìn)程空間保存一個(gè)UnitTest 的單例。

2. 通過RegisterTestCase()將測試案例添加到測試案例集合testcases_中。

3. 執(zhí)行測試案例時(shí),調(diào)用UnitTest::Run(),遍歷測試案例集合testcases_,調(diào)用案例的Run()方法

class?UnitTest
{
public:
????
//?獲取單例
????static?UnitTest*?GetInstance();?

????
//?注冊(cè)測試案例
????TestCase*?RegisterTestCase(TestCase*?testcase);
????
????
//?執(zhí)行單元測試
????int?Run();

????TestCase
*?CurrentTestCase;?//?記錄當(dāng)前執(zhí)行的測試案例
????int?nTestResult;?//?總的執(zhí)行結(jié)果
????int?nPassed;?//?通過案例數(shù)
????int?nFailed;?//?失敗案例數(shù)
protected:
????std::vector
<TestCase*>?testcases_;?//?案例集合
};

下面是UnitTest類的實(shí)現(xiàn):

UnitTest*?UnitTest::GetInstance()
{
????
static?UnitTest?instance;
????
return?&instance;
}

TestCase
*?UnitTest::RegisterTestCase(TestCase*?testcase)
{
????testcases_.push_back(testcase);
????
return?testcase;
}

int?UnitTest::Run()
{
????nTestResult?
=?1;
????
for?(std::vector<TestCase*>::iterator?it?=?testcases_.begin();
????????it?
!=?testcases_.end();?++it)
????{
????????TestCase
*?testcase?=?*it;
????????CurrentTestCase?
=?testcase;
????????std::cout?
<<?green?<<?"======================================"?<<?std::endl;
????????std::cout?
<<?green?<<?"Run?TestCase:"?<<?testcase->testcase_name?<<?std::endl;
????????testcase
->Run();
????????std::cout?
<<?green?<<?"End?TestCase:"?<<?testcase->testcase_name?<<?std::endl;
????????
if?(testcase->nTestResult)
????????{
????????????nPassed
++;
????????}
????????
else
????????{
????????????nFailed
++;
????????????nTestResult?
=?0;
????????}
????}

????std::cout?
<<?green?<<?"======================================"?<<?std::endl;
????std::cout?
<<?green?<<?"Total?TestCase?:?"?<<?nPassed?+?nFailed?<<?std::endl;
????std::cout?
<<?green?<<?"Passed?:?"?<<?nPassed?<<?std::endl;
????std::cout?
<<?red?<<?"Failed?:?"?<<?nFailed?<<?std::endl;
????
return?nTestResult;
}

五、NTEST宏

接下來定一個(gè)宏NTEST,方便我們寫我們的測試案例的類。

#define?TESTCASE_NAME(testcase_name)?\
????testcase_name##_TEST

#define?NANCY_TEST_(testcase_name)?\
class?TESTCASE_NAME(testcase_name)?:?public?TestCase?\
{?\
public:?\
????TESTCASE_NAME(testcase_name)(
const?char*?case_name)?:?TestCase(case_name){};?\
????
virtual?void?Run();?\
private:?\
????
static?TestCase*?const?testcase_;?\
};?\
\
TestCase
*?const?TESTCASE_NAME(testcase_name)?\
????::testcase_?
=?UnitTest::GetInstance()->RegisterTestCase(?\
????????
new?TESTCASE_NAME(testcase_name)(#testcase_name));?\
void?TESTCASE_NAME(testcase_name)::Run()

#define?NTEST(testcase_name)?\
????NANCY_TEST_(testcase_name)

?

六、RUN_ALL_TEST宏

然后是執(zhí)行所有測試案例的一個(gè)宏:

#define?RUN_ALL_TESTS()?\
????UnitTest::GetInstance()
->Run();

七、斷言的宏EXPECT_EQ?

這里,我只寫一個(gè)簡單的EXPECT_EQ :

#define?EXPECT_EQ(m,?n)?\
????
if?(m?!=?n)?\
????{?\
????????UnitTest::GetInstance()
->CurrentTestCase->nTestResult?=?0;?\
????????std::cout?
<<?red?<<?"Failed"?<<?std::endl;?\
????????std::cout?
<<?red?<<?"Expect:"?<<?m?<<?std::endl;?\
????????std::cout?
<<?red?<<?"Actual:"?<<?n?<<?std::endl;?\
????}

?

八、案例Demo

夠簡單吧,再來看看案例怎么寫:

#include?"nancytest.h"

int?Foo(int?a,?int?b)
{
????
return?a?+?b;
}

NTEST(FooTest_PassDemo)
{
????EXPECT_EQ(
3,?Foo(1,?2));
????EXPECT_EQ(
2,?Foo(1,?1));
}

NTEST(FooTest_FailDemo)
{
????EXPECT_EQ(
4,?Foo(1,?2));
????EXPECT_EQ(
2,?Foo(1,?2));
}

int?_tmain(int?argc,?_TCHAR*?argv[])
{
????
return?RUN_ALL_TESTS();
}


整個(gè)一山寨版gtest,呵。執(zhí)行一下,看看結(jié)果怎么樣:

?

九、總結(jié)?

本篇介紹性的文字比較少,主要是我們?cè)谏弦黄钊虢馕鰃test時(shí)已經(jīng)將整個(gè)流程弄清楚了,而現(xiàn)在編寫的nancytest又是其非常的精簡版本,所有直接看代碼就可以完全理解。希望通過這個(gè)Demo,能夠讓大家對(duì)gtest有更加直觀的了解。回到開篇時(shí)所說的,我們沒有必要每個(gè)人都造一個(gè)輪子,因?yàn)間test已經(jīng)非常出色的為我們做好了這一切。如果我們每個(gè)人都寫一個(gè)自己的框架的話,一方面我們要付出大量的維護(hù)成本,一方面,這個(gè)框架也許只能對(duì)你有用,無法讓大家從中受益。
gtest正是這么一個(gè)優(yōu)秀C++單元測試框架,它完全開源,允許我們一起為其貢獻(xiàn)力量,并能讓更多人從中受益。如果你在使用gtest過程中發(fā)現(xiàn)gtest不能滿足你的需求時(shí)(或發(fā)現(xiàn)BUG),gtest的開發(fā)人員非常急切的想知道他們哪來沒做好,或者是gtest其實(shí)有這個(gè)功能,但是很多用戶都不知道。所以你可以直接聯(lián)系gtest的開發(fā)人員,或者你直接在這里回帖,我會(huì)將您的意見轉(zhuǎn)告給gtest的主要開發(fā)人員。
如果你是gtest的超級(jí)粉絲,原意為gtest貢獻(xiàn)代碼的話,加入他們吧。   

本Demo代碼下載:/Files/coderzh/Code/nancytest.rar?

本篇是該系列最后一篇,其實(shí)gtest還有更多東西值得我們?nèi)ヌ剿?#xff0c;本系列也不可能將gtest介紹完全,還是那句話,想了解更多gtest相關(guān)的內(nèi)容的話:

訪問官方主頁:http://code.google.com/p/googletest/

下載gtest源碼:?http://code.google.com/p/googletest/downloads/list

總結(jié)

以上是生活随笔為你收集整理的玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 操久久久 | 久久精品aⅴ无码中文字字幕重口 | www.五月激情 | 五月天色综合 | 欧美日韩高清一区二区 国产亚洲免费看 | 久久综合中文 | 精品久久久中文字幕 | 日韩免费片 | 亚洲精品字幕 | 蜜桃做爰免费网站 | 一级免费观看视频 | 亚洲天堂免费在线观看视频 | 91免费. | 黄色一级大片在线观看 | 婷婷在线综合 | 国产传媒国产传媒 | 日韩av网址大全 | 婷婷丁香激情 | 成人精品免费看 | www黄色大片 | 国产1区2区 | 日本一二三不卡 | 亚洲精品wwww| 涩涩视频在线观看 | 青青草原亚洲 | 亚洲m码 欧洲s码sss222 | 黄色片99 | 国产做爰高潮呻吟视频 | 僵尸叔叔在线观看国语高清免费观看 | 永久免费未网 | 风韵少妇性饥渴推油按摩视频 | 吻胸摸激情床激烈视频 | 夜夜夜久久久 | 性做久久久久久久久久 | 久久偷看各类女兵18女厕嘘嘘 | 依人成人网 | 国产经典三级 | 肉丝袜脚交视频一区二区 | 亚洲免费av电影 | 91国产免费观看 | 日本乱子伦xxxx | 岛国二区 | 黄色片a级片 | 久久久久人妻精品一区二区三区 | 国产67194| 亚洲男男网站 | 黄色小视频在线看 | 国产91在线免费观看 | 亚洲字幕成人中文在线观看 | 亚洲视频一区二区三区四区 | 91黄瓜| 九九热在线视频 | 污视频在线免费 | 日本国产一区二区三区 | 青草视频在线免费观看 | 视频二区 | 日韩av在线播放一区 | 欧美成人做爰大片免费看黄石 | 新婚之夜玷污岳丰满少妇在线观看 | 麻豆一区二区三区在线观看 | 日本精品视频一区二区 | 在线视频成人 | 欧美性爱精品在线 | 欧美一级片在线 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 久久一区二区三区四区 | 老色驴综合网 | 欧美综合视频在线 | 怡红院精品视频 | 中文字幕乱码人妻无码久久95 | 亚洲一区二区电影 | 国产片黄色 | 国产精品福利一区二区 | 国产精品久久AV无码 | 韩国午夜影院 | 在线观看中文字幕亚洲 | 碰碰久久 | 亚洲天堂小视频 | 99色99| 韩国黄色片网站 | 在线久| 午夜精品福利一区二区蜜股av | 亚洲欧美日韩图片 | 久久视频一区二区三区 | 国产一级做a爰片久久毛片男 | 看黄色一级 | 理论片高清免费理伦片 | 日韩特黄毛片 | 亚洲小视频网站 | 韩国三级在线 | 国产一级片网站 | 91亚洲在线 | 精品毛片 | 国产精品短视频 | 翔田千里x88aⅴ | 欧美淫视频 | 粉嫩av网站 | 男女插孔视频 | 成人免费视频一区二区三区 |