GTest在VS2013中的使用

gtest是一个跨平台的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。

优秀的C/C++单元测试框架并不算少,相比之下gtest仍具有明显优势。与CppUnit比,gtest需要使用的头文件和函数宏更集中,并支持测试用例的自动注册。与CxxUnit比,gtest不要求Python等外部工具的存在。与Boost.Test比,gtest更简洁容易上手,实用性也并不逊色。

1、下载GoogleTest(Release版本)

地址:https://github.com/google/googletest,可以点击tags,选择Release版本

2、对GoogleTest进行编译

用vs2013打开gtest—-msvc—-gtest工程(双击gtest),弹出如下“单向升级”窗口,单击“确定”,会弹出“迁移报告”,关闭“迁移报告”即可。

打开解压后的googletest-release-1.6.0\msvc目录,这个是对VS的支持,选择目录中的gtest.sln,分别使用Debug/Relese版本进行编译生成gtestd.lib库、(存放于msvc中的Debug和Release生成目录)

用vs2013打开工程gtest;对gtest右键——>生成,即可生成gtestd.lib(这个是对应Debug的),还有一个gtest.lib(这个对应Release)

3、将两个文件夹下生成的lib拷贝出来,在include平行的目录下新建一个lib文件夹,将4个lib放在这里

4、项目配置

(1)新建一个项目,右键—>属性—>配置属性—>C/C++—>代码生成,查看右面的“运行库”,选择多线程调试(MTd),(注:为了和你打开的gtest.sln工程保持一致)

(2)配置所用头文件搜索的路径

(3)配置lib库的搜索路径(前面新建用于存放库的目录),这个路径就是我们之前创建的lib文件夹

(4)配置所使用的链接依赖项,将 gtest.lib, gtest_main.lib, gtestd.lib, gtest_maind.lib加入其中,结果如下所示:

(5)至此便完成了对项目的配置

5、细则介绍

(1)编译命令行中,gtest_mt.lib和gtest_main_mt.lib就是前面使用VC项目文件生成的静态库。有意思的是,测试代码不需要注册测试用例,也不需要定义main函数,这是gtest通过后一个静态库自动完成的,它的实现代码如下:

其中,函数InitGoogleTest负责注册需要运行的所有测试用例,宏RUN_ALL_TEST负责执行所有测试,如果全部成功则返回0,否则返回1。当然,我们也可以仅链接gtest_mt.lib,自己提供main函数。

6、测试固件

很多时候,我们想在不同的测试执行前创建相同的配置环境,在测试执行结束后执行相应的清理工作,测试固件(Test Fixture)为这种需求提供了方便。“Fixture”是一个汉语中不易直接对应的词,《美国传统词典》对它的解释是“(作为附属物的)固定装置;被固定的状态”。在单元测试中,Fixture的作用是为测试创建辅助性的上下文环境,实现测试的初始化和终结与测试过程本身的分离,便于不同测试使用相同代码来搭建固定的配置环境。用体操比赛的说法,测试过程体现了特定测试的自选动作,测试固件则体现了对一系列测试(在开始和结束时)的规定动作。有些讲单元测试的书籍直接把测试固件称为Scaffolding(脚手架)。

使用测试固件比单纯调用TEST宏稍微麻烦一些:

1.从gtest的testing::Test类派生一个类,用public或protected定义以下所有成员。

2.(可选)建立环境:使用默认构造函数,或定义一个虚成员函数virtual void SetUp()。

3.(可选)销毁环境:使用析构函数,或定义一个虚成员函数virtual void TearDown()。

4.用TEST_F定义测试,写法与TEST相同,但测试用例名必须为上面定义的类名。

每个带固件的测试的执行顺序是:

1.调用默认构造函数创建一个新的带固件对象。

2.立即调用SetUp函数。

3.运行TEST_F体。

4.立即调用TearDown函数。

5.调用析构函数销毁类对象。

从gtest的实现代码可以看到,TEST_F又从用户定义的类自动派生了一个类,因此要求public或protected的访问权限;大括号里的内容被扩展成一个名为TestBody的虚成员函数的函数体,因此可以在其中直接访问成员变量和成员函数。其实TEST也采用了相同的实现机制,只是它直接从gtest的testing::Test自动派生类,所以可以指定任意用例名。testing::Test类的SetUp和TearDown都是空函数,所以它只执行测试步骤,没有环境的创建和销毁。

7、简单案例

简单写了一个加法函数:

测试用例的撰写:

运行结果展示:

猜你喜欢

转载自blog.csdn.net/weixin_42067873/article/details/105741809