您的位置:首页 > 编程语言 > C语言/C++

Goole C++ 单元测试框架(一)

2017-07-23 11:18 381 查看
在了解Goole C++单元测试框架之前,我们先来明确以下几个问题:

1.什么是单元测试?

单元测试一般由编码人员自己完成,它的目的是隔离程序部件,并证明这些单个部件满足预期的功能。在静态程序分析、代码检视之后进行单元测试,可以帮助我们在开发过程的早期发现问题。

2.好的测试具备以下特点:

(1)独立,即该测试用例的测试结果不受其他测试的影响;

(2)有效的组织架构,清晰的命名;

(3)可移植,可复用,在不同的操作系统、编译器间进行方便地移植;

(4)当用例失败时,提供尽可能多的有效信息,方便定位出bug.

3.如今有不少测试框架帮助我们完成单元测试,如:

针对C++的有Google Test、CppUnit;

针对C的有CUnit;

针对Java的有JUnit;

这些测试框架为我们实现独立、可移植、可复用、有组织的测试提供了条件,使我们能够专注于编写程序功能相关的测试代码。

4.下面介绍Gtest的使用方法

Google C++单元测试框架(简称Gtest),可在多个平台上使用(包括Linux, Mac OS X, Windows, Cygwin和Symbian),它提供了丰富的断言、致命和非致命失败判断,能进行值参数化测试、类型参数化测试、“死亡测试”。Gtest是一个开源的项目,我们可以下载下来使用的.

现在以windows下vs2013的环境介绍一下gtest的配置:

(1)先下载gtest,并解压。

目前gtest的最新版本为1.3.0,从下列地址可以下载到该最新版本:

http://googletest.googlecode.com/files/gtest-1.3.0.zip

http://googletest.googlecode.com/files/gtest-1.3.0.tar.gz

http://googletest.googlecode.com/files/gtest-1.3.0.tar.bz2

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

(3)用vs2013打开工程gtest;对gtest右键——>生成,即可生成gtestd.lib(这个是对应Debug的),还有一个gtest.lib(这个对应Release),可根据需要生成相应文件。

(4)编译之前注意检查的配置:对gtest右键—>属性—>配置属性—>C/C++—>代码生成,查看右面的“运行库”,选择多线程调试(MTd);此配置和下面的测试用例配置一样,保持一致。

(5)编写实例配置:

建立工程:

在VS2013,创建一个项目,为Visual C++ -> win32 控制台应用程序(win32 console application),命名为Test(任意),进入向导,直接完成即可以。

配置:

<1>对工程名右键->属性->配置属性->C/C++->常规->附加包括目录:添加gtest库路径下面的/gtest/include;

<2>对工程名右键->属性->配置属性->C/C++->代码生成->运行时库:与前面gtest配置一样,选择MTd;

<3>对工程名右键->属性->配置属性->链接器->输入->附加依赖项:输入gtest路径下的/msvc/gtest/Debug/gtestd.lib。

至此,配置就完成了,可以开始写测试用例了。

fun.h



fun.cpp



test.cpp

//#include "stdafx.h"   VS2013 中已包含
#include "gtest/gtest.h"
#include  "fun.h"
#include <tchar.h>   //若不包含,main中参数会报错

TEST(fun, case1)
{
EXPECT_LT(-2, fun(1, 2)); //EXPECT_* 系列的断言,当检查点                失败时,继续往下执行。
EXPECT_EQ(-1, fun(1, 2));
ASSERT_LT(-2, fun(1, 2)); //ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)
ASSERT_EQ(-1, fun(1, 2));
//对于第一行,int型比较,预期值为-2,实际值为fun(1,2)
}

int _tmain(int argc, _TCHAR* argv[])
{
//多个测试用例时使用,如果不写,运行RUN_ALL_TESTS()时会全部测   试,加上则只返回对应的测试结果
//testing::GTEST_FLAG(filter) = "test_case_name.test_name";
//测试初始化
testing::InitGoogleTest(&argc, argv);
//return RUN_ALL_TESTS();
RUN_ALL_TESTS();
system("PAUSE");
return 0;
}


现象:



该现象就说明该测试用例已经通过了!

上述测试用例用到过断言宏,下面简单说一下:

在gtest中,断言的宏可以理解分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:

(1) ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。

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

5.总结用一下本篇的内容:

(1) 使用VS编译gtest.lib文件

(2) 设置测试工程的属性(头文件,lib文件,/MT参数(和编译gtest时使用一样的参数就行了))

(3) 使用TEST宏开始一个测试案例,使用EXPECT_*,ASSER_*系列设置检查点。

(4)在Main函数中初始化环境,再使用RUN_ALL_TEST()宏运行测试案例。

优点:

虽然gtest本身的实现并不复杂,我们完全可以模仿gtest,但gtest的存在必然有其必要性。

(1) 我们的测试案例本身就是一个exe工程,编译之后可以直接运行,非常的方便。

(2) 编写测试案例变的非常简单(使用一些简单的宏如TEST),让我们将更多精力花在案例的设计和编写上,极大的提高了编写测试案例的效率。

(3) 提供了强大丰富的断言的宏,用于对各种不同检查点的检查。

(4) 提高了丰富的命令行参数对案例运行进行一系列的设置。

(5)gtest提高了非常完善的功能,并且简单易用。

关于gtest的基本使用就介绍到此,后期会介绍一些gtest的高级使用方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单元测试
相关文章推荐