GoogleTest(基础篇)-1

简单介绍

GoogleTest 是一个由 Google 的测试技术团队开发的测试框架,它考虑到了谷歌的特定需求和限制。无论你使用的是 Linux、Windows 还是 Mac,只要你编写 C++ 代码,GoogleTest 都可以帮到你。它支持任何类型的测试,不只是单元测试。(以下称 googletest)

优点
1.测试应该是独立的且可重复的。调试由于其它测试而成功或失败的测试是令人痛苦的,googletest通过在不同的对象上运行每个测试用例来隔离测试。当测试失败时,googletest允许你单独运行它,以便快速调试。
1.Tests should be independent and repeatable. It's a pain to debug a test that succeeds or fails as a result of other tests. googletest isolates the tests by running each of them on a different object. When a test fails, googletest allows you to run it in isolation for quick debugging.

2.测试应该得到良好的组织,并反映测试代码的结构。googletest将相关的测试分组为测试套件,它们可以共享数据和子例程。这种常见的模式很容易接受,并且使测试很容易维护。这样的一致性在人们切换项目并开始工作在一个新的代码库上时尤其有用。
2.Tests should be well organized and reflect the structure of the tested code. googletest groups related tests into test suites that can share data and subroutines. This common pattern is easy to recognize and makes tests easy to maintain. Such consistency is especially helpful when people switch projects and start to work on a new code base.

3.测试应该是可移植的且可复用的。Google 具有大量的平台无关的代码,它的测试也应该是平台无关的。googletest适用于不同的操作系统,不同的编译器,有异常或没有异常,所以 googletest测试可以使用多种配置。
3.Tests should be portable and reusable. Google has a lot of code that is platform-neutral; its tests should also be platform-neutral. googletest works on different OSes, with different compilers, with or without exceptions, so googletest tests can work with a variety of configurations.

4.当测试失败时,它们应该提供尽可能多的关于故障的信息。googletest 不会在第一个测试失败时停止。相反,它仅停止当前的测试并继续运行下一个。你还可以设置测试报告非致命故障,在此之后,当前测试将继续运行。这样,你可以在一个运行-编辑-编译周期中探测并解决多个 bug。
4.When tests fail, they should provide as much information about the problem as possible. googletest doesn't stop at the first test failure. Instead, it only stops the current test and continues with the next. You can also set up tests that report non-fatal failures after which the current test continues. Thus, you can detect and fix multiple bugs in a single run-edit-compile cycle.

5.测试框架应该将测试编写者从家务活中解放出来,并让他们将精力集中在测试内容上。googletest 自动追踪所有定义的测试,且无需用户以运行它们的顺序迭代它们。
5.The testing framework should liberate test writers from housekeeping chores and let them focus on the test content. googletest automatically keeps track of all tests defined, and doesn't require the user to enumerate them in order to run them.

6.测试要快。通过 googletest,你可以跨测试用例复用共享资源,且只支付(执行)一次 set-up/tear-down 的开销,不使测试相互依赖。
6.Tests should be fast. With googletest, you can reuse shared resources across tests and pay for the set-up/tear-down only once, without making tests depend on each other.

基本概念

使用 googletest,最先写的就是断言(assertion)。断言是一种检查某个条件是否为真的描述。断言的结果可以是成功、非致命失败、致命失败。当致命失败发生时,当前函数将会终止;而断言的其他结果则不会有此效果。
Test 使用断言来判断测试代码的行为:如果一个 Test 崩溃了或者出现了一个失败的断言,则该 Test 就失败了;反之,它就是成功的。
Test case 包括一个或多个 Test。我们应当把 Test 打包、分组,放入 Test Case 中,以便测试代码的结构更加清晰。当一个 Test Case 中的多个 Test 需要共享对象和子程序时,我们可以把这些共享内容放入一个(test fixture)类中。
一个测试程序可以包含多个 Test Case。

基本断言

有两种断言可供我们使用:

ASSERT_* :当断言失败时,产生致命错误,并终止当前函数;
EXPECT_* :当断言失败时,产生非致命错误,并且不会终止当前函数。

第一个Demo

1.首先给一个googletest在github上的开源代码,在此基础上做一些操作。
https://github.com/google/googletest

2.打开下载好的googletest文件中的msvc文件夹运行.sln,选择gtest和gtest_main两个项目。分别编译debug和release两个版本,gtest文件夹下会有gtest_maind.lib、gtestd.lib、gtest.lib、gtest_main.lib。
共生成4个文件
googletest\msvc\2010\gtest\x64-Debug - Debug方案下的二进制文件:
gtestd.lib、gtest_maind.lib(注意主文件名的d后缀)
googletest\msvc\2010\gtest\x64-Release - Release方案下的二进制文件:
gtest.lib、gtest_main.lib
注意:如果是Release版本,Runtime Library(运行库)设为/MT。当然,其实你也可以选择动态链接(/MD),前提是你之前编译的gtest也使用了同样是/MD选项。(对于Debug和Release不清楚的看文章结尾有介绍)

3.在VS中,新建一个Win32 Console Application。接着就是设置工程属性,如下:

  • 修改vs中的解决方案配置,将其修改为和你要测试的工程配置相同,这里以“Debug x32”为例。
    (vs中,Debug和Release生成的lib库是不同的,分别为gtestd.lib和gtest.lib,两个是不同的,不可混用。)

  • 在解决方案资源管理器中修改工程的属性,确保配置为Debug x32。
    修改配置属性-C/C++-代码生成-运行库,将其修改为和你要测试的工程配置相同,这里以“多线程调试DLL(/MTd)”为例

4.将之前生成的.lib文件(只需要拷贝你需要的)然后添加你文件路径。
第一步:

第二步:

第三步:

到这里对于googletest的一些配置就完成了。

最后在你的程序中加入测试,然后运行。


#include "h.h"
#include ".\include\gtest\gtest.h"

TEST(testcase, test0)
{
    EXPECT_EQ(add(1, 23), 24);
}

int add(int a,int b)
{
    return a + b;
}

int main(int argc,char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    RUN_ALL_TESTS();
    getchar();
    return 0;
} 

讲一下Debug和Release版本的区别以及MTd和MDd
Debug 通常称为调试版本,它包含调试信息,容量比Release大很多,并且不作任何优化,便于程序员调试程序。(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂)Debug模式下生成两个文件,除了.exe或.dll文件外,还有一个.pdb文件,该文件记录了代码中断点等调试信息。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。Release模式下生成一个文件.exe或.dll文件

Debug 版本:
/MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)
/ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间

Release 版本:
/MD /ML 或 /MT 使用发布版本的运行时刻函数库
/O1 或 /O2 优化开关,使程序最小或最快
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改

实际上,Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译
器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调
试版本或是带跟踪语句的发布版本。

文章参考:https://github.com/google/googletest/blob/master/googletest/docs/primer.md
https://blog.csdn.net/liitdar/article/details/85712973
https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html

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

推荐阅读更多精彩内容