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

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

前言

  • 关于此次开发工具的选择,因为我最近尝试在linux下使用vim进行c/c++编程,且之前已经对vim进行了相关的配置,所以这里应作业要求直接附上vim示例使用截图。

  • 单元测试( Unit Test ,模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确,通过编写单元测试可以在编码阶段发现程序编码错误,甚至是程序设计错误。针对c/c++单元测试有GTest和CUNIT两种主流框架,在这里我选择了使用GTest框架来进行单元测试。

GTest在linux下的安装与配置

  • 在github网站上下载gtest框架 地址

  • 对其解压后需要生成gtest的静态库来获得gtest-all.o文件和生成libgtest.a库:

    • g++ -o gtest.o -I./include -I./ -c ./src/gtest-all.cc
    • ar -rv libgtest.a gtest.o(二者都是需要在googletest目录下执行)
  • 新建一个目录GTestApp,用于存放之后编写的头文件和源代码,现在需要在此目录下新建lib目录,并将之前生成的libgtest.a文件复制到lib目录下,同时还需要将googletest目录下的include目录复制到GTestApp目录下


  • 完成以上步骤即完成了gtest框架的配置

实现单元测试

(1)编写简单函数实现加减乘除

#ifndef _FUNCTIONS_H
#define _FUNCTIONS_H

int add(int a,int b);
int myMinus(int a,int b);
int multiply(int a,int b);
int divide(int a,int b);

#endi

#include"functions.h"
    int add(int a,int b){
        return a+b;
    }
    int myMinus(int a,int b){
        return a-b;
    }
    int multiply(int a,int b){
        return a*b;
    }
    int divide(int a,int b){
        return a/b;
    }

(2)编写单元测试代码

  • 单元测试代码

#include "gtest/gtest.h"
#include "functions.h"

TEST(AddTest,AddTestCase){
    ASSERT_EQ(2,add(1,1));
}
TEST(MinusTest,MinusTestCase){
    ASSERT_EQ(10,myMinus(25,15));
}
TEST(MultiplyTest,MutilpTestCase){
    ASSERT_EQ(12,multiply(3,4));
}
TEST(DivideTest,DivideTestCase){
    ASSERT_EQ(2,divide(7,3));
}

  • 测试主函数
#include "gtest/gtest.h"
#include<iostream>
using namespace std;
int main(int argc,char* argv[])
{
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}

(3)编译和链接

$ g++ -o functions.o -c functions.cpp
$ g++ -o functionsTest.o -c functionsTest.cpp -I./include
$ g++ -o TestAll.o -c TestAll.cpp -I./include
$ g++ -o main *.o -I./include -L./lib -lgtest -lpthread  

(4)运行测试

$./main

(5)结果如下

后记心得

  • 在这次gtest的配置中遇到两个问题曾困扰我,在谢沛良同学和尉安瑞同学的帮助下顺利解决,在此感谢我的两位好友。
  • gtest的使用比较复杂,这次初步使用感觉不太顺手,在这篇文章中有进一步的讲解,其中makefile的编写我觉得可以提高效率,在此把文章贴在此处,以后方便继续学习。

更新

  • 话不多说先上图,重要的事情放前面

    今日有空就继续了解了下makefile的使用(上面提到的那篇),确实可以提高单元测试的效率,具体实现方法在这里就不再赘述了。有一个点是在配置过程中遇到一个问题,是vim下tab键被置换成了4个空格,所以平时写的tab是个假tab,而在makefile的文件编写中需要的是真正的一个tab,所以还需要再次对.vimrc进行一次小小修改,在此再贴出资料

    还学习到一个点,GTEST中断言都是成对出现的即分为两个系列:
    ASSERT_ *系列;
    EXPECT_ *系列;
    EXPECT_ *系列是比较常用的。在一个测试特例中,如果局部测试使用了EXPECT_ *系列函数,它将保证本次局部测试结果不会影响之后的流程。但是ASSERT_ *系列在出错的情况下,当前测试特例中剩下的流程就不走了。
    这下基本可以满足我目前的需要了,后续如果有更深层次的学习需要,有心得回来再更吧。

posted @ 2018-03-21 15:28  liililiu  阅读(2508)  评论(0编辑  收藏  举报