前段時間學習和了解了下Google的開源C++單元測試框架Google Test,簡稱gtest,非常的不錯。 我們原來使用的是自己實現的一套單元測試框架,在使用過程中,發現越來越多使用不便之處,而這樣不便之處,gtest恰恰很好的解決了。
其實gtest本身的實現並不復雜,我們完全可以模仿gtest,不斷的完善我們的測試框架, 但最后我們還是決定使用gtest取代掉原來的自己的測試框架,原因是:
1.不斷完善我們的測試框架之后就會發覺相當於把gtest重新做了一遍,雖然輪子造的很爽,但是不是必要的。
2.使用gtest可以免去維護測試框架的麻煩,讓我們有更多精力投入到案例設計上。
3.gtest提高了非常完善的功能,並且簡單易用,極大的提高了編寫測試案例的效率。
斷言(Assertion)
關於斷言(ASSERT_X宏)與預期結果(EXPECT_X)的區別,谷歌官方給出了很好的解釋:
- ASSERT_ * versions generate fatal failures when they fail, and abort the current function.
- EXPECT_ * versions generate nonfatal failures, which don’t abort the current function.
- Usually EXPECT_* are preferred, as they allow more than one failures to be reported in a test. However, you should use ASSERT_* if it doesn’t make sense to continue when the assertion in question fails.
翻譯成中文,就是斷言未通過,斷言會中斷之后當前測試函數的測試代碼(因為之后的測試沒有任何意義),而普通的EXPECT會報告出這個錯誤,仍然會繼續執行代碼。
ASSERT_X宏列舉如下:
條件判斷:
ASSERT_TRUE(condition); //條件為真,則通過
ASSERT_FALSE(condition);//條件為假,則通過
值判斷:
ASSERT_EQ(val1,val2); //val1 == val2
ASSERT_NE(val1,val2); //val1 != val2
ASSERT_LT(val1,val2); //val1 < val2
ASSERT_LE(val1,val2); //val1 <= val2
ASSERT_GT(val1,val2); //val1 > val2
ASSERT_GE(val1,val2); //val1 >= val2
字符串判斷:
ASSERT_STREQ(str1,str2); //兩個char* 字符串有同樣的內容
ASSERT_STRNE(str1,str2);//兩個char* 字符串有不同的內容
ASSERT_STRCASEEQ(str1,str2); //兩個char* 字符串有同樣的內容,忽略大小寫
ASSERT_STRCASENE(str1,str2); //兩個char* 字符串有不同的內容,忽略大小寫
*STREQ* and *STRNE* also accept wide C strings (wchar_t*). If a comparison of two wide strings fails, their values will be printed as UTF-8 narrow strings.
A NULL pointer and an empty string are considered different.
預期結果(EXPECT)
只需將斷言(ASSERT)換成預期(EXPECT)即可,用法跟斷言完全一致。
例子:
EXPECT_STREQ(str1,str2) //兩個char* 字符串有同樣的內容
TEST()與TEST_F()的區別其實並不明顯,對於普通的(面向過程)函數測試(不為類的成員函數),直接用TEST即可。
TEST_F主要用於混合式測試(非面向過程)。對於類的測試,Google官方建議我們使用繼承於testing::Test這個類來實現我們自己的測試類。官方對於隊列的測試類如下:
class QueueTest : public ::testing::Test { protected: virtual void SetUp() { q1_.Enqueue(1); q2_.Enqueue(2); q2_.Enqueue(3); } // virtual void TearDown() {} Queue<int> q0_; Queue<int> q1_; Queue<int> q2_; };
下面為官方給出的測試代碼:
TEST_F(QueueTest, IsEmptyInitially) {
EXPECT_EQ(0, q0_.size()); } TEST_F(QueueTest, DequeueWorks) { int* n = q0_.Dequeue(); EXPECT_EQ(NULL, n); n = q1_.Dequeue(); ASSERT_TRUE(n != NULL); EXPECT_EQ(1, *n); EXPECT_EQ(0, q1_.size()); delete n; n = q2_.Dequeue(); ASSERT_TRUE(n != NULL); EXPECT_EQ(2, *n); EXPECT_EQ(1, q2_.size()); delete n; }
對於GoogleTest中提及的Invoke,我們可以認為,這個功能等同於開始全部的測試(因為其函數為RUN_ALL_TESTS()),但本函數只能調用一次,不可重復調用。返回值,0為全部成功,1為有沒有通過的測試。
google test框架與eclipse插件
1. https://github.com/google/googletest (google的測試框架)
2. eclipse測試框架插件
https://github.com/xgsa/cdt-tests-runner/wiki/Tutorial
其他參考:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
http://www.west999.com/info/html/chengxusheji/C-C--/20180617/4181652.html
