用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  

 

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