GoogleTest单元测试框架总结之类测试和Test Fixture
类的测试我们先从一个简单的计数器开始。
示例一
头文件Counter.h仅定义功能,不进行具体实现:增加计数 Increment()、减少计数Decrement()、打印。
class Counter
{
private:
int counter_;
public:
// Creates a counter that starts at 0.
Counter() : counter_(0) {}
// Returns the current counter value, and increments it.
int Increment();
// Returns the current counter value, and decrements it.
int Decrement();
// Prints the current counter value to STDOUT.
void Print() const;
}; 配套的cpp文件,负责成员函数的具体实现。
#include "Counter.h"
// Returns the current counter value, and increments it.
int Counter::Increment()
{
return counter_++;
}
// Returns the current counter value, and decrements it.
// counter can not be less than 0, return 0 in this case
int Counter::Decrement()
{
if (counter_ == 0) {
return counter_;
}
else {
return counter_--;
}
}
// Prints the current counter value.
void Counter::Print() const {
cout << counter_;
} 单元测试用例
先实例化对象,然后对类的成员函数进行测试。
TEST(CounterTest, Increment)
{
Counter c;
// Test that counter 0 returns 0
EXPECT_EQ(0, c.Decrement());
EXPECT_EQ(0, c.Increment());
EXPECT_EQ(1, c.Increment());
EXPECT_EQ(2, c.Increment());
EXPECT_EQ(3, c.Decrement());
}用例执行结果如下:
示例二
接下来的示例复杂一些。
sample02由三个部分组成:sample02.h、 sample02.cpp、sample02UnitTest.cpp。
sample02.h定义了一个string类MyString,阅读代码时,重点关注各成员的逻辑关系、厘清功能点,为用例的代码覆盖做准备。
提炼的逻辑关系和功能点如下图所示:
sample02.h源码如下:
#include <string.h>
// A simple string class.
class MyString
{
private:
const char* c_string_; //声明一个字符指针常量 c_string_
const MyString& operator=(const MyString& rhs);
//赋值运算符重载函数
public:
// Clones a 0-terminated C string, allocating memory using new.//克隆一个以 \0 结尾的字符串,通过 new 申请内存空间
static const char* CloneCString(const char* a_c_string); //CloneCString() 函数将在 sample02.cpp中进行具体的实现
// The default c'tor constructs a NULL string.
MyString() : c_string_(nullptr) {} //构造函数,将 c_string_ 赋值为 空指针nullptr(相当于NULL。C++中推荐nullptr)
// Constructs a MyString by cloning a 0-terminated C string.
explicit MyString(const char* a_c_string) : c_string_(nullptr)
{ //构造函数,克隆一个以 \0 结尾的字符串
Set(a_c_string);
}
// Copy constructor Func.
MyString(const MyString &string) : c_string_(nullptr) //string是一个对象引用,用于初始化另一个对象
{ //拷贝构造函数
Set(string.c_string_);
}
//MyString is intended to be a final class, so the d'tor doesn't need to be virtual.
~MyString() { delete[] c_string_; }//析构函数 deconstructor Func.
// Gets the 0-terminated C string this MyString object represents.
const char* c_string() const { return c_string_; } // c_string()函数用于获取字符串 c_string_
// Length()函数用于返回字符串 c_string_的长度
size_t Length() const { return c_string_ == nullptr ? 0 : strlen(c_string_); }
//Sets the 0-terminated C string this MyString object represents.
void Set(const char* c_string); //set()函数将在 sample02.cpp中进行具体的实现
};sample02.cpp对成员函数CloneCString( )、Set( )进行了具体实现。
#include "sample02.h"
#include <string.h>
// Clones a 0-terminated C string, allocating memory using new.
const char* MyString::CloneCString(const char* a_c_string)
{
if (a_c_string == nullptr) return nullptr; //空指针的情况
const size_t len = strlen(a_c_string); //size_t类似于int
char* const clone = new char;
memcpy(clone, a_c_string, len + 1);
return clone;
}
// Sets the 0-terminated C string this MyString object represents.
void MyString::Set(const char* a_c_string)
{
// Makes sure this works when c_string == c_string_
const char* const temp = MyString::CloneCString(a_c_string);
delete[] c_string_; //执行内存释放
c_string_ = temp;
}单元测试用例
sample02UnitTest.cpp,各用例覆盖的成员函数如下图所示:
页:
[1]