- 浏览: 664562 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sztime:
可以在文本框上绑定事件来禁用回车键, 我就是这样做的.在IE中 ...
form 回车自动提交问题 -
damoqiongqiu:
非常好的文章,很透彻不过有一句话小僧腆着脸补充一下:“1111 ...
为什么要用补码来做存储 -
wuyizhong:
原来如此啊。
form 回车自动提交问题 -
luliangy:
谢楼主~!
用C语言扩展Python的功能 -
kwong:
很有用,谢谢
火狐和IE 对css 样式解释的差异
安装:
下载Google C++ Testing Framework
,解压...
VC2005:
直接打开msvc\gtest.vcproj或msvc\gtest.sln,直接编译即可。
Linux/Unix下的GCC:
传统过程:./configure make
Mingw:
BCC:
用Mingw和BCB6编译需要修改一些代码,过几天我会上传到www.cppprog.com
网站上。
使用:
首先#include <gtest/gtest.h>,当然工程的头文件路径要设置正确
1.简单测试TEST
#include <gtest/gtest.h> int Factorial( int n ) { if(n==2) return 100; //故意出个错,嘻嘻 return n<=0? 1 : n*Factorial(n - 1); } //用TEST做简单测试 TEST(TestFactorial, ZeroInput) //第一个参数是测试用例名,第二个参数是测试名:随后的测试结果将以"测试用例名.测试名"的形式给出 { EXPECT_EQ(1, Factorial(0)); //EXPECT_EQ稍候再说,现在只要知道它是测试两个数据是否相等的就行了。 } TEST(TestFactorial, OtherInput) { EXPECT_EQ(1, Factorial(1)); EXPECT_EQ(2, Factorial(2)); EXPECT_EQ(6, Factorial(3)); EXPECT_EQ(40320, Factorial(8)); } int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc,argv); //用来处理Test相关的命令行开关,如果不关注也可不加 RUN_ALL_TESTS(); //看函数名就知道干啥了 std::cin.get(); //只是让它暂停而已,不然一闪就没了 return 0; }
2.多个测试场景需要相同数据配置的情况,用TEST_F
//用TEST_F做同配置的系列测试 typedef std::basic_string<TCHAR> tstring; struct FooTest : testing::Test { //这里定义要测试的东东 tstring strExe; //可以利用构造、析构来初始化一些参数 FooTest() {} virtual ~FooTest() {} //如果构造、析构还不能满足你,还有下面两个虚拟函数 virtual void SetUp() { // 在构造后调用 strExe.resize(MAX_PATH); GetModuleFileName(NULL, &strExe[0], MAX_PATH); } virtual void TearDown() { } // 在析构前调用 }; tstring getfilename(const tstring &full) //偶写的从完整路径里取出文件名的函数(路径分隔符假定为'\\') { return full.substr(full.rfind(_T('\\'))); } tstring getpath(const tstring &full) //偶写的从完整路径里取出路径名的函数(Windows路径) { return full.substr(0, full.rfind(_T('\\'))); } TEST_F(FooTest, Test_GFN) //测试getfilename函数 { EXPECT_STREQ(_T("Projectexe"), getfilename(strExe).c_str()); } TEST_F(FooTest, Test_GP) //测试getpath函数 { EXPECT_STREQ(_T("D:\\Code\\libs\\google\\gtest-1\\BCC_SPC\\bcc\\ex"), getpath(strExe).c_str()); } int main(int argc, TCHAR* argv[]) //主函数还是一样地 { testing::InitGoogleTest(&argc,argv); RUN_ALL_TESTS(); std::cin.get(); return 0; }
快速入门:
Google提供了两种断言形式,一种以ASSERT_开头,另一种以EXPECT_开头,它们的区别是ASSERT_*一旦失败立马退出,而EXPECT_还能继续下去。
断言列表:
真假条件测试:
致命断言 | 非致命断言 | 验证条件 |
ASSERT_TRUE(condition ); | EXPECT_TRUE(condition ); | condition 为真 |
ASSERT_FALSE(condition ); | EXPECT_FALSE(condition ); | condition 为假 |
数据对比测试:
致命断言 | 非致命断言 | 验证条件 |
ASSERT_EQ(期望值 , 实际值 ); | EXPECT_EQ(期望值 , 实际值 ); | 期望值 == 实际值 |
ASSERT_NE(val1 , val2 ); | EXPECT_NE(val1 , val2 ); | val1 != val2 |
ASSERT_LT(val1 , val2 ); | EXPECT_LT(val1 , val2 ); | val1 < val2 |
ASSERT_LE(val1 , val2 ); | EXPECT_LE(val1 , val2 ); | val1 <= val2 |
ASSERT_GT(val1 , val2 ); | EXPECT_GT(val1 , val2 ); | val1 > val2 |
ASSERT_GE(val1 , val2 ); | EXPECT_GE(val1 , val2 ); | val1 >= val2 |
字符串(针对C形式的字符串,即char*或wchar_t*)对比测试:
致命断言 | 非致命断言 | 验证条件 |
ASSERT_STREQ(expected_str , actual_str ); | EXPECT_STREQ(expected_str , actual_str ); | 两个C字符串有相同的内容 |
ASSERT_STRNE(str1 , str2 ); | EXPECT_STRNE(str1 , str2 ); | 两个C字符串有不同的内容 |
ASSERT_STRCASEEQ(expected_str , actual_str ); | EXPECT_STRCASEEQ(expected_str , actual_str ); | 两个C字符串有相同的内容,忽略大小写 |
ASSERT_STRCASENE(str1 , str2 ); | EXPECT_STRCASENE(str1 , str2 ); | 两个C字符串有不同的内容,忽略大小写 |
TEST宏:
TEST宏的作用是创建一个简单测试,它定义了一个测试函数,在这个函数里可以使用任何C++代码并使用上面提供的断言来进行检查。
TEST的第一个 参数是测试用例名,第二个 参数是测试用例中某项测试的名称。一个测试用例可以包含任意数量的独立测试。这两个参数组成了一个测试的全称。
就前面的例子来说:
我们要测试这个函数:int Factorial(int n); // 返回n的阶乘
我们的测试用例是:测试输入0的情况,测试输入其它数据的情况,于是就有了:
- TEST(TestFactorial, ZeroInput) //第一个参数是测试用例名,第二个参数是测试名:随后的测试结果将以"测试用例名.测试名"的形式给出
- {
- EXPECT_EQ(1, Factorial(0)); //EXPECT_EQ稍候再说,现在只要知道它是测试两个数据是否相等的就行了。
- }
- TEST(TestFactorial, OtherInput)
- {
- EXPECT_EQ(1, Factorial(1));
- EXPECT_EQ(2, Factorial(2));
- EXPECT_EQ(6, Factorial(3));
- EXPECT_EQ(40320, Factorial(8));
- }
Google Test根据测试用例来分组收集测试结果,因此,逻辑相关的测试应该在同一测试用例中;换句话说,它们的TEST()的第一个参数应该是一样的。在上面的 例子中,我们有两个测试,ZeroInput和OtherInput,它们都属于同一个测试用例TestFactorial。
TEST_F宏:
TEST_F宏用于在多个测试中使用同样的数据配置,所以它又叫:测试夹具(Test Fixtures)
如果我们的多个测试要使用相同的数据(如前例中,我们的Test_GFN和Test_GP都使用程序自身的完整文件名来测试),就可以采用一个测试夹具。
要创建测试固件,只需:
- 创建一个类继承自testing::Test。将其中的成员声明为protected:或是public:,因为我们想要从子类中存取夹具成员。
- 在该类中声明测试中所要使用到的数据。
- 如果需要,编写一个默认构造函数或者SetUp()函数来为每个测试准备对象。
- 如果需要,编写一个析构函数或者TearDown()函数来释放你在SetUp()函数中申请的资源。
- 如果需要,定义你的测试所需要共享的子程序。
当我们要使用固件时,使用TEST_F()替换掉TEST(),它允许我们存取测试固件中的对象和子程序:
TEST_F(test_case_name, test_name) {
... test body ...
}
与TEST()一样,第一个参数是测试用例的名称,但对TEST_F()来说,这个名称必须与测试夹具类的名称一样。
对于TEST_F()中定义的每个 测试,Google Test将会:
- 创建一个全新的测试夹具
- 通过SetUp()初始化它,
- 运行测试
- 调用TearDown()来进行清理工作
- 删除测试夹具。
注意,同一测试用例中,不同的测试拥有不同的测试夹具。Google Test不会对多个测试重用一个测试夹具,测试对测试夹具的改动并不会影响到其他测试。
调用测试
TEST()和TEST_F()向Google Test隐式注册它们的测试。因此,与很多其他的C++测试框架不同,你不需要为了运行你定义的测试而将它们全部再列出来一次。
在定义好测试后,你可以通过RUN_ALL_TESTS()来运行它们,如果所有测试成功,该函数返回0,否则会返回1.注意RUN_ALL_TESTS()会运行你链接到的所有测试——它们可以来自不同的测试用例,甚至是来自不同的文件。
当被调用时,RUN_ALL_TESTS()宏会:
- 保存所有的Google Test标志。
- 为一个测试创建测试夹具对象。
- 调用SetUp()初始化它。
- 在固件对象上运行测试。
- 调用TearDown()清理夹具。
- 删除固件。
- 恢复所有Google Test标志的状态。
- 重复上诉步骤,直到所有测试完成。
此外,如果第二步时,测试夹具的构造函数产生一个致命错误,继续执行3至5部显然没有必要,所以它们会被跳过。与之相似,如果第3部产生致命错误,第4部也会被跳过。
重要:你不能忽略掉RUN_ALL_TESTS()的返回值,否则gcc会报一个编译错误。这样设计的理由是自动化测试服务会根据测试退出返回码来 决定一个测试是否通过,而不是根据其stdout/stderr输出;因此你的main()函数必须返回RUN_ALL_TESTS()的值。
而且,你应该只调用RUN_ALL_TESTS()一次。多次调用该函数会与Google Test的一些高阶特性(如线程安全死亡测试thread-safe death tests)冲突,因而是不被支持的。
编写 main() 函数
你可以从下面这个模板开始:
- #include "this/package/foo.h"
- #include <gtest/gtest.h>
- namespace {
- // 测试Foo类的测试固件
- class FooTest : public testing::Test {
- protected :
- // You can remove any or all of the following functions if its body
- // is empty.
- FooTest() {
- // You can do set-up work for each test here.
- }
- virtual ~FooTest() {
- // You can do clean-up work that doesn't throw exceptions here.
- }
- // If the constructor and destructor are not enough for setting up
- // and cleaning up each test, you can define the following methods:
- virtual void SetUp() {
- // Code here will be called immediately after the constructor (right
- // before each test).
- }
- virtual void TearDown() {
- // Code here will be called immediately after each test (right
- // before the destructor).
- }
- // Objects declared here can be used by all tests in the test case for Foo.
- };
- // Tests that the Foo::Bar() method does Abc.
- TEST_F(FooTest, MethodBarDoesAbc) {
- const string input_filepath = "this/package/testdata/myinputfile.dat" ;
- const string output_filepath = "this/package/testdata/myoutputfile.dat" ;
- Foo f;
- EXPECT_EQ(0, f.Bar(input_filepath, output_filepath));
- }
- // Tests that Foo does Xyz.
- TEST_F(FooTest, DoesXyz) {
- // Exercises the Xyz feature of Foo.
- }
- } // namespace
- int main( int argc, char **argv) {
- testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
- }
testing::InitGoogleTest() 函数负责解析命令行传入的Google Test标志,并删除所有它可以处理的标志。这使得用户可以通过各种不同的标志控制一个测试程序的行为。关于这一点我们会在GTestAdvanced中 讲到。你必须在调用RUN_ALL_TESTS()之前调用该函数,否则就无法正确地初始化标示。
在Windows上InitGoogleTest()可以支持宽字符串,所以它也可以被用在以UNICODE模式编译的程序中。
Google test for mingw 下载:
http://www.cppprog.com/2009/0101/26.html
Google test for bcb 下载:
http://www.cppprog.com/2009/0101/27.html
发表评论
-
strlcpy 的历史
2012-11-05 18:51 711strlcpy 并不属于 ANSI C,至今也还不是标准 ... -
c中的移位操作
2012-04-12 18:18 1013位移位运算符是将数据看成二进制数,对其进行向左或向 ... -
为什么要用补码来做存储
2012-04-12 18:02 2242看了些补码的知识,摘抄了些,自己整理了些。 顺便带着两个 ... -
string 的 data() 和c_str()
2008-12-24 01:17 1258data 是字符数组,里面有 '\0 '当然也不会 ... -
C/C++ unit testing tools (18 found)
2008-12-19 01:27 1980C/C++ unit testing tools (18 f ... -
climits中的符号常量
2008-12-10 11:43 1153climits中的符号常量 符号常量 ... -
ICE初次
2008-09-02 01:48 1902按照某人的说法:跨平台的C++网络编程ICE才是王道。于是,我 ... -
对 pthread_cond_wait 的错误理解
2008-08-28 15:52 2100在线程的调度中经常会用到 pthread_cond_wait ... -
环形缓冲
2008-08-27 17:20 962/** * Copyright (c) 2008, ×××研 ... -
Linux下C语言编程的 RPC远程调用编程
2008-07-17 15:38 3424在查看libc6-dev软件包提供的工具(用 dpkg -L ... -
C++中重载操作符时什么时候定义成友元,什么时候定义为成员方法
2008-07-10 18:05 3552在C++语言中,可以用关键字operator加上运算符来表示函 ... -
c++中的存储类型
2008-07-06 00:46 1923存储类型是从变量的存 ... -
libevent 一个time server
2008-05-19 11:20 1307#include <netinet/in.h> # ... -
自己动手改写komodo sourcetree插件 对C/C++的支持
2008-04-16 22:11 1405其实很简单了, 找到sourcetree.js 的 ... -
GNU C的 __attribute__ 机制
2008-04-15 15:34 776GNU C 的一大特色(却不被初学者所知)就是 __attri ... -
module的认识和写法
2008-04-15 15:29 722不知道在什幺时候,Linux 出现了 module 这种东西, ... -
dynamic_cast、static_cast、const_cast 和 reinterp
2008-04-10 15:16 1393dynamic_cast、static_cast、co ... -
static_cast、dynamic_cast、reinterpret_cast、和const_c
2008-04-10 15:14 6244static_cast、dynamic_cast、reinte ... -
关于Linux下C/C++程序编译
2007-08-23 18:15 3688在编译之前我们需要 ... -
使用 setfill、setw 和 setprecision 基数的示例
2007-08-23 19:00 2732使用 setfill、setw 和 setprecision ...
相关推荐
- [gtest-1.3.0.tar.gz](http://googletest.googlecode.com/files/gtest-1.3.0.tar.gz) - [gtest-1.3.0.tar.bz2](http://googletest.googlecode.com/files/gtest-1.3.0.tar.bz2) 建议直接在 Google 搜索引擎中搜索 ...
本文档将详细介绍Google Test框架的使用方法,包括基本概念、断言、测试套件、测试用例、固定参数测试、测试 fixture、模拟(gmock)等内容。 一、基本概念 1. 测试点:测试点是测试用例中的最小可测试单元,通常...
在"Qt使用Google Test项目"中,我们将探讨如何在Qt项目中集成Google Test,以便利用其强大的测试能力。首先,我们需要在Qt项目中添加Google Test库。这可以通过下载Google Test源码,将其编译并链接到项目中来实现。...
"Windows" 表明这是在Windows操作系统环境下使用的,而 "gtest" 和 "googletest" 是指Google Test的两个常见别名,它们是同一种测试框架。 在压缩包子文件的文件名称列表中,虽然只有一个条目 "GTEST",但通常这...
首先需要从官方网站下载最新版本的Google Test:`http://code.google.com/p/googletest/downloads/list`。下载完成后,将压缩包解压到一个方便的位置,例如`C:\gtest`。务必记住这个路径,后续步骤中会用到。 2. *...
前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错。 我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好...
`googletest-release-1.10.0.tar.gz` 是一个包含谷歌开发的 C++ 测试框架 Google Test 的源代码包。Google Test,通常简称为 GTest,是 C++ 开发人员广泛使用的单元测试库,它使得编写和运行代码测试变得简单而高效...
Googletest 是一个广泛使用的 C++ 测试框架,它为开发者提供了编写单元测试和集成测试的强大工具。这个源码包含 Googletest 的核心组件,使得我们可以深入了解其内部实现,学习如何构建高效的测试框架。 Googletest...
这个“googletest-main”压缩包文件可能包含了编译和运行Gtest所需的资源,特别是针对Windows环境下的Visual Studio 2015(VS2015)以及使用CMake构建系统的情况。下面我们将详细讨论如何在Windows上利用VS2015和...
`googletest.zip` 是一个包含Google Test(通常简称为gtest)框架源代码的压缩文件。Google Test是Google开发的一个开源C++测试框架,用于编写C++程序的单元测试。这个框架提供了丰富的断言和测试工具,使得测试更加...
在"googletest-release-1.12.1.tar.gz"这个压缩包中,包含的是Google Test框架的1.12.1版本。 Google Test的设计理念是使测试尽可能简单、灵活且可扩展。它提供了断言(assertions)来检查代码行为,测试套件(test...
安装和使用`googletest`通常涉及以下步骤: 1. 解压缩下载的`googletest-1.14.0`文件。 2. 配置和构建`gtest`和`gmock`,这可能涉及到使用CMake或其他构建工具。 3. 将生成的库文件链接到你的项目中。 4. 在你的测试...
Google C++ Testing Framework: Google C++测试...# wget http://googletest.googlecode.com/files/gtest-1.5.0.tar.gz # tar -zxvf gtest-1.5.0.tar.gz # cd gtest-1.5.0 # ./configure # make # make install
在本文中,我们将探讨如何在Windows环境下配置和使用GoogleTest。 首先,为了配置GoogleTest,我们需要安装以下两个关键组件: 1. **MinGW**: MinGW(Minimalist GNU for Windows)是一个可移植的GCC(GNU ...
googletest测试用例
2. **配置构建系统**:使用CMake或其他构建系统设置`protobuf`和`googletest`的编译选项。 3. **编译库**:编译`protobuf`的源码,生成静态库或动态库。 4. **构建测试**:将`googletest`链接到`protobuf`的测试...
3. **断言使用**:GoogleTest提供多种断言,如`EXPECT_*`系列(不中断测试执行,但会报告失败)和`ASSERT_*`系列(如果失败则终止测试)。 4. **参数化测试**:使用`INSTANTIATE_TEST_SUITE_P`和`TEST_P`可以创建...
Google开源C++单元测试框架Google Test教程 第1章 Google开源C++单元测试框架Google Test教程 第1章 【资源说明】 1、该资源介绍Google开源C++单元测试框架Google Test教程 第一章。 2、第一章的主要内容为:GTest...
2. **测试图像处理库**:如果`googletest-.zip`包含了针对某个特定计算机视觉库的测试用例,那么开发者可能会使用 `googletest` 来测试图像处理函数,比如边缘检测、特征匹配、图像分类等,确保它们在各种输入下都能...
在"googletest-master"这个压缩包中,我们可以预期找到Google Test的源代码、头文件、构建脚本和可能的示例代码。开发者可以将这些源代码集成到自己的项目中,以便利用gtest进行单元测试。 以下是一些Google Test的...