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++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
随机推荐
- python之wheel 包命名规则、abi 兼容和安装
一.windows安装python包,遇见的问题 1.python3以后的版本,安装python包,可以直接使用pip安装,但是安装时偶尔报错 2.安装python源码包,如何确定自己该安装哪个版本, ...
- timequest 中set input delay set output delay 的使用
set_input_delay/ set_output_delay TimeQuest出现以后,随之 set input delay 与 set output delay 也跟着出现,该约束命令用“外 ...
- matplotlib ----- 多子图, subplots
这一篇讲的比较详细. http://matplotlib.org/examples/pylab_examples/subplots_demo.html 官方文档给出的subplots用法, http: ...
- ffmpeg/ffplay 添加实时的时间水印 (转)
右上角添加时间水印 ffmpeg -i 0.ts -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:te ...
- TOMCATE8下面项目启动问题
1.将servlet-api.jar替换项目中的servlet-api2.4 2.<servlet> <servlet-name>dwr-invoker&l ...
- java的时间
先看例子: import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...
- Vmvare + Ubuntu 16.04环境搭建 + 相关软件安装配置笔记【深度学习】
前言 由于学习与工作的需要,加上之前配置好的vmmachines都损坏了,我就重新弄一个ubuntu虚拟机,配置一下环境,给自己留个记录 1.文件 2.配置过程 1.在Vmware中新建虚拟机,自定义 ...
- laravel里面的控制器笔记
看了下教程,总结了下,大概分两种 一般的controller restful的controller 单独绑定action的route为 Route::get('user/{id}', 'UserCon ...
- python 面向对象(其他相关)
python 面向对象(其他相关): (思维导图 ↑↑↑↑↑↑) 一.issubclass(obj,cls) 检查obj是否是类cls的对象 class Base(object): pass c ...
- laravel5中添加自定义函数
laravel里面我们很多朋友不知道把自定义函数放在哪儿.我们的应用里经常会有一些全局都可能会用的函数,我们应该怎么放置它会比较好呢?现在匀们为大家准备了laravel放置函数的规范. 1. 创建文件 ...