代码很简单:
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类。
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(); } |
InitGoogleTest会解析参数。RUN_ALL_TESTS会把整个工程里的TEST和TEST_F这些函数全部作为测试用例执行一遍。
执行时,假设我们编译出的可执行文件叫unittest,那么直接执行./unittest就会输出结果到屏幕,例如:
[==========] Running 4 tests from 1 test case. [----------] Global test environment set-up. [----------] 4 tests from CHashTableTest [ RUN ] CHashTableTest.hashfunc [ OK ] CHashTableTest.hashfunc (0 ms) [ RUN ] CHashTableTest.addget [ OK ] CHashTableTest.addget (0 ms) [ RUN ] CHashTableTest.add2get testCHashTable.cpp:79: Failure Value of: getHe->m_pNext==NULL Actual: true Expected: false [ FAILED ] CHashTableTest.add2get (1 ms) [ RUN ] CHashTableTest.delget [ OK ] CHashTableTest.delget (0 ms) [----------] 4 tests from CHashTableTest (1 ms total)
[----------] Global test environment tear-down [==========] 4 tests from 1 test case ran. (1 ms total) [ PASSED ] 3 tests. [ FAILED ] 1 test, listed below: [ FAILED ] CHashTableTest.add2get |
可以看到,对于错误的CASE,会标出所在文件及其行数。