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_ *系列在出错的情况下,当前测试特例中剩下的流程就不走了。
这下基本可以满足我目前的需要了,后续如果有更深层次的学习需要,有心得回来再更吧。
linux下使用gtest框架进行c/c++单元测试的更多相关文章
- Linux下USB驱动框架分析【转】
转自:http://blog.csdn.net/brucexu1978/article/details/17583407 版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.c ...
- 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 ...
- 【转】基于Linux下的TCP编程
http://blog.csdn.net/tigerjibo/article/details/6775534 一.Linux下TCP编程框架 TCP网络编程的流程包含服务器和客户端两种模式.服务器模式 ...
- 基于Linux下的UDP编程
一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: Ø 建立套接字 Ø 将套接字地址结构进行绑定 Ø 读写数据 Ø 关闭套接字 2 ...
- linux下Python网络编程框架-Twisted安装
Twisted是python下的用来进行网络服务和应用程序编程的框架,安装Twisted前需要系统预先安装有python. 一.安装Twisted http://twistedmatrix.com/R ...
- linux下ejabberd框架搭建
ejabberd为erlang的IM的开源框架,一直想找个时间研究研究: 1.下载Ejabberd安装包 wget http://www.process-one.net/downloads/ejabb ...
- Windows和Linux下scrapy框架的安装
windows下安装: 1.安装Anaconda环境管理工具 也可以使用pip安装,值得注意的是如果你使用的是pip安装,你需要解决相应的包依赖(解决依赖一般会让你怀疑人生.怀疑scrapy,建议还是 ...
- Linux下搭建Jmeter+Ant+Jenkins自动化测试框架
前言 在之前的文章中,我们学习了通过Ant调用Jmeter脚本生成HTML测试报告,但未实现自动执行脚本生成报告,同时生成的报告是在Linux下,查看报告很不方便.因此,我们将结合Jenkins来进一 ...
- Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
随机推荐
- 【angularJS】启动(bootstrap)机制
Angular的启动分为手动和自动两种. 自动启动 定义模块的例子中,采用的就是自动的方式:通过内置的指令ngApp 来指定启动时加载的模块.<html ng-app="myApp&q ...
- 【spring源码学习】spring集成orm数据框架
[一]简易的数据源配置 (1)配置文件 <!--springJdbcTemplemate数据操作配置信息 --> <bean id="driver" class= ...
- c++ 中 毫秒级时间获取
#include <time.h> clock_t start,ends; start=clock(); Sleep(); ends=clock(); cout<<ends-s ...
- MySQL-Proxy 读写分离、同步延时问题解决方案
MySQL-Proxy 读写分离.同步延时问题解决方案 使用MySQL将读写请求转接到主从Server. 一 安装MySQL Proxy MySQL Proxy的二进制版非常方便,下载解压缩后即用. ...
- fabio 安装试用&&实际使用的几个问题
备注: 因为fabio 依赖consul vault (不是强需),启动之前需要先安装consul, 本次为了简单consul 使用的是单机,使用的是dev 模式 1. conusl ...
- postcss gulp 安装使用
备注: 测试使用的是gulp 进行的编译 1. 项目初始化 npm init mkdir src touch app.css body{ display: flex; } 2. 安装(gulp ...
- 使用 openresty 修改请求内容
1. 目的 动态修改 html 页面内容 2. 使用方式 openresty 在 header_filter 阶段 以及body_filter 阶段进行数据修改 3. 源码 此 ...
- new/delete和malloc/free区别
相同点: 都可用于申请动态内存和释放内存 不同点: 操作对象有所不同. 本质区别: malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符,对象在创建的同时要自动 ...
- input type=number 禁止输入字符“e”的办法
输入框input,的type设置为number,本想只输入数字,但是字符“e”却能通过, 首先科普一下, <body> <input onkeypress="getCode ...
- javascript系列学习----对象相关概念理解
1.构造函数(相对于面向对象编程语言里面的类) 2.对象实例(它是由构造函数构造出来的对象,使用到关键字 new) 3.this关键字(往往是指我们的对象本身) 下面我们来看一个实例: var Per ...