第一个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)之八 - 打造自己的单元测试框架

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值