51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3799|回复: 0
打印 上一主题 下一主题

[讨论] linux下使用gtest框架进行c/c++单元测试

[复制链接]
  • TA的每日心情
    无聊
    2023-12-19 11:16
  • 签到天数: 40 天

    连续签到: 1 天

    [LV.5]测试团长

    跳转到指定楼层
    1#
    发表于 2018-3-7 16:35:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言

    google test(以下简称gtest)是谷歌的开源C++单元测试框架,用来做c/c++的单元测试比较方便。
    下面对于它在linux下的使用做简单的介绍,同时也作为自己的笔记。因为仅作示例,因此以下过程
    也比较简单。

    准备gtest框架

    在github网站下载gtest框架https://github.com/google/googletest

    解压后,进入googltetest目录。目录下有以下内容
    ├── build-aux
    ├── CHANGES
    ├── cmake
    ├── CMakeLists.txt
    ├── codegear
    ├── configure.ac
    ├── CONTRIBUTORS
    ├── docs
    ├── include
    ├── LICENSE
    ├── m4
    ├── make
    ├── Makefile.am
    ├── msvc
    ├── README.md
    ├── samples
    ├── scripts
    ├── src
    ├── test
    └── xcode

    现在我们需要将其编译成.o文件
    编译生成gtest.o文件:

    g++ -o gtest.o -I./include -I./  -c ./src/gtest-all.cc
    1
    再生成.a静态库文件:

    ar -rv libgtest.a gtest.o
    1
    生成的libgtest.a以及该目录include下的头文件都是我们后面测试需要的。

    新建测试项目

    新建项目目录,比如我创建了一个LeetcodeWithC目录。
    同时,在该目录下创建以下三个目录
    ├── gtest //存放gtest框架内容
    ├── leetcode //存放项目源代码
    ├── testcase //存放测试用例代码
    └── Makefile

    getest目录下有刚才所说的include头文件,lib文件。另外,我们还需要一个main函数文件。放在ge
    tst的main下
    1. /*TestAll.cpp*/
    2.     #include "gtest/gtest.h"
    3.     #include <iostream>
    4.     using namespace std;
    5.     int main(int argc,char* argv[])
    6.     {
    7.                 //testing::GTEST_FLAG(output) = "xml:"; //若要生成xml结果文件
    8.                 testing::InitGoogleTest(&argc,argv); //初始化
    9.                if( RUN_ALL_TESTS())                     //跑单元测试
    10.                 return 0;
    11.     }
    复制代码
    leetcode目录下新建src目录和include目录,分别用于存放头文件和.c文件
    我在include下放了两个头文件,common.h 和leetcode_functions.h
    内容分别如下:
    common.h
    1. #pragma once
    2.     #include<stdio.h>
    3.     #include<string.h>
    4.     #include<stdlib.h>

    5. leetcode_functions.h


    6.     #pragma once
    7.     //leetcode_functions.h
    8.     #ifndef _LEETCODE_FUNCTIONS_H
    9.     #define _LEETCODE_FUNCTIONS_H
    10.     #include"common.h"
    11.     int* twoSum(int* nums, int numsSize, int target);
    12.     #endif

    13. src目录下为项目的.c文件


    14.     /**
    15.     Given an array of integers, return indices of the two numbers such that they add up to a specific target.

    16.     You may assume that each input would have exactly one solution, and you may not use the same element twice.

    17.     Example:
    18.     Given nums = [2, 7, 11, 15], target = 9,

    19.     Because nums[0] + nums[1] = 2 + 7 = 9,
    20.     return [0, 1].
    21.       Note: The returned array must be malloced, assume caller calls free().
    22.      *
    23.      */
    24.     #include"leetcode_functions.h"
    25.     int* twoSum(int* nums, int numsSize, int target) {
    26.         int loop = 0;
    27.         int inloop = 0;
    28.         int* result = NULL;
    29.         result =(int*) malloc(2*sizeof(int));
    30.         memset(result,0,2*sizeof(int));
    31.          printf("numsSize=%d\n",numsSize);
    32.         if(NULL == nums || numsSize==0)
    33.         {
    34.             return result;
    35.         }
    36.         for(loop = 0;loop < numsSize;loop++)
    37.         {
    38.             for(inloop = loop+1;inloop < numsSize;inloop++)
    39.             {
    40.                 if(*(nums+loop)+*(nums+inloop) == target)
    41.                 {
    42.                     if(NULL != result)
    43.                     {

    44.                         *result = loop;
    45.                         *(result+1) = inloop;
    46.                     }
    47.                     return result;
    48.                 }
    49.             }
    50.         }
    51.         return result;
    52.     }
    复制代码
    testcase下新建include和src目录
    src目录下有测试用例文件leetcode_test.cpp
    1.   //leetcode_test.cpp
    2.     #include "gtest/gtest.h"
    3.     #include "leetcode_functions.h"

    4.     TEST(two_sum_test,twoSum001)
    5.     {
    6.         int nums[4]={2,7,11,15};
    7.         int target = 9;
    8.         int numsSize = 4;
    9.         int* result = twoSum(nums,numsSize,target);

    10.            ASSERT_EQ(0,*result);
    11.            ASSERT_EQ(1,*(result+1));
    12.     }
    复制代码
    编译链接

    测试之前,需要编译并链接我们得项目代码和测试框架。
    编译
    1. g++ -o 001_two_sum.o -c ./leetcode/src/001_Two_Sum.c  -I ./leetcode/include/

    2.     g++ -o leetcode_test.o -c ./testcase/src/leetcode_test.cpp -I ./ -I ./leetcode/include/

    3.     g++ -o TestAll.o -c ./gtest/main/TestAll.cpp -I ./

    4. 链接


    5.     g++ -o main *.o -I./include -L./gtest/lib -lgtest -lpthread

    6. 最后生成main文件。
    复制代码
    运行测试

    运行生成的可执行文件main


            ./main
    1
    2
    3
    运行结果如下:

    [==========] Running 1 test from 1 test case.
    [———-] Global test environment set-up.
    [———-] 1 test from two_sum_test
    [ RUN ] two_sum_test.twoSum001
    numsSize=4
    [ OK ] two_sum_test.twoSum001 (0 ms)
    [———-] 1 test from two_sum_test (0 ms total)

    [———-] Global test environment tear-down
    [==========] 1 test from 1 test case ran. (0 ms total)
    [ PASSED ] 1 test.

    可以看到,共有一个用例,通过了一个用例

    项目代码可以在https://github.com/yanbinghu/LeetCodeWithC下载,由于更新,可能与文章中的
    项目内容已经不一致了。

    总结

    使用gtest框架进行单元测试还是比较方便的,有很多可用的测试方法,具体可以查看官网文档,
    另外它还有打桩功能,对于其他一些复杂的测试也是可以胜任的。

    如果觉得测试结果不直观,还可以结合gcov进行代码覆盖率的测试,从测试报告中可以很清晰的
    看到用例跑到了哪些代码。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-19 20:10 , Processed in 0.066988 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表