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_ *系列在出错的情况下,当前测试特例中剩下的流程就不走了。

    这下基本可以满足我目前的需要了,后续如果有更深层次的学习需要,有心得回来再更吧。

linux下使用gtest框架进行c/c++单元测试的更多相关文章

  1. Linux下USB驱动框架分析【转】

    转自:http://blog.csdn.net/brucexu1978/article/details/17583407 版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.c ...

  2. Linux 下安装Python框架django建立与mysql的连接

    0.基本环境说明: a. Ubuntu 14.04 64bit b. python 2.7.6 c. django 1.8 d. django-registration e. django-widge ...

  3. 【转】基于Linux下的TCP编程

    http://blog.csdn.net/tigerjibo/article/details/6775534 一.Linux下TCP编程框架 TCP网络编程的流程包含服务器和客户端两种模式.服务器模式 ...

  4. 基于Linux下的UDP编程

    一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: Ø  建立套接字 Ø  将套接字地址结构进行绑定 Ø  读写数据 Ø  关闭套接字 2 ...

  5. linux下Python网络编程框架-Twisted安装

    Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...

  6. linux下ejabberd框架搭建

    ejabberd为erlang的IM的开源框架,一直想找个时间研究研究: 1.下载Ejabberd安装包 wget http://www.process-one.net/downloads/ejabb ...

  7. Windows和Linux下scrapy框架的安装

    windows下安装: 1.安装Anaconda环境管理工具 也可以使用pip安装,值得注意的是如果你使用的是pip安装,你需要解决相应的包依赖(解决依赖一般会让你怀疑人生.怀疑scrapy,建议还是 ...

  8. Linux下搭建Jmeter+Ant+Jenkins自动化测试框架

    前言 在之前的文章中,我们学习了通过Ant调用Jmeter脚本生成HTML测试报告,但未实现自动执行脚本生成报告,同时生成的报告是在Linux下,查看报告很不方便.因此,我们将结合Jenkins来进一 ...

  9. Linux下服务器端开发流程及相关工具介绍(C++)

    去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...

随机推荐

  1. {Notes}{LaTeX}{enumerate}

    \usepackage{enumerate} \begin{enumerate}{(1)} \setcounter{enumi}{2} % begin with 2 \item first \item ...

  2. Gridview实现突出显示某一单元格的方法

    GridView突出显示某一单元格(例如金额低于多少,分数不及格等) 效果图: 解决方案:主要是绑定后过滤 GridView1.DataBind();        for (int i = 0; i ...

  3. oracle数据库存储过程分页

    CREATE OR REPLACE PROCEDURE prc_query (p_tableName in varchar2, --表名 p_columnNames in varchar2, --字段 ...

  4. vs2013环境下boost配置

    编译boost库的过程这里暂时不写.  先写在vs2013下的boost配置. 新建一个工程, 1, 属性->C/C++,在附加包含目录添加或编辑Boost的文件路径, D:\boost_1_5 ...

  5. mysql系列:加深对脏读、脏写、可重复读、幻读的理解

    关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教. 事务有四种基本特性,叫ACID,它们分别是: Atomicity-原子性,Con ...

  6. python调用rpc实现分布式系统

    rpc 一般俗称,远程过程调用,把本地的函数,放到远端去调用. 通常我们调用一个方法,譬如: sumadd(10, 20),sumadd方法的具体实现要么是用户自己定义,要么存在于该语言的库函数中,也 ...

  7. NanoPiM1开箱测试

    等了快一周了,终于那M1与那外壳一起给我寄过来了. 上午收到,开箱图就不亮了,来一上好电的图! 一同购买来的MSD卡里什么也没有,上电测试时只看到绿色的灯微微亮(这是一个BUG吗!!!!哈哈). 所以 ...

  8. 关于alter database open resetlogs及incarnation的一点理解

    关于alter database open resetlogs及incarnation的一点理解 不完全恢复只能做一次吗? 采用rman的默认设置,对数据库进行了backup database备份,进 ...

  9. oracle监听动态注册与静态注册

    client端如果想要连接到远程的数据库服务器,首先数据库服务器必须启动监听器 oracle监听器的配置在$ORACLE_HOME/network/admin/listener.ora,打开这个文件, ...

  10. Entity Framework API介绍 -- DbSet<>().Find()

    过去我们常常使用Where或First(FirstOrDefault)方法来查找对应的实体,比如: var query = context.CertInfoMakeDetails.ToList().W ...