VS2015搭建GoogleTest框架--配置第一个项目

一、googletest简介

本文使用googletest进行单元测试,这里先简要介绍一下googletest。googletest(简称gtest)是一个跨平台的并且开源的(Linux、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、“死亡测试”等。

二、相关的准备工作

本文的内容基于win10+vs2015使用googletest框架进行C++单元测试,那么我们要做的第一个工作就是去下载和配置googletest,以便于我们接下来进行使用。

2.1下载源码

到https://github.com/google/googletest这个地址去下载googletest的源码为我们下一步进行编译做准备。

2.2编译googletest源码生成我们需要的库文件

下载完成之后我们得到的是一个zip格式的压缩文件,我们将其解压到合适的目录(以方便自己查找为原则)。这里我们需要注意两个文件夹,待会需要使用。

使用vs2015打开msvc/2010里面的gtest.sln,会提示升级VC++编译器和库,点击确定即可。

等待升级完成后,打开gtest项目属性对话框(可以右键单击项目名,打开属性),配置工程属性。按图中两种方式修改都是可以的(注意和后面测试项目的属性设置比较)。

Debug、Release两个模式都要编译。

在编译时会出现“无法启动程序”字样,这是正常的,因为我们只是生成了相关的库文件,并不是可执行文件。

编译后,在msvc/2010/gtest/下有Win32-Debug、Win32-Release两个文件夹,并且每个文件夹里面有一个gtestd.lib文件,如下图所示。

至此,准备阶段完成。

2.3必要知识学习

断言:gtest中采用了大量的宏来包装断言,这里的断言不同于C语言当中的断言(assert)。

按照其使用方法可以分为两类:

ASSERT系列(ASSERT_&系列,当检查点失败时,退出当前函数,并非推出当前案例);

EXPECT系列(EXPECT_*系列的断言,当检查点失败时,继续往下执行)。

按照常用功能可以依次分为12类,平常主要用到的以下这几类:

布尔值比较

数值型数据比较

字符串比较

浮点数比较

近似数比较

异常检测

自定义格式函数与参数检查

布尔值比较

ASSERT_TRUE(condition)EXPECT_TRUE(condition)condition == true

ASSERT_FALSE(condition)EXPECT_FALSE(condition)condition == false

数值型数据比较

ASSERT_EQ (expected, actual)EXPECT_EQ (expected, actual)expected == actual

ASSERT_NE (val1, val2)EXPECT_NE (val1, val2)val1 != val2

ASSERT_LT (val1, val2)EXPECT_LT (val1, val2)val1 < val2

ASSERT_LE (val1, val2)EXPECT_LE (val1, val2)val1 <= val2

ASSERT_GT (val1, val2)EXPECT_GT (val1, val2)val1 > val2

ASSERT_GE (val1, val2)EXPECT_GE (val1, val2)val2 >= val2

字符串比较

ASSERT_STREQ (str1, str2)EXPECT_STREQ (str1, str2)两个C字符串内容相同(同时支持char *和wchar_t *类型)

ASSERT_STRNE (str1, str2)EXPECT_STRNE (str1, str2)两个C字符串内容不同(同时支持char *和wchar_t *类型)

ASSERT_STRCASEEQ (str1, str2)EXPECT_STRCASEEQ (str1, str2)两个C字符串内容相同,忽略大小写(只支持char *类型)

ASSERT_STRCASENE (str1, str2)EXPECT_STRCASENE (str1, str2)两个C字符串内容不同,忽略大小写(只支持char *类型)

浮点数比较

ASSERT_FLOAT_EQ (val1, val2)EXPECT_FLOAT_EQ (val1, val2)the two float values are almost equal

ASSERT_DOUBLE_EQ (val1, val2)EXPECT_DOUBLE_EQ (val1, val2)the two double values are almost equal

近似数比较

ASSERT_NEAR (val1, val2, abs_error)EXPECT_NEAR (val1, val2, abs_error)两个数值val1和val2的绝对值差不超过abs_error



异常检查

ASSERT_THROW (statement, exception_type)EXPECT_THROW (statement, exception_type)抛出指定类型异常

ASSERT_THROW(statement)EXPECT_THROW(statement)抛出任意类型异常

ASSERT_NO_THROW(statement)EXPECT_NO_THROW(statement)不抛异常


函数值与参数检查(目前最多只支持5个参数)

ASSERT_PRED1(pred1, val1)EXPECT_PRED1(pred1, val1)pred1(val1) returns true

ASSERT_PRED2(pred2, val1, val2)EXPECT_PRED2(pred2, val1, val2)pred2(val1, val2) returns true


Windows HRESULT

ASSERT_HRESULT_SUCCEEDED(expression)EXPECT_HRESULT_SUCCEEDED(expression)expression is a success HRESULT

ASSERT_HRESULT_FAILED(expression)EXPECT_HRESULT_FAILED(expression)expression is a failure HRESULT


自定义格式函数与参数检查(目前最多支持5个参数)

ASSERT_PRED_FORMAT1(pred1, val1)EXPECT_PRED_FORMAT1(pred1, val1)pred1(val1) is successful

ASSERT_PRED_FORMAT1(pred1, val1, val2)EXPECT_PRED_FORMAT1(pred1, val1, val2)pred2(val1, val2) is successful

2.4创建测试项目并配置属性

在vs2015中,创建Win32控制台应用程序MyTest。

打开项目属性对话框,配置工程属性。展开“配置属性 -> C/C++ -> 常规”,在【附加包含目录】中添加“.\include”(这里省略了include的相关母目录,在之前有过关于include的说明,如果忘记在哪找,可以在前边的内容中复习一下);展开“C/C++ -> 代码生成”,在【运行库】中修改为多线程调试DLL(/MDd),如下图所示。

展开“链接器 -> 输入”,在【附加依赖项】添加刚刚生成的lib文件路径,注意这里是配置Debug,要输入Win32-Debug里面的gtestd.lib文件路径(这里需要注意文件名后面有个d)。

以上就是配置Debug的方式,配置Release只需要把前边相对应的位置改为Release的相关内容即可。

2.5编写测试代码

这里测试代码主要分为3个文件,主文件FirstGtest.cpp,以及Box类的两个相关文件CBox.h和CBox.cpp

1// CBox.h2#pragma once3#include45//Box类的定义6classCBox7{8public:9//构造函数10CBox(doublelength_value,doublewidth_value,doubleheight_value);11//默认构造函数12CBox();13//volume函数用于计算Box的体积14doublevolume();1516private:17//Box的3个特性:长、宽、高18doubleLength_of_box;19doubleWidth_of_box;20doubleHeight_of_box;21};

1 //FirstGtest.cpp2#include"stdafx.h"3#include"gtest\gtest.h"4#include"CBox.h"56//CBox测试类,继承Test对Box进行测试使用7class CBox_test : public testing::Test8 {9protected:10CBox* c;11virtual void SetUp()12{13c =newCBox(2,3,4);14}1516virtual void TearDown()17{18deletethis->c;19}20};2122TEST(CBox, case1)23{24CBox box1{78.0,24.0,18.0};25CBox box2;26EXPECT_LT(23.0, box1.volume());27}2829TEST_F(CBox_test, case2)30{31EXPECT_EQ(4, c->volume());32}3334intmain(intargc, char* argv[])35{36testing::InitGoogleTest(&argc, argv);37returnRUN_ALL_TESTS();38}

1 //CBox.cpp2#include"stdafx.h"3#include4 #include"CBox.h"56usingnamespace std;78//构造函数定义,包含3个参数:9CBox::CBox(double length_value, double width_value, double height_value)10{11cout <<"Constructor called."<< endl;12Length_of_box = length_value;13Width_of_box = width_value;14Height_of_box = height_value;15}1617//默认构造函数18CBox::CBox()19{20cout <<"Default constructor is called."<< endl;21}222324// 计算Box体积函数25double CBox::volume()26{27returnLength_of_box * Width_of_box * Height_of_box;28}

三、遇到的问题及解决办法

在生成两个gtestd.lib文件时,编译器报“不是有效的Win32应用程序”,因为之前写的程序都是生成可执行程序,而没有做过只生成库文件的程序,本能地以为程序出错了,之后经过查阅资料和以及进一步地深入研究,发现这里只是生成了依赖库文件(我们也只需要这个库),并没有生成可执行文件,所以那是正常的。

配置googletest依赖库时,“配置属性 -> C/C++ -> 代码生成”中的【运行库】,前后没有设置相同的模式,从而导致找不到对应的库的情况。

在配置googletest时,修改“配置属性 -> 链接器 -> 输入”中的【附加依赖项】时,只填到了我们所生成的库文件的目录,但是没有添加文件名,报找不到*.obj文件的错误,只需要把路径填写到库文件就可以解决这个问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容