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
现象:
该现象就说明该测试用例已经通过了!
上述测试用例用到过断言宏,下面简单说一下:
在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的高级使用方法。
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的高级使用方法。
相关文章推荐
- (转)玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest
- C++单元测试框架的比较
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
- 玩转Google开源C++单元测试框架Google Test系列(gtest)
- Google开源C++单元测试框架gTest 5:死亡测试
- 玩转Google开源C++单元测试框架Google Test系列(gtest)
- Google C++单元测试框架GoogleTest---Google Mock简介--概念及基础语法
- 玩转Google开源C++单元测试框架Google Test系列
- Google C++单元测试框架(Gtest)系列教程之三——测试固件(Test fixture)
- 【转】玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
- (转)玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
- Google C++单元测试框架(Gtest)系列教程之五——再论测试固件
- Google开源C++单元测试框架gTest 6:运行参数