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

来源:互联网 发布:mac install ipython 编辑:程序博客网 时间:2024/05/18 02:27

在了解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的高级使用方法。

原创粉丝点击