gtest文档说明:

由于公司单元测试的需要,自己花了大半天时间下载了一个gtest框架,使用了一些测试例子,总览了coderzh的玩转gtest测试框架,又看了几篇gtest博客,写下了以下内容,作为备忘。毕竟我需要的简单的东西,太复杂了我自己很难回顾起来。在此很感谢coderzh,他的玩转google开源框架gtest系列的文章真的不错,极力推荐。链接地址:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html,这篇文件就比较深入了一些,适合深入研究的人看。

工程项目简介与基本配置:

1,改造了一下gtest的目录结构,与我们平常使用的工程目录接口相匹配

2,使用gtest库,需要头文件位于include\gtest目录下,需要lib文件位于lib\gtestd.lib。

3,注意工程配置需要配置成多线程调试模式,即MTd模式。vs20080->属性->配置属性->代码生成->运行时库->多线程调试(/MTd)

4,工程需要包含头文件include\gtest\gtest.h,需要包含库目录lib\gtestd.lib。

//-----------------------------------------------------------------------------

比较测试:

//基本代码框架

TEST(TestSuitEqualTest, TestCase1)

{


EXPECT_EQ(1, min(1,2));//可以通过

}

1,数值型比较:

  1. EXPECT_EQ(1, min(1,2));//可以通过
  2. EXPECT_EQ(1, min(10,2));//不可以通过

EXPECT_EQ传递的两个参数左边是期待的值,右边是自己的函数,即要测试的函数。

比较还有有一系列的函数如下:


//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual


//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2


//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2


//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2


//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2


//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2

断言assert与expect的区别是expect出现失败会在当前函数中继续运行下去,assert失败后退出当前函数,但是并不会退出整个程序。

2,bool值比较

//true false比较

  1. EXPECT_TRUE(true);//可以通过
  2. EXPECT_FALSE(true);//不可以通过

对于这种true,false测试可以打印传入的参数。

  1. EXPECT_PRED2(MutuallyPrime, m, n);//yes

3,字符串比较

//字符串 不区分大小写比较

  1. EXPECT_STRCASEEQ("how", "how");//yes
  2. EXPECT_STRCASEEQ("how", "HOW");//yes
  3. EXPECT_STRCASEEQ("how", "how are");//no

//字符串 区分大小写比较

  1. EXPECT_STREQ("how", "how");//yes
  2. EXPECT_STREQ("how", "HOW");//no
  3. EXPECT_STREQ("how", "how are");//no

4,案例失败时候能够精确定位问题所在

  1. int n = -1;
  2. bool actualResult = Foo::Dosometing(n);
  3. ASSERT_TRUE(actualResult) << "Call Foo::Dosometing(n) when n = " << n;

//-----------------------------------------------------------------------------

事件机制:

gtest提供了多种事件机制,以便在案例执行之前准备测试数据和测试之后释放相关资源。gtest的事件一共有3种:

全局的,所有案例执行前后(继承testing::Environment类,实现里面的SetUp和TearDown方法 )

TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后(继承testing::Test类,实现里面的SetUpTestCase和TearDownTestCase静态方法

TestCase级别的,每个TestCase前后(继承testing::Test类,实现里面的SetUp和TearDown方法 )

全局级别的:

//全局事件

  1. class FooEnvironment : public testing::Environment
  2. {
  3. public:
  4. virtual void SetUp()
  5. {
  6. std::cout << "Foo FooEnvironment SetUP" << std::endl;
  7. }
  8. virtual void TearDown()
  9. {
  10. std::cout << "Foo FooEnvironment TearDown" << std::endl;
  11. }
  12. };

在main函数中添加:

  1. testing::AddGlobalTestEnvironment(new FooEnvironment());
  1. class FooTest : public testing::Test
  2. {
  3. protected:
  4. static void SetUpTestCase(){ cout << "SetUpTestCase" << endl;}
  5. static void TearDownTestCase(){ cout << "TearDownTestCase" << endl;}
  6. static int m_nShareAllCaseInt;//此变量为一个testsuit的所有case公有
  7. protected:
  8. virtual void SetUp(){ cout << "SetUp" << endl;}
  9. virtual void TearDown(){ cout << "TearDown" << endl;}
  10. int m_nCaseInt;//此变量为每一个case自己所有
  11. };
  12. int FooTest::m_nShareAllCaseInt=100;

//仔细分析c++的静态成员变量和普通成员变量就明白了,m_nShareAllCaseInt为类的成员变量,为公有;m_nCaseInt为对象成员变量,每一个对象自己所有

//TEST_F实际上是创建了一个类继承于FooTest,同时创建了此类的对象。因此下面两个TEST_F公有一个静态成员变量,各自私有m_nCaseInt

  1. TEST_F(FooTest, Test0){ cout << "Test0" << endl;}
  2. TEST_F(FooTest, Test1){ cout << "Test1" << endl;}

//-----------------------------------------------------------------------------

//批量参数测试

  1. class ParamTest : public::testing::TestWithParam<int>
  2. {
  3. };
  4. TEST_P(ParamTest, aLotTest)
  5. {
  6. int n = GetParam();
  7. int m = GetParam();
  8. cout<<"m="<<m<<" n="<<n<<endl;
  9. EXPECT_TRUE(m == n);
  10. }
  11. INSTANTIATE_TEST_CASE_P(EqualParamTest, ParamTest, testing::Values(1, 10, 100, 1000, 10000));//参数生成器

//批量化测试:

  1. INSTANTIATE_TEST_CASE_P(PreName, myTest, testing::Values(1, 10, 100, 1000, 10000));

第一个参数是测试结束时进行打印的一系列测试案例的前缀,无限制。 
第二个参数是测试case的名称,需要和之前定义的参数化的类的名称相同,在这个例子里是myTest.

第三个参数就是参数生成器。除了上面的例子所使用的test::Values,gtest还提供了一系列的参数生成的函数:

Range(begin, end[, step]) 范围在begin~end之间,步长为step,不包括end

Values(v1, v2, ..., vN) v1,v2到vN的值

ValuesIn(container) and ValuesIn(begin, end) 从一个C类型的数组或是STL容器,或是迭代器中取值

Bool() 取false 和 true 两个值 

Combine(g1, g2, ..., gN) 这个比较强悍,它将g1,g2,...gN进行排列组合,g1,g2,...gN本身是一系列参数生成器,每次分别从g1,g2,..gN中各取出一个值,组合成一个元组(Tuple)作为一个参数。

//-----------------------------------------------------------------------------

//简单白盒测试例子

  1. class Foo//待测试类
  2. {public:
  3. Foo(void): sum(0){}
  4. void add(int num){ sum += num;}
  5. void print(){ std::cout << sum << std::endl;}
  6. friend class unittest_Foo;//声明友类
  7. private:
  8. int sum;//私有变量
  9. };
  10. class unittest_Foo : public testing::Test
  11. {public:
  12. static void test_foo() {//可以任意访问A的私有变量和私有函数
  13. Foo a; ASSERT_EQ(a.sum, 0);
  14. a.add(0); ASSERT_EQ(a.sum, 0);
  15. a.add(100); ASSERT_EQ(a.sum, 100);}
  16. };
  17. TEST_F(unittest_Foo, test_foo){ unittest_Foo::test_foo();}

//-----------------------------------------------------------------------------

//运行参数:

gtest提供多种方式来设置运行参数。其中使用命令行参数最为常用。

--gtest_filter :对执行的测试案例进行过滤,支持通配符

?    单个字符

*    任意字符

-    排除,如,-a 表示除了a

:    取或,如,a:b 表示a或b

比如下面的例子:

./foo_test 没有指定过滤条件,运行所有案例

./foo_test --gtest_filter=*   使用通配符,同样运行所有案例

./foo_test --gtest_filter=Foo.* 运行Foo案例集下所有案例

./foo_test --gtest_filter=Foo.test 运行案例Foo.test

--gtest_repeat :执行若干次

./foo_test -- gtest_repeat=5 重复执行5次

gtest框架使用的更多相关文章

  1. gtest框架

    解析gtest框架运行机制   1.前言 Google test是一款开源的白盒单元测试框架,据说目前在Google内部已在几千个项目中应用了基于该框架的白盒测试. 最近的工作是在搞一个基于gtest ...

  2. linux下使用gtest框架进行c/c++单元测试

    linux下使用gtest框架进行c/c++单元测试 前言 关于此次开发工具的选择,因为我最近尝试在linux下使用vim进行c/c++编程,且之前已经对vim进行了相关的配置,所以这里应作业要求直接 ...

  3. 解析gtest框架运行机制

    前言 Google test是一款开源的白盒单元测试框架,据说目前在Google内部已在几千个项目中应用了基于该框架的白盒测试. 最近的工作是在搞一个基于gtest框架搭建的自动化白盒测试项目,该项目 ...

  4. Google C++单元测试框架---Gtest框架简介(译文)

    一.设置一个新的测试项目 在用google test写测试项目之前,需要先编译gtest到library库并将测试与其链接.我们为一些流行的构建系统提供了构建文件: msvc/ for Visual ...

  5. Google C++单元测试框架GoogleTest(总)

    之前一个月都在学习googletest框架,对googletest的文档都翻译了一遍,也都发在了之前的博客里,另外其实还有一部分的文档我没有发,就是GMock的CookBook部分:https://g ...

  6. Google C++单元测试框架GoogleTest---GTest的Sample1和编写单元测试的步骤

    如果你还没有搭建gtest框架,可以参考我之前的博客:http://www.cnblogs.com/jycboy/p/6001153.html.. 1.The first sample: sample ...

  7. 编写优美的GTest测试案例

    http://www.cnblogs.com/coderzh/archive/2010/01/09/beautiful-testcase.html 使用gtest也有很长一段时间了,这期间也积累了一些 ...

  8. Ubuntu 16.04 c++ Google框架单元测试

    环境:Ubuntu 16.04 在github网站上下载gtest框架:终端输入git clone https://github.com/google/googletest.git 然后找到 gool ...

  9. Gtest:Using visual studio 2017 cross platform feature to compile code remotely

    参考:使用Visual Studio 2017作为Linux C++开发工具 前言 最近在学Gtest单元测试框架,由于平时都是使用Source Insight写代码,遇到问题自己还是要到Linux下 ...

随机推荐

  1. Altium designer中级篇-名称决定多边形连接样式

    在工作中积累了诸多小技巧,可以让工作变的更简单,就比如这个多边形铺铜,与大部分规则的不同之处在于,通过更改多边形的名称,就能达到控制多边形规则的效果.这样多边形铺铜变的及其灵活,下面将对这个经验做一个 ...

  2. SGU 101 AC

    总算AC了,好帅气的算法,同时解决了自环跟非连通,一种自下向上找环的算法过程,这里把欧拉回路讲得很清楚,赞. #include <iostream> #include <vector ...

  3. POJ2586——Y2K Accounting Bug

    Y2K Accounting Bug   Description Accounting for Computer Machinists (ACM) has sufferred from the Y2K ...

  4. window下gvim中文界面改变成英文界面

    中文环境下设置GVIM的界面.菜单.提示为英文语言 修改你的_vimrc,通常为类似C:\Program Files\Vim 加入以下语句至末尾 " set the menu & t ...

  5. thinkphp框架 中 ajax 的应用

    在thinkphp中,内置了ajax的方法,即: ajaxReturn("data","info","status"); data:传递的数 ...

  6. NFC(11)MifareUltralight格式规范及读写示例

    注意 MifareUltralight 不支三种过滤方式之一,只支持第四种(用代码,activity singleTop ) 见  NFC(4)响应NFC设备时启动activity的四重过滤机制 Mi ...

  7. Android-xUtils框架介绍(二)

    昨天对xUtils整体上做了一个简单的介绍,今天咱们就代码码起,真刀实枪的也看看,看看如何快速便捷的把xUtils给集成到大家的项目中去.xUtils中有四大组件可以供我们使用,分别是ViewUtil ...

  8. DataTable导出到Excel(.NET 4.0)

    最近在论坛里又看到很多关于DataTable(DataSet)导入Excel的帖子,我也温故知新一下,用VS2010重新整理了一个Sample.这个问题简化一下就是内存数据到文件,也就是遍历赋值,只不 ...

  9. windows官方多语言方案

    编写 Win32 多语言用户界面应用程序 Windows 2000 针对全球市场制定了新的增强支持标准,提供了许多国际化功能,例如完全支持 Unicode.预设支持数百种语言以及用于从右向左语言的镜像 ...

  10. java的四舍五入算法

    粗力度的四舍五入为整数 package math; public class MathRoundTest { /** * Math类中提供了三个与取整有关的方法:ceil,floor,round, * ...