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++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
随机推荐
- 一款直接时空处理分析的开源数据库---geomesa
一款直接时空处理分析的开源数据库---geomesa,可用于交通轨迹数据存储分析等相关领域, 在分布式列数据库的基础上进行扩展,目前支持Accumulo, HBase, Cassandra, and ...
- Junit+ant+JaCoCo集成使用
接上文,本文主要介绍Junit+ant+JaCoCo集成使用 1.工具的下载上传 需要的工具有: apache-ant-1.10.5-bin.tarapache-tomcat-8.0.50.tarja ...
- open和close函数
1.open函数的使用 调用open函数可以打开或创建一个文件 #include <sys/stat.h> #include <fcntl.h> #include <sy ...
- angular指令,异步调用数据,监控数据的变化(自定义一个表头的指令)
angular框架中提供了很多有效的指令,指令的目的就是为了提高代码的复用率,提高工作效率. 下面我们自己来定义一个指令: 一点建议:写指令名字的时候,尽量不要用用大写,下划线等,否则会有很大的坑等着 ...
- WebApi FormData+文件长传 异步+同步实现
// POST api/values public async Task Post() { try { // 检查该请求是否含有multipart/form-data if (!Request.Con ...
- Juicer自定义函数
首先,先写自定义的方法: function (sex) { ; ; var Range = Max - Min; var Rand = Math.random(); var res = (Min + ...
- java代码--------随机输出100个随机数,要求每行10个数
总结:不敢爱你么开口 package com.sads; ///实现随机输出100个数字,数字是0到9之间,每行输出10个 public class Wss { public static void ...
- scrapy_redis 实现多进程配置部分代码
# 启用Redis调度存储请求队列SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 确保所有的爬虫通过Redis去重DUPEFILTE ...
- Linux上面缺少rz和sz命令
一.centos系统没有自带rz/sz命令 yum install lrzsz 搞定! 二.对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / ...
- py基础2--列表,元祖,字典,集合,文件
本节内容 列表.元祖操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 三元运算&生成式&成员运算&解压法&队列堆栈&数据类型转换 1. 列表操作 ...