亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

Google開源C++單元測試框架gTest 8:編寫簡單的測試框架

2019-11-07 23:18:55
字體:
來源:轉載
供稿:網友

一、前言

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

二、整體設計

使用最精簡的設計,我們就用兩個類,夠簡單吧:

1. TestCase類包含單個測試案例的信息。 

2. UnitTest類

負責所有測試案例的執行,管理。

三、TestCase類

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

復制代碼class TestCase{public:    TestCase(const char* case_name) : testcase_name(case_name){}    // 執行測試案例的方法    virtual void Run() = 0;    int nTestResult; // 測試案例的執行結果     const char* testcase_name; // 測試案例名稱};復制代碼

 

四、UnitTest類

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

1. 整個進程空間保存一個UnitTest 的單例。

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

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

復制代碼class UnitTest{public:    // 獲取單例    static UnitTest* GetInstance();     // 注冊測試案例    TestCase* RegisterTestCase(TestCase* testcase);        // 執行單元測試    int Run();    TestCase* CurrentTestCase; // 記錄當前執行的測試案例    int nTestResult; // 總的執行結果    int nPassed; // 通過案例數    int nFailed; // 失敗案例數PRotected:    std::vector<TestCase*> testcases_; // 案例集合};復制代碼

下面是UnitTest類的實現:

復制代碼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宏

接下來定一個宏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宏

然后是執行所有測試案例的一個宏:

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

七、斷言的宏EXPECT_EQ 

這里,我只寫一個簡單的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();}復制代碼

整個一山寨版gtest,呵。執行一下,看看結果怎么樣:

 

九、總結 

本篇介紹性的文字比較少,主要是我們在上一篇深入解析gtest時已經將整個流程弄清楚了,而現在編寫的nancytest又是其非常的精簡版本,所有直接看代碼就可以完全理解。希望通過這個Demo,能夠讓大家對gtest有更加直觀的了解?;氐介_篇時所說的,我們沒有必要每個人都造一個輪子,因為gtest已經非常出色的為我們做好了這一切。如果我們每個人都寫一個自己的框架的話,一方面我們要付出大量的維護成本,一方面,這個框架也許只能對你有用,無法讓大家從中受益。gtest正是這么一個優秀C++單元測試框架,它完全開源,允許我們一起為其貢獻力量,并能讓更多人從中受益。如果你在使用gtest過程中發現gtest不能滿足你的需求時(或發現BUG),gtest的開發人員非常急切的想知道他們哪來沒做好,或者是gtest其實有這個功能,但是很多用戶都不知道。所以你可以直接聯系gtest的開發人員,或者你直接在這里回帖,我會將您的意見轉告給gtest的主要開發人員。如果你是gtest的超級粉絲,原意為gtest貢獻代碼的話,加入他們吧?!  ?/p>

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

本篇是該系列最后一篇,其實gtest還有更多東西值得我們去探索,本系列也不可能將gtest介紹完全,還是那句話,想了解更多gtest相關的內容的話:

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
韩国国内大量揄拍精品视频| 成人看片人aa| 91精品久久久久久久久不口人| 91中文字幕一区| 中文字幕亚洲欧美日韩在线不卡| 97成人在线视频| 亚洲aⅴ日韩av电影在线观看| 69**夜色精品国产69乱| 美女福利精品视频| 国产精品狼人色视频一区| 欧美色欧美亚洲高清在线视频| 5566成人精品视频免费| 久久免费福利视频| 国产成人在线精品| 97久久精品视频| 亚洲人成电影在线| 久久99精品视频一区97| 欧美电影免费观看| 亚洲精品美女网站| 日韩av有码在线| 在线免费观看羞羞视频一区二区| 国精产品一区一区三区有限在线| 欧美一级bbbbb性bbbb喷潮片| 欧美有码在线观看| 久久久国产精彩视频美女艺术照福利| 国产精品视频一区二区三区四| 另类天堂视频在线观看| 欧美有码在线观看| 亚洲深夜福利视频| 韩曰欧美视频免费观看| 欧美贵妇videos办公室| 最近免费中文字幕视频2019| 日本最新高清不卡中文字幕| 狠狠躁夜夜躁人人爽超碰91| 亚洲人成电影在线观看天堂色| 亚洲自拍高清视频网站| 国产精品欧美日韩久久| 国产一区二区三区在线播放免费观看| 欧美激情在线视频二区| 国产精品www色诱视频| 久久99久久99精品中文字幕| 久久久精品在线| 精品视频在线观看日韩| 亚洲欧洲中文天堂| 亚洲性夜色噜噜噜7777| 久久精品亚洲精品| 久久久久九九九九| 日韩电影大全免费观看2023年上| 久久露脸国产精品| 欧美精品亚州精品| 欧美成人免费观看| 国产小视频国产精品| 欧美黄色三级网站| 欧美日韩成人黄色| 一个人看的www久久| 亚洲一区二区久久久| 亚洲福利在线观看| 亚洲理论片在线观看| 国产日产欧美精品| 不卡av在线播放| 宅男66日本亚洲欧美视频| 最近的2019中文字幕免费一页| 亚洲iv一区二区三区| 久久理论片午夜琪琪电影网| 日韩av在线最新| 亚洲精品免费一区二区三区| 国产精品精品久久久久久| 91av在线影院| 欧美大片大片在线播放| 欧美在线观看日本一区| 欧美高清第一页| 色偷偷综合社区| 欧美日韩激情视频8区| 美女999久久久精品视频| 国产精品久久久av久久久| 日韩欧美aaa| 日韩欧美在线观看| 日韩中文字幕在线| 91精品国产九九九久久久亚洲| 不卡中文字幕av| 日日狠狠久久偷偷四色综合免费| 日韩精品高清在线观看| 精品成人乱色一区二区| 久久久噜噜噜久久中文字免| 国产亚洲一区二区在线| 在线观看日韩专区| 色悠悠久久88| 国产成人亚洲综合91| 精品国产一区二区三区久久久狼| 2019中文字幕全在线观看| 国产福利精品av综合导导航| 在线播放国产一区中文字幕剧情欧美| 国产剧情日韩欧美| 亚洲国产精品va在线看黑人动漫| 亚洲天堂免费观看| 日韩大陆欧美高清视频区| 国产视频一区在线| 久久久国产精品免费| 日韩成人av在线播放| 亚洲成人亚洲激情| 亚洲人午夜精品| 精品日本美女福利在线观看| 韩日精品中文字幕| 日韩欧美主播在线| 538国产精品视频一区二区| 久久久久久久久久国产| 久久综合伊人77777| 国产热re99久久6国产精品| 欧美在线视频网站| 国产精品自产拍在线观看| 亚洲精品动漫久久久久| 亚洲午夜精品久久久久久久久久久久| 国产成人精品久久二区二区| 韩国美女主播一区| 国产成人精品日本亚洲| 欧美午夜丰满在线18影院| 欧美成人精品在线观看| 亚洲精品久久久久久久久久久久| 久久久久久久久久亚洲| 欧美日韩国内自拍| 亚洲影院高清在线| 亚洲一区二区三区四区视频| 国产精品99久久久久久久久久久久| 亚洲国产欧美久久| 国产精品亚洲精品| 欧美一级电影在线| 亚洲国产精品视频在线观看| 91精品国产高清久久久久久| 91在线观看免费高清完整版在线观看| 色偷偷av一区二区三区| 91久久久久久久一区二区| 国产精品第3页| 成人久久一区二区三区| 2019国产精品自在线拍国产不卡| 日韩大片免费观看视频播放| 在线性视频日韩欧美| 日韩视频精品在线| 欧美肥婆姓交大片| 久久成人亚洲精品| 国产精品99久久久久久白浆小说| 2019中文字幕全在线观看| 黑人巨大精品欧美一区二区一视频| 国产精品永久免费| 国产玖玖精品视频| 成人免费视频在线观看超级碰| 国产精品中文在线| 国产精品电影一区| 国产这里只有精品| 亚洲国产女人aaa毛片在线| 亚洲欧美变态国产另类| 亚洲免费影视第一页| 欧美一区二区视频97| 永久555www成人免费| 亚洲aaa激情| 亚洲男人天堂古典| 日韩美女在线观看一区| 亚洲国产女人aaa毛片在线| 亚洲色图日韩av| 欧美在线视频免费播放| 国产精品日韩欧美| 欧美丰满少妇xxxxx做受| 亚洲美女喷白浆| 日韩经典中文字幕| 亚洲天堂男人天堂女人天堂|