普通函数如何单元测试

普通函数如何单元测试

普通函数在该 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;  
}

那么其可以使用最普通也是最通用的gtestTESTTEST(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:  
  
};
  1. 复写该类的两个函数SetUpTearDown,用于准备我们单元测试用例的准备数据及单元测试完后的数据清理工作:
    由其名字见名知义,SetUp就是用来准备单元测试用例数据的, 而TearDown则是用于单元测试运行后的数据清理.
class FindSemicolonWithSuiteTest : public testing::Test {  
protected:  
    **void SetUp() override {
  
    }  
    void TearDown() override {  
  
    }**  
};
  1. 定义测试用例必要的数据, 并将其在SetUpTearDown中进行相应的处理:
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;**  
};
  1. 使用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

也可扫码关注博主同名公众号”不解之榬“,回复 ”普通函数“ 获取
不解之榬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值