gtest单元测试配置+vs 2015+OpenCppCoverage输出测试覆盖率 || cmake命令构建项目以及编译以及命令行测试

2023-05-16

目录

一、仅使用gtest+vs2015

1.下载和编译gtest

2.创建具体的项目 

 3.gtest自带十个例子

二、使用gtest+vs2015,并且输出测试覆盖率

1.使用vs 2015企业版

2.使用OpenCppCoverage +vs 2015(企业版,社区版都可以)

三、使用cmake生成项目,构建+gtest进行单元测试+使用命令行执行opencppcoverage输出测试覆盖率

1.基本的构建和介绍,请看下面这篇文章

2.构建引入gtest的项目

 3.使用opencppcoverage输出测试覆盖率

补充 

Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)


 

 

 

 

 

 

 

 

 

 

 


前言

首先,关于c++的单元测试的方法偏少(相比java)

其次,在windows环境下的部署方法更少

最后,如果还要输出测试覆盖率,搜索之后发现,几乎没有教程,有也是零星几句,也没有更详细的配置

因此,走过一遍之后打算记录一下过程,方便以后配置也方便有这方面需求的人的查看

声明,文章中涉及到的工具用的是vs2015 enterprise/community+gtest-release-1.7.0+Opencppcoverage+cmake

如何搭配使用见文章详情

一、仅使用gtest+vs2015

1.下载和编译gtest

  • 首先下载vs 2015,网上有社区版(免费)+企业版(收费/破解) 如果只需要vs+gtest,并且不使用cmake命令,而且不需要覆盖率用的话,社区版就够了,如果需求不满足前面的条件,就去下载企业版enterprise

我没放c盘,因为太大了,动不动就10g了

  • 接着下载gtest

https://github.com/google/googletest/tree/release-1.7.0

下载这个版本就够了,解压之后要进行编译

  • 对gtest.sln进行编译

Gtest源码下载之后,在vs中打开msvc文件夹的gtest.sln

打开之后有4个工程

然后重新编译,debug、release两个模式都要编译。编译后,在msvc/gtest/下有debug、release两个文件夹。

  msvc\gtest\Debug - Debug方案下的二进制文件:gtestd.lib、gtest_maind.lib(注意主文件名的d后缀)
  msvc\gtest\Release - Release方案下的二进制文件:gtest.lib、gtest_main.lib

说明   编译就是右键-生成/重新生成 

2.创建具体的项目 

创建具体的测试项目,以debug模式为例

  1. 在VS2015中,创建WIN32控制台应用
  2. 右击工程名,点击属性,配置工程属性; 展开配置属性——C/C++——常规,在附加包含目录中添加gtestinclude文件

比如:

D:\Test-my\googletest-release-1.7.0\googletest-release-1.7.0\include;

 

3.展开“C/C++——代码生成,在运行库中修改为多线程调试(/MTd)”

 

4.展开链接器——输入,在附加依赖项中添加第二步生成的gtestd.lib,附加上正确的路径;在这里有个小技巧,.lib是静态库文件,你可以把它们放到一个专门的lib文件夹下

比如

D:\Test-my\googletest-release-1.7.0\googletest-release-1.7.0\lib\gtestd.lib;

 5.测试实例

  • 头文件

 

  • 源文件

  • 测试文件

  •  结果

 

说明,具体语法的断言写法,网上到处都有。主要是配置过程很容易出错。

如果没有main函数,会调用gtest_main.cc ,配置好gtest_maind.lib

https://www.cnblogs.com/qinwanlin/p/6574573.html

 3.gtest自带十个例子

但是需要编译,因为他没有lsn文件是不能打开执行的

但是这个网上有教程,我就不赘述了

附上链接

 

https://www.cnblogs.com/duxiuxing/p/4272343.html              如何编译gtest自带的十个samples例子,当然不能放在同一个项目里,有些可以放在一个项目里有些不能。我编译的时候分成了两个或者三个项目,一个是自带main函数不需要配置gtest_main,一个是没有main函数,需要配置,放在一起回出错。

并且要注意引入的头文件。

 

 

https://blog.csdn.net/yansmile1/article/details/70256911  gtest的samples的解释说明

 

二、使用gtest+vs2015,并且输出测试覆盖率

1.使用vs 2015企业版

因为企业版功能是比较完善的

所以如果下载的是企业版的话,可以构建项目+测试项目,企业版会展示出你写的所有测试类,并且执行之后会告诉你通过情况,并且给出覆盖率情况

  • 这个需要先新建一个项目(我是控制台32项目),也需要下载一个插件Unit Test Generator

先给出官网给的说明

  • https://docs.microsoft.com/zh-cn/visualstudio/test/using-code-coverage-to-determine-how-much-code-is-being-tested?view=vs-2015

再给出已经有人写的教程,可能有的是c#,有的是c++,但操作是一样的,选择对应的语言就可以,我觉得他已经写得非常详细了,我就是参考这样配置的

  • https://www.cnblogs.com/tonyztx/p/5297959.html

编译之后,点击测试-运行-测试项目

然后测试-分析代码覆盖率

 

 

2.使用OpenCppCoverage +vs 2015(企业版,社区版都可以)

下面这篇文章虽然介绍的很简单,但是至少提供了方向

  • https://blog.csdn.net/quiet_girl/article/details/78075070

如果不使用命令行的话,第二种做法就够了,直接通过插件安装

 

 然后选择工具,run opencpp就可以了

出现红色绿色的阴影

红色是未覆盖,绿色是覆盖

 

三、使用cmake生成项目,构建+gtest进行单元测试+使用命令行执行opencppcoverage输出测试覆盖率

 

CMake是一个工程构建工具,能够自动生产makefile文件,方便构建编译文件,链接库,安装文件等。

每个需要编译的目录(子目录)都要有一个CMakeLists.txt文件

1.基本的构建和介绍,请看下面这篇文章

https://blog.csdn.net/yaoyuanyylyy/article/details/79024962

上面介绍了怎么使用cmake构建一个项目并且执行

2.构建引入gtest的项目

下面这篇文章简单的介绍了,但执行过程出现各种问题

http://www.sohu.com/a/251930931_216613

下面详细介绍我的实现步骤

 

  • 首先建两个文件(仅供参考)

文件内容如下 

test.cpp

#include <gtest/gtest.h>
#include <string>
#include <map>
using namespace std;
 
class TestMap :public testing::Test
{
public:
	//添加日志
	static void SetUpTestCase()
	{
		cout << "SetUpTestCase" << endl;
	}
	static void TearDownTestCase()
	{
		cout << "TearDownTestCase" << endl;
	}
	virtual void SetUp()   //TEST跑之前会执行SetUp
	{
		cout << "SetUp" << endl;
		test_map.insert(make_pair(1, 0));
		test_map.insert(make_pair(2, 1));
		test_map.insert(make_pair(3, 2));
		test_map.insert(make_pair(4, 3));
		test_map.insert(make_pair(5, 4));
	}
	virtual void TearDown() //TEST跑完之后会执行TearDown
	{
		cout << "TearDown" << endl;
		test_map.clear();
	}
	map<int, int> test_map;
};
TEST_F(TestMap, Find)   //此时使用的是TEST_F宏
{
	map<int, int>::iterator it = test_map.find(1);
	ASSERT_NE(it, test_map.end());
}
TEST_F(TestMap, Size)
{
	ASSERT_EQ(test_map.size(), 5);
}
 

CMakelists.txt

 

cmake_minimum_required(VERSION 3.6)

include_directories(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0/include)

#关闭gmock,根据您的情况打开
set(BUILD_GMOCK OFF)

#编译库的例子
add_subdirectory(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0)

#新建一个测试工程
project(learnGoogleTest)
link_directories(D:/Test-my/gtest/demo3/googletest-release-1.7.0/googletest-release-1.7.0/lib)
add_executable(learnGoogleTest test.cpp)
target_link_libraries(learnGoogleTest gtest gtest_main)

#这个必须放在project的后面
IF(MSVC)
   message("run here")
   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()

具体设置不再描述,看一下就明白了,中间比如路径设置什么的,为了简单和整体性的话可以前面进行一个set,方便后面 进行使用,在这里我全部用的是绝对路径

  •  接下来通过cmake指令构建一个项目

如果没有下载cmake和配置环境,需要先下载配置环境变量,下面这篇文章讲的还是比较清晰的,他描述了如何使用cmake命令的gui去生成项目,使用vs打开项目进行编译,或者使用vs自带的命令行执行msbuild进行构建

https://blog.csdn.net/yaoyuanyylyy/article/details/79024962

 

但是如果全程都要用命令行呢(方便跨平台)

通过当前目录的cmd就可以直接进入命令行

或者使用cd /d d:进入盘

下面的指令写的很清晰了 ,构建build目录,然后cmake ..

然后执行cmake - build . 

发现在build目录下面有.sln 这是你cmakelists.txt里面写的项目名称,出现.sln说明项目生成成功

  • 接下来是编译生成debug目录,最最关键的一个步骤 

完了,此时我发现我生成项目可以用cmd命令行的cmake,也可以使用可视化界面

但是编译项目,貌似只能用vs自带的一个命令行工具(linux可以直接编译)

执行msbuild命令

 

此时生成debug目录,目录里面就有可执行文件

 

 双击执行

好了,使用cmakelists构建以及编译项目到此结束了

默认是生成vs项目,可以使用命令行参数生成其他项目,也可以使用可视化界面选择生成的项目类型 

 

 3.使用opencppcoverage输出测试覆盖率

下面这个网页给出了简单的命令

但是也是有一些问题的

所以给出对应的我的测试项目的命令

在debug目录下面进入cmd命令窗口

D:\Test-my\gtest\demo3\build\Debug>OpenCppCoverage.exe --sources D:\Test-my\gtest\demo3 --export_type=html -- D:\Test-my\gtest\demo3\build\Debug\learnGoogleTest.exe

执行成功

需要注意的是,opencpp输出的覆盖率是代码行覆盖率

 而且opencpp的作者也说了是line coverage

目前也没有找到windows下其他更好的测试覆盖率的输出了

以上,希望对大家能够有所帮助。 

补充 

Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)

另外,在我的另一篇博客里补充了,多级目录下gtest项目的配置

https://blog.csdn.net/yysave/article/details/96996123

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gtest单元测试配置+vs 2015+OpenCppCoverage输出测试覆盖率 || cmake命令构建项目以及编译以及命令行测试 的相关文章

  • 开源SIP服务器OpenSIPS应用介绍

    1 引入 随着通信IP化的发展 xff0c IP传输的高带宽 低成本等优势使得越来越多的企业 电信运营商加快建设基于IP的各种通信应用 在通信协议IP化发展中 xff0c SIP协议毫无争议地成为各大电信运营商构建其未来网络的基础协议 xf
  • Ubuntu 18.04 apache2 搭建http文件服务器

    在我们日常的开发过程中 xff0c 需要创建一个http 文件服务器 用于调试 比如直接使用 wget 获取文件 代替 插拔SD卡 xff08 用sd卡拷贝 xff09 1 安装 apache2 apt get update apt get
  • CentOs安装nginx服务器,能够在远端通过http和https访问nginx服务器的测试首页内容。

    使用yum install nginx 命令安装nginx 然后通过dnf list nginx命令查询了安装结果 第一次通过sytemctl status nginx 命令进行查看服务启动状态时 xff0c 结果显示dead xff0c
  • SPL06-001 气压计计算与读取

    手册地址 https download csdn net download zhangxuechao 10548473 寄存器 计算方法 举例 气压测量速率 sample sec Background 模式使用 define PM RATE
  • PTA题库 查找字串

    查找子串 本题要求实现一个字符串查找的简单函数 函数接口定义 xff1a span class token keyword char span span class token operator span span class token
  • 怎样防止头文件被重复包含?(两种方式)以及它的影响

    xfeff xfeff 一 头文件被重复包含 include文件的一 个不利之处在于一个头文件可能会被多次包含 xff0c 为了说明这种错误 xff0c 考虑下面的代码 include 34 x h 34 include 34 x h 34
  • linux 条件变量

    在多线程编程中仅使用互斥锁来完成互斥是不够用的 xff0c 如以下情形 xff1a 假设有两个线程 t1 和 t2 xff0c 需要这个两个线程循环对一个共享变量 sum 进行自增操作 xff0c 那么 t1 和 t2 只需要使用互斥量即可
  • Invoke与begininvoke

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate xff0c 至于委托的本质请参考我的另一随笔 xff1a 对 net事件的看法 一 为什么Control类提供了Invoke和BeginInvoke机制
  • 接口成员显示实现

    xff08 interface xff09 用来定义一种程序的协定 实现接口的类或者结构要与接口的定义严格一致 在前面的文章中 xff0c 我们已经对C 接口的概念 xff0c 如何定义接口以及如何对接口进行访问等问题进行了详细的讨论 在这
  • Oracle基础知识整理总结

    1 Oracle跟SQL Server 2005的区别 xff1f 宏观上 xff1a 1 最大的区别在于平台 xff0c oracle可以运行在不同的平台上 xff0c sql server只能运行在windows平台上 xff0c 由于
  • Javascript调用后台方法

    1 javaScript函数中执行C 代码中的函数 xff1a 方法一 xff1a 1 首先建立一个按钮 xff0c 在后台将调用或处理的内容写入button click中 2 在前台写一个js函数 xff0c 内容为document ge
  • Delphi设置某用户对文件(夹)的权限

    以下在代码在D7 43 2003和D7 43 XP中调试通过 unit NTSecurityU interface Uses Windows AclApi AccCtrl Const SECURITY NULL SID AUTHORITY
  • 关于VMWare压缩虚拟机的虚拟磁盘的问题

    随着我们使用虚拟系统的时间越长 xff0c Vmware创建的虚拟磁盘占用空间就越大 xff0c 即使将虚拟系统中的文件删除 xff0c 虚拟磁盘文件占用宿主系统硬盘空间也不会减少 xff0c 这个问题困扰了很多用户 a S 34 N 43
  • GB2312简体中文编码表

    const GB2312 中文编码 CHpb 61 B0 首页码 CHpe 61 F7 尾页码 CHab 61 A1 首地址 CHae 61 FE 尾地址 GB B 61 B0A1 GB E 61 F7FE ChCount 61 chpe
  • 自定义通信协议

    现在大部分的仪器设备都要求能过通过上位机软件来操作 xff0c 这样方便调试 xff0c 利于操作 其中就涉及到通信的过程 在实际制作的几个设备中 xff0c 笔者总结出了通信程序的通用写法 xff0c 包括上位机端和下位机端等 1 xff
  • vc的编译过程

    对VC 43 43 工程编译过程的梳理 VC 43 43 的项目和解决方案文件解读 xff0c 无非就是利用这些信息进行一个软件的编译 xff0c 这些文件里面是存放的项目的配置和工程的组织 xff0c 类似于makefile文件 但是只有
  • 用WSE在Web服务中验证用户身份

    一 Web服务安全与WS Security 毫无疑问 xff0c SOAP和XML Web服务在交互操作和标准上已经完全改变了电子商务领域的格局 然而直到最近 xff0c 在Web服务技术领域仍然存在着一些缺陷 xff0c 那就是处理消息级
  • 安装CUDA wget下载速度慢解决办法(天下无敌)

    因为墙的原因 xff0c 再加上英伟达工作人员脑筋不会急转弯 xff0c 以及wget是个弟中弟 xff0c 下载cuda时可能会很慢 断线 xff0c 翻墙又不方便 但是没关系 xff0c 谈笑间 xff0c 让我们用一分钟成交它 以ub
  • px4下载指定版本的固件、git用法

    https hub fastgit org PX4 PX4 Autopilot git describe tag 查看当前版本号 git tag l 查看所有版本 xff0c 也就是打个tag git checkout v1 9 1 跳转到
  • YOLOX网络结构

    本文为博主DaneAI原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 原文链接 xff1a https blog csdn net happyday d article detai

随机推荐

  • 阿木实验室P450无人机硬件接线图备忘录

    其中数传是定制的 xff0c 相当于是路由器 43 数传二合一 xff0c 既负责地面站计算机与pixhawk的通讯 xff0c 又负责发射WiFi信号 组建局域网 xff0c 使板载英伟达NX上位机和手机 平板 笔记本电脑等远程终端连接在
  • yolov3损失函数公式及代码位置,绝对良心(更新)

    版本 xff1a darknet yolov3 环境 xff1a ubuntu16 04 本人小白 xff0c 毕设正在做基于yolov3的目标检测系统研究 xff0c 在网上找了一万遍 xff0c 基本没有靠谱的损失函数 xff0c 全是
  • 使用http协议Header中的Authorization传递token

    1 span class token annotation punctuation 64 GetMapping span span class token punctuation span span class token string 3
  • Shell命令之终端打开网页

    一句话用Safari打开百度 span class hljs built in open span span class hljs operator a span span class hljs string 34 Applications
  • 数据结构期末复习五:内部排序

    排序的基本概念和分类 排序 xff1a 将杂乱无章的数据按关键字递增 xff08 或递减 xff09 有序排列 假设Ki 61 Kj xff0c 排序前Ri领先于Rj 稳定排序 xff1a 排序后的序列Ri仍领先于Rj 不稳定排序 xff1
  • 数据同步工具DataX从Mysql同步数据到HDFS实战

    目录 1 查看数据同步模板2 高可用HA的HDFS配置3 MysqlReader针对Mysql类型转换说明4 HdfsWriter支持大部分Hive类型5 Mysql准备数据如下6 新建job mysql2hdfs json7 执行job8
  • 目标检测yolov3+文字识别CRNN 实现文本检测和识别

    参考链接 xff1a https github com chineseocr chineseocr https zhuanlan zhihu com p 34757009 https wenku baidu com view f4ec95e
  • 关于51单片机串口通信的相关知识(寄存器)

    一 51单片机串口概念 1 51单片机的串行口 51单片机的串行口是一个可编程全双工的通信接口 xff0c 具有UART xff08 通用异步收发器 xff09 的全部功能 2 51单片机的硬件连接 简单双向串口通信有两根数据通信线 xff
  • Linux服务器--TCP协议详解

    1 TCP服务的特点 传输层协议主要有两个 xff1a TCP协议和UDP协议 TCP协议相对于UDP协议的特点是 xff1a 面向连接 字节流 可靠传输 使用TCP协议通信的双方必须先建立连接 xff0c 然后才能开始数据的读写 双方都必
  • strpbrk函数

    strpbrk函数 1 函数功能 xff1a strpbrk是在源字符串 xff08 s1 xff09 中找出最先含有搜索字符串 xff08 s2 xff09 中任一字符的位置并返回 xff0c 若找不到则返回空指针 2 头文件 span
  • win10自带的office365怎么找到安装目录+mathtype

    遇到问题 xff0c 因为我要安装mathtype xff0c 但是一直显示错误代码53 显示运行时未找到mathpage wll 一般都在office文件夹中 xff0c 但是365死活在files和data中都找不到 xff0c 运行目
  • 面试问题记录

    csdn https www cnblogs com yinrw p 10795210 html 问题比较全面 问卷星 https www wjx cn xz 109293287 aspx 简述你在以前的工作中做过哪些事情 xff0c 比较
  • 学习记录2

    这是一个名字 新版换了之后跟之前的完全不太一样了 shell相关 Shell字符串截取 xff08 非常详细 xff09 苍青浪 博客园 这是一个快引用 linux相关 查看内容占用情况 输出 free m sed n 39 2p 39 a
  • leetcode 100热题

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言标题easy问题合集1 有效括号问题 前言 提示 xff1a leetcode简单题目100题中的easy部分 xff1a
  • java小项目之成绩管理、排课软件、局域网聊天软件

    大三下 xff0c 想把上个学期的一些东西整理一下 可能是突然有点想法吧 我把答辩ppt以及文档要求还有项目文件夹全部都放在了我的github里面啦 点击打开链接 项目一 问题描述 xff1a 教师在教学过程中 xff0c 需要记录学生的成
  • LeetCode 114 二叉树转链表

    一 题目 分析 xff1a xff08 1 xff09 要求转化为先序遍历顺序 xff0c 这个很容易想到设置一个链表 xff0c 然后先序遍历二叉树 xff0c 把节点和指针记录在链表就好了 xff08 2 xff09 题目要求in pl
  • 使用gstreamer,rtsp拉流,保存图像, jeston,使用硬件加速nvdec/nvenc

    jeston xff0c 拉流 xff0c 使用硬件加速nvdec nvenc span class token macro property span class token directive hash span span class
  • LeetCoed 无重复字符的最长子串(java)

    一 题目分析 分析 xff1a 最长子串 xff0c 而不是最长子序列 子串是字符串连续的一段 xff0c 子序列是可以不连续的 所以有一种方法叫做滑动窗口法 xff0c 我记得左程云老师讲过 xff0c 那个题是计算窗口内最大或者最小值的
  • leetcode 127 单词接龙(搜索 java)

    就是给一个单词词典 xff0c 给一个开始词汇和结束词汇 xff0c 在词典中找出开始词汇转变成结束词汇的过程 xff0c 求转变次数 每次只能转变单词的一个字符 可能会有多条路径可以到达 xff0c 搜索问题可以用DFS BFS解决 xf
  • gtest单元测试配置+vs 2015+OpenCppCoverage输出测试覆盖率 || cmake命令构建项目以及编译以及命令行测试

    目录 一 仅使用gtest 43 vs2015 1 下载和编译gtest 2 创建具体的项目 3 gtest自带十个例子 二 使用gtest 43 vs2015 xff0c 并且输出测试覆盖率 1 使用vs 2015企业版 2 使用Open