用googletest寫單元測試

原文鏈接:https://cloud.tencent.com/developer/article/1449409

reference:https://cloud.tencent.com/developer/article/1449409

對於稍微複雜些的測試用例,例如需要共享數據:

class CHashTableTest : public ::testing::Test {  
protected:  
    CHashTableTest():ht(100){  
  
    }  
    virtual void SetUp() {  
        key1 = "testkey1";  
        key2 = "testkey2";  
    }  
  
    // virtual void TearDown() {}  
    CHashTable ht;  
  
    string key1;  
    string key2;  
};  

然後開始寫測試用例,用例裏可以直接使用上面類中的成員:

TEST_F(CHashTableTest, hashfunc)  
{  
    CHashElement he;  
  
    ASSERT_NE(\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\  
            ht.getHashKey((char*)key2.c_str(), key2.size(), 0));  
  
    ASSERT_NE(\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 1));  
  
    ASSERT_EQ(\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 0));  
}  
TEST_F(CHashTableTest, hashfuncOther)  
{  
    CHashElement he;  
  
    ASSERT_NE(\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\  
            ht.getHashKey((char*)key2.c_str(), key2.size(), 0));  
  
    ASSERT_NE(\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 1));  
  
    ASSERT_EQ(\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\  
            ht.getHashKey((char*)key1.c_str(), key1.size(), 0));  
}  

注意,TEST_F宏會直接生成一個類,這個類繼承自上面我們寫的CHashTableTest類。

gtest提供ASSERT_和EXPECT_系列的宏,用於判斷二進制、字符串等對象是否相等、真假等等。這兩種宏的區別是,ASSERT_失敗了不會往下執行,而EXPECT_會繼續。

3、如何執行單元測試

首先,我們自己要有一個main函數,函數內容非常簡單:

#include "gtest/gtest.h"  
  
int main(int argc, char** argv) {  
    testing::InitGoogleTest(&argc, argv);  
  
    // Runs all tests using Google Test.  
    return RUN_ALL_TESTS();  
}  

4、google test內部是如何執行我們的單元測試用例的

首先從main函數看起。

我們的main函數執行了RUN_ALL_TESTS宏,這個宏幹了些什麼事呢?

#define RUN_ALL_TESTS()\  
  (::testing::UnitTest::GetInstance()->Run())  
  
}  // namespace testing  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章