第一个GoogleTest(gtest)项目实验日记
目录
(3)在GoogleTest.lib项目中添加gtest的头文件... 20
零、前言
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)之八 - 打造自己的单元测试框架