第一个GoogleTest(gtest)项目实验日记
第一个GoogleTest(gtest)项目实验日记
目录
零、前言... 2
一、创建一个带main函数的项目... 3
二、创建GoogleTest环境... 6
1.头文件... 6
2.编写简单的代码... 8
(1)添加被测试函数... 8
(2)添加gtest测试代码... 9
(3)添加执行gtest测试的代码... 9
3.库文件... 12
(1)创建一个静态库项目... 12
(2)添加gtest的代码... 17
(3)在GoogleTest.lib项目中添加gtest的头文件... 20
4.使用库文件... 27
(1)添加库文件... 28
(2)再编译 HelloGoogleTest 29
三、运行第一个GoogleTest项目... 30
1.一点准备工作... 30
2.查看运行结果... 31
四、后记... 34
零、前言
Google项目源码下载地址:https://github.com/google/googletest/tree/release-1.7.0
看了一些前辈们写的一些相关博客、笔记和录像,发现我并不能运行成功,但是在几次失败中,总结了一个在我的环境中运行成功的通路:
VS2015+gtest-v1.7
一、创建一个带main函数的项目
二、创建GoogleTest环境
1.头文件
// HelloGoogleTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "gtest/gtest.h"
int main()
{return 0;
}
发现:#include "gtest/gtest.h"有错误
因为没有相应的头文件,故加入头文件。
其中的 E:\googletest-release-1.7.0\include 为下载的源码文件中的目录。
设置完此项后,#include "gtest/gtest.h"无错误
2.编写简单的代码
(1)添加被测试函数
// HelloGoogleTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "gtest/gtest.h"//求最大公约数
int Foo(int a, int b)
{if (a == 0 || b == 0){throw "don't do that";}int c = a % b;if (c == 0)return b;return Foo(b, c);
}int main()
{return 0;
}
(2)添加gtest测试代码
(该项目具体规则此处不赘述,可参考其它资料)
// HelloGoogleTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "gtest/gtest.h"
//求最大公约数
int Foo(int a, int b)
{if (a == 0 || b == 0){throw "don't do that";}int c = a % b;if (c == 0)return b;return Foo(b, c);
}
TEST(FooTest, HandleNoneZeroInput)
{EXPECT_EQ(2, Foo(4, 10));EXPECT_EQ(6, Foo(30, 18));
}
int main()
{return 0;
}
(3)添加执行gtest测试的代码
// HelloGoogleTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "gtest/gtest.h"
//求最大公约数
int Foo(int a, int b)
{if (a == 0 || b == 0){throw "don't do that";}int c = a % b;if (c == 0)return b;return Foo(b, c);
}
TEST(FooTest, HandleNoneZeroInput)
{EXPECT_EQ(2, Foo(4, 10));EXPECT_EQ(6, Foo(30, 18));
}
int main(int argc, char* argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
至此,代码编写完毕,不妨编译运行一下试试。
不出所料,编译不通过,因为写了一些奇怪的代码
无法解析的外部符号!
原因是我们只添加了头文件,没有库文件(.lib)
库文件没有直接可下载的地方,但是我们有源码,故我们拿源码编译一个库文件。
3.库文件
(1)创建一个静态库项目
至此,一个空静态库项目创建完毕,但是没有代码!
此处回忆一下创建静态库的初衷——我们需要编译一个gtest的库文件。
故,我们添加gtest的静态库代码。
(2)添加gtest的代码
我们添加了两个代码文件,但是发现其中有错误,显然,至少其中一个错误和之前一样【二、创建GoogleTest环境 1.头文件】
头文件不存在!
我们不妨先解决这个问题。
(3)在GoogleTest.lib项目中添加gtest的头文件
这个步骤和【二、1.】中的一样,只是设置的项目不同,注意对话框的标题——
此时,发现错误提示消失了。
但是另外一个文件中有错误提示
此处不用担心,我们应该还记得引入文件的时候
除了两个我们已经引入的文件,剩下的就是此处错误提示的include文件,它们已经存在,我们可根据目录,再添加一个头文件的附加包含目录
此时,所有错误消失。
我们可直接尝试编译一下.lib项目。
很高兴,编译成功了。意味着我们得到了gtest的静态库文件,并且上图已经告诉我们库文件所在的位置了。我赶紧到相应的目录查看了一下。
特别注明:根据之前看前辈们的笔记,此处应该编译不成功,提示:模板参数过多,还应该加一个预编译宏: _VARIADIC_MAX=10
https://www.bogotobogo.com/cplusplus/google_unit_test_gtest.php
但是我这里成功了,可能和VS版本有关系,原文中用的是VS2012,我这里用的是VS2015
果然,我看到了我心心念念的GoogleTest.lib. 迫不及待得要使用它。
我们要在哪使用它来着?还记得我们写过代码的项目吗?
// HelloGoogleTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "gtest/gtest.h"
//求最大公约数
int Foo(int a, int b)
{if (a == 0 || b == 0){throw "don't do that";}int c = a % b;if (c == 0)return b;return Foo(b, c);
}
TEST(FooTest, HandleNoneZeroInput)
{EXPECT_EQ(2, Foo(4, 10));EXPECT_EQ(6, Foo(30, 18));
}
int main(int argc, char* argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
在我们的第一个gtest项目中引入GoogleTest.lib。
4.使用库文件
接下来,我们要过河拆桥了,GoogleTest已经编译出了我们需要的GoogleTest.lib。我们只拿GoogleTest.lib,剩下的可缩小放一边,我们的关注点重新回到我们的第一个GoogleTest项目——HelloGoogleTest
我们之前编译HelloGoogleTest项目的时候出现了错误:
因为缺少库文件,现在我们有了库文件,就添加这个库文件,再编译一次试试。
(1)添加库文件
其中附加依赖项对话框中 输入的是 我们编译生成的 GoogleTest.lib 的路径。
添加成功,我们再编译一次试试。
(2)再编译 HelloGoogleTest
提示编译成功!!!
编译完了,当然要运行一下试试啦。
三、运行第一个GoogleTest项目
1.一点准备工作
由于我们的解决方案中有多个项目,所以运行前,先把我们需要运行的项目设置为启动项目
若项目名称显示粗体,则该项目为启动项目。
一切准备就绪,点击绿色箭头运行项目吧。
咦!发现出现了一个黑窗口一闪而过,仿佛还有点绿油油,但是马上就消失了。这是什么情况?
我再点击了一下运行。还是一样的效果。
现在我明白了,我们可能需要一个 pause 来阻止一下窗口的消失,我好看清窗口里到底有什么,特别是对那个绿油油的东西很是好奇。
2.查看运行结果
关于窗口闪退的问题,我第一反应,可能需要这么干——我在return前加一行代码:system("pause");
但是仔细一思考,不对,因为return的部分,不是没有具体功能的 return 0;
看起来似乎执行了一个重要的东西。我们在return之前直接停止
不出所料,运行并不完美,没有出现我想“调查”的绿油油的场景。
可是我们如何在return之后加 pause呢?
我的办法是使用了 cmd 的.bat脚本。
到执行的.exe文件目录下,创建了一个脚本。
里面的内容很简单,就两行
保存后,我带着一丝得意,双击 run.bat ,觉得这回应该可以了,然而。。。
看到这一幕,我秒懂,我应该删除这句话,然后重新编译。
编译后,再运行run.bat
大功告成!第一个GoogleTest程序运行完毕。
四、后记
回顾一下上述实验,有一些待完善的地方
1. 引入头文件和.lib文件时,用的都是绝对路径,在实际项目中不可取,要规划一下项目结构,使用相对路径。
2. 本实验成功掌握了运行流程,但是没有涉及 gtest的具体知识,如何更好得编写单元测试代码,需要进一步学习。
系列链接:
1.玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
2.玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言
3.玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
4.玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化
5.玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试
6.玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
7.玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest
8.玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
第一个GoogleTest(gtest)项目实验日记相关推荐
- C 语言的诞生,竟然是一个失败的项目?
整理 | Carol 出品 | CSDN(ID:CSDNnews) 很多人认为 ,C 语言是一门"古董"语言.也有不少人认为,它没有 Python 简洁,没有 Java 安全,甚至 ...
- 如何创建一个数据科学项目?
摘要: 在一个新的数据科学项目,你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理之前,需要考虑哪些方面?读完本文,会让你拥有一个更加科学的工作流程. 假如你想要开始一个 ...
- 如何创建一个数据科学项目? 1
假如你想要开始一个新的数据科学项目,比如对数据集进行简单的分析,或者是一个复杂的项目.你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理之前,需要考虑哪些方面? 数据科学 ...
- 使用Trinamic TMC2300步进驱动器做一个迪斯科灯项目
从RoadTest发布,Trinamic TMC2300-loT-REF步进驱动器+电机看起来很优秀,使其成为机电远程控制应用的理想选择.出于对评估它的功能和建立一个迪斯科灯项目的兴趣,我申请了这个实 ...
- eNSP实验日记四(防火墙配置)
eNSP实验日记四,防火墙配置 文章目录 eNSP实验日记四,防火墙配置 前言 一.设备清单以及需求 二.配置步骤 1.配置安全域 2.配置nat策略 3.做安全策略 总结 前言 今天这期紧跟上篇文章 ...
- 软件构造 Lab4 Lab5 实验日记
软件构造 Lab4 Lab5 实验日记 SC Lab4 实验日记(持更)自定义异常 防御策略 log debug week11-week12 Debugging Exception Handling ...
- java项目实验报告_javaweb项目实验报告.docx
javaweb项目实验报告.docx 还剩 14页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 4.总结这次课程设计真的是花了很多时间和精力去做的.先 ...
- windows平台下使用cmake构建静态lib库以及使用静态lib库gtest项目
有些时候我们需要将部分代码编译成单独的一个库,然后在另一个项目中去使用这个库 大部分是linux环境下的指令,但是也差不是很多 记录一下构建的经过 目录 1.使用cmake构建及使用lib库 构建li ...
- 2021-07-28项目经理日记
项目经理日记 一个巨大的产业在这两天迅速崩盘,那就是教培行业.中央出台了相关措施,比如禁止校外培训机构占用学生节假日.禁止聘用外籍人士.禁止开展个别学科类的培训等等,股市最为诚实,新东方的估价已经跌了 ...
最新文章
- Selenium如何通过location和size定位元素坐标?
- 招聘带来的Silverlight团队技能指标
- java中不同包中怎么实例化,Java 笔试题 (01)
- rhel7搭建可用实验环境
- pearsonr() python_Python 来算算一线城市的二手房价格指数相关性
- 读excel文件至DataTable
- android.support不统一的问题
- 计算机cnc键代表啥,计算器上的cnc键表示啥
- Linux直接与编译安装Vsftpd服务器
- python threading-单线程 多线程 主线程 子线程 setDeamon join
- CentOS上使用Docker安装Redis-Cluster (redis6.x)
- azure批量创建虚拟机_如何将数据库迁移到Azure虚拟机
- px、pt、em、rem 的区别
- python简单程序实例-Python简单基础小程序的实例代码
- 台达PLC-EH3.铆压机,3轴,Z轴(SMC)电缸下降的距 离用的是位置加扭矩模式,台达PLC MODBUS通讯控制台达A2伺服扭矩
- 计算机专业期末试卷分析,计算机期末试卷分析
- 为什么程序员下班后只关显示器却从不关电脑?
- PowerDesign画ER图
- 计算机视觉 | 1. 一切的基础: 灰度图像 (读取,转换,像素定位)
- 瞰见 | 美股新贵Confluent背后的卡夫卡,不是那个魔幻小说家