普通函数在该 [gtest场景案例] 系列中,指的是普通的全局函数,既没有public等权限关键字,也没有static/const等关键字.
例如,存在一个普通的查找字符串中第一个分号所在索引的函数如下:
int findFirstSemicolon(char* buff, int len)
{
int ret = -1;
if (buff == NULL || len <= 0)
{
return ret;
}
for (int i = 0; i < len; i++)
{
if (';' == buff[i])
{
ret = i;
break;
}
}
return ret;
}
那么其可以使用最普通也是最通用的gtest的TEST宏TEST(testsuitename, testname):
TEST(fidFirstSemicolonTest, Found) {
char buff[LEN] = "xxxxxx;xx;xxx";
EXPECT_EQ(findFirstSemicolon(buff, sizeof(buff)), 6);
}
TEST(fidFirstSemicolonTest, NotFound) {
char buff[LEN] = "xxxxxxx";
EXPECT_EQ(findFirstSemicolon(buff, sizeof(buff)), -1);
}
TEST(fidFirstSemicolonTest, DataIsNull) {
char* buff = NULL;
EXPECT_EQ(findFirstSemicolon(buff, sizeof(buff)), -1);
}
TEST(fidFirstSemicolonTest, LenLessthan0) {
char buff[LEN] = "xxxxxx;xxxxx";
EXPECT_EQ(findFirstSemicolon(buff, 0), -1);
}
即可正常开展单元测试;
当然, 如果函数更大或者测试的准备数据, 内容更多, 那么可以使用测试套件[testsuite]进行一些通用测试准备工作, 后续的文章都是在测试套件基础上进行的,下面我们来将上述普通函数的测试用例进行改造为套件形式.
1. 首先定义一个继承自testing:Test的类
class FindSemicolonWithSuiteTest : public testing::Test {
protected:
};
2. 复写该类的两个函数SetUp和TearDown,用于准备我们单元测试用例的准备数据及单元测试完后的数据清理工作:
由其名字见名知义,SetUp就是用来准备单元测试用例数据的, 而TearDown则是用于单元测试运行后的数据清理
class FindSemicolonWithSuiteTest : public testing::Test {
protected:
void SetUp() override {
}
void TearDown() override {
}
};
3. 定义测试用例必要的数据, 并将其在SetUp和TearDown中进行相应的处理:
class FindSemicolonWithSuiteTest : public testing::Test {
protected:
void SetUp() override {
memcpy(buff, "xxxxxx;xx;xxx", sizeof("xxxxxx;xx;xxx"));
pbuff = NULL;
}
void TearDown() override {
memset(buff, 0, sizeof(buff));
}
char buff[64];
char* pbuff;
};
4. 使用TEST_F宏进行测试用例的定义TEST_F(testsuitename, testname):
TEST_F(FindSemicolonWithSuiteTest, Found) {
EXPECT_EQ(findFirstSemicolon(buff, sizeof(buff)), 6);
}
TEST_F(FindSemicolonWithSuiteTest, NotFound) {
memcpy(buff, "xxxxxxnxxnxxx", sizeof("xxxxxxnxxnxxx"));
EXPECT_EQ(findFirstSemicolon(buff, sizeof(buff)), -1);
}
TEST_F(FindSemicolonWithSuiteTest, DataIsNull) {
EXPECT_EQ(findFirstSemicolon(pbuff, sizeof(pbuff)), -1);
}
TEST_F(FindSemicolonWithSuiteTest, LenLessthan0) {
EXPECT_EQ(findFirstSemicolon(buff, 0), -1);
}
可以见到, 使用测试套件对应的TEST_F宏后, 之前每个单元测试中需要定义的 char buff[64] 不再需要, 但是测试用例依然成功运行, 那是因为我们在测试套件的SetUp函数内对buff进行了初始化.
SetUp函数会在每个测试用例开始前执行一次, 而TearDown函数会在每个测试用例运行完后执行一次
对应的demo源码,请点击Normal