從Google開源RE2庫學習到的C++測試方案

來源:互聯網
上載者:User

最近因為科研需求,一直在研究Google的開源RE2庫(Regex識別庫),庫源碼體積龐大,用C++寫的,對於我這個以前專供Java的人來說真的是一件很痛苦的事,每天只能啃一點點。今天研究了下裡面用到的測試方法,感覺挺好的,拿來跟大家分享下!(哈~C++大牛勿噴)

對於我這個C++菜鳥中的菜鳥而言,平時寫幾個函數想要測試一般都是在main中一個一個的測試,因為沒用C++寫過項目,沒有N多方法所以在main中一個個測試也不費勁。但是對於一個項目而言,或多或少都有N多方法,如果在main中一個個測試的話,不僅效率低而且還容易出錯遺漏什麼的。那麼該怎麼進行測試呢?貌似現在有很多C++自動化測試的工具,反正我是一個沒用過,也沒法評價。我就說下Google在RE2庫裡是怎麼測試的吧。

先用一個超級簡單的例子來做講解:測試兩個方法getAsciiNum()和getNonAsciiNum(),分別求flow中ASCII碼字元的數目和非ASCII碼字元的數目。

第一步:寫個標頭檔,定義測試所用類和測試方法。

// test.h  #define TEST(x, y)   \    void x##y(void);   \    TestRegisterer r##x##y(x##y, # x "." # y);   \    void x##y(void)        void RegisterTest(void (*)(void), const char*);        class TestRegisterer {  public:      TestRegisterer(void (*fn)(void), const char *s) {          RegisterTest(fn, s);      }  };

解析:首先看定義的類TestRegisterer,有個構造方法,兩個參數:

1. 一個函數指標:void (*fn)(void),指向我們具體要編寫的測試方法名;

2. 一個字串:constchar *s,屬於該測試方法的描述資訊。

這個建構函式調用了另一個函數RegisterTest(),具體實現見下面。

然後看最上面定義的宏TEST(x, y),主要將其替換為TestRegisterer r##x##y(x##y, # x"." # y);其中x##y作為方法名,# x"." # y作為描述資訊。這裡可能有些和我一樣入門層級的人沒怎麼看懂這個宏,因為不知道前後加void x##y(void);這個是幹嘛用的?一開始我也沒想明白,因為不加的話就會報錯,後來通過gcc的-E選項啟用宏編譯,看了下編譯期間展開成啥模樣了。這裡以一個簡單的例子作為說明:假設x為test,y為flow,如果不加前後那個,那麼展開後為TestRegisterer rtestflow(testflow, "test.flow"); 這明顯是個函式宣告,有兩個參數,第二個是字串,那麼第一個是什嗎?編譯器會認為是個函數名(實際上也是的),但這個函數前面明顯未定義,就會報找不到此函式宣告的錯誤,所以就需要在之前加上void x##y(void);聲明函數,當然光聲明不實現在連結時同樣報錯,所以就需要在之後加上void x##y(void)進行具體實現了,注意這裡沒有逗號,也沒有具體實現的{},因為這隻是宏,Google的所有測試函數是這樣寫的:

TEST(x, y) {       ....      // 具體實現   }

那麼上面例子TEST(test, flow){ ...  // 具體實現 },整體展開後就是這樣:

void testflow(void);  TestRegisterer rtestflow(testflow, "test.flow");  void testflow(void) {       ....      // 具體實現   }

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。