第一个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)项目实验日记相关推荐

  1. C 语言的诞生,竟然是一个失败的项目?

    整理 | Carol 出品 | CSDN(ID:CSDNnews) 很多人认为 ,C 语言是一门"古董"语言.也有不少人认为,它没有 Python 简洁,没有 Java 安全,甚至 ...

  2. 如何创建一个数据科学项目?

    摘要: 在一个新的数据科学项目,你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理之前,需要考虑哪些方面?读完本文,会让你拥有一个更加科学的工作流程. 假如你想要开始一个 ...

  3. 如何创建一个数据科学项目? 1

    假如你想要开始一个新的数据科学项目,比如对数据集进行简单的分析,或者是一个复杂的项目.你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理之前,需要考虑哪些方面? 数据科学 ...

  4. 使用Trinamic TMC2300步进驱动器做一个迪斯科灯项目

    从RoadTest发布,Trinamic TMC2300-loT-REF步进驱动器+电机看起来很优秀,使其成为机电远程控制应用的理想选择.出于对评估它的功能和建立一个迪斯科灯项目的兴趣,我申请了这个实 ...

  5. eNSP实验日记四(防火墙配置)

    eNSP实验日记四,防火墙配置 文章目录 eNSP实验日记四,防火墙配置 前言 一.设备清单以及需求 二.配置步骤 1.配置安全域 2.配置nat策略 3.做安全策略 总结 前言 今天这期紧跟上篇文章 ...

  6. 软件构造 Lab4 Lab5 实验日记

    软件构造 Lab4 Lab5 实验日记 SC Lab4 实验日记(持更)自定义异常 防御策略 log debug week11-week12 Debugging Exception Handling ...

  7. java项目实验报告_javaweb项目实验报告.docx

    javaweb项目实验报告.docx 还剩 14页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 4.总结这次课程设计真的是花了很多时间和精力去做的.先 ...

  8. windows平台下使用cmake构建静态lib库以及使用静态lib库gtest项目

    有些时候我们需要将部分代码编译成单独的一个库,然后在另一个项目中去使用这个库 大部分是linux环境下的指令,但是也差不是很多 记录一下构建的经过 目录 1.使用cmake构建及使用lib库 构建li ...

  9. 2021-07-28项目经理日记

    项目经理日记 一个巨大的产业在这两天迅速崩盘,那就是教培行业.中央出台了相关措施,比如禁止校外培训机构占用学生节假日.禁止聘用外籍人士.禁止开展个别学科类的培训等等,股市最为诚实,新东方的估价已经跌了 ...

最新文章

  1. Selenium如何通过location和size定位元素坐标?
  2. 招聘带来的Silverlight团队技能指标
  3. java中不同包中怎么实例化,Java 笔试题 (01)
  4. rhel7搭建可用实验环境
  5. pearsonr() python_Python 来算算一线城市的二手房价格指数相关性
  6. 读excel文件至DataTable
  7. android.support不统一的问题
  8. 计算机cnc键代表啥,计算器上的cnc键表示啥
  9. Linux直接与编译安装Vsftpd服务器
  10. python threading-单线程 多线程 主线程 子线程 setDeamon join
  11. CentOS上使用Docker安装Redis-Cluster (redis6.x)
  12. azure批量创建虚拟机_如何将数据库迁移到Azure虚拟机
  13. px、pt、em、rem 的区别
  14. python简单程序实例-Python简单基础小程序的实例代码
  15. 台达PLC-EH3.铆压机,3轴,Z轴(SMC)电缸下降的距 离用的是位置加扭矩模式,台达PLC MODBUS通讯控制台达A2伺服扭矩
  16. 计算机专业期末试卷分析,计算机期末试卷分析
  17. 为什么程序员下班后只关显示器却从不关电脑?
  18. PowerDesign画ER图
  19. 计算机视觉 | 1. 一切的基础: 灰度图像 (读取,转换,像素定位)
  20. 瞰见 | 美股新贵Confluent背后的卡夫卡,不是那个魔幻小说家

热门文章

  1. 青岛地铁不能让你的房子升值
  2. TCP/IP详解(特详!)
  3. 轻量化Json开源格式化工具-JSON Formatter
  4. 输油管道问题(分治法)
  5. 访问到页面的完整流程
  6. 数据结构|连通图、完全图、无向图、有向图的边数计算问题
  7. teamviewer注册版和免费版有什么区别_TeamViewer最终年度版本有什么不同?
  8. 什么是C语言的合法正确标识符?什么是C语言关键字?
  9. 针对某眼电影加密字体的爬虫
  10. 2018刚入手一台UGP U8VR眼镜,ugp vr眼镜怎么样评测效果好不好,跟我看看