普通函数如何单元测试
普通函数在该 C&C++ 单元测试场景案例系列 系列中, 指的是普通的全局函数, 既没有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]
进行一些通用测试准备工作, 后续的文章都是在测试套件基础上进行的, 下面我们来将上述普通函数的测试用例进行改造为套件形式.
- 首先定义一个继承自
testing:Test
的类
class FindSemicolonWithSuiteTest : public testing::Test {
protected:
};
- 复写该类的两个函数
SetUp
和TearDown
,用于准备我们单元测试用例的准备数据及单元测试完后的数据清理工作:
由其名字见名知义,SetUp
就是用来准备单元测试用例数据的, 而TearDown
则是用于单元测试运行后的数据清理.
class FindSemicolonWithSuiteTest : public testing::Test {
protected:
**void SetUp() override {
}
void TearDown() override {
}**
};
- 定义测试用例必要的数据, 并将其在
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;**
};
- 使用
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
函数会在每个测试用例运行完后执行一次
对应的示例源码,请点击 Normal
也可扫码关注博主同名公众号”不解之榬“,回复 ”普通函数“ 获取