独望枫

人在尘世间,有缘自相见,变化千千万,未开窍,已迷恋
posts - 45, comments - 0, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

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

那么其可以使用最普通也是最通用的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:

};
   
   2. 复写该类的两个函数SetUpTearDown,用于准备我们单元测试用例的准备数据及单元测试完后的数据清理工作:
       由其名字见名知义,SetUp就是用来准备单元测试用例数据的, TearDown则是用于单元测试运行后的数据清理
class FindSemicolonWithSuiteTest : public testing::Test {
protected:
    void SetUp() override {

    }
    void TearDown() override {

    }

};
   3. 定义测试用例必要的数据, 并将其在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;

};
   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


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理