gtest框架使用
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,数值型比较:
EXPECT_EQ(1, min(1,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比较
EXPECT_TRUE(true);//可以通过
EXPECT_FALSE(true);//不可以通过
对于这种true,false测试可以打印传入的参数。
EXPECT_PRED2(MutuallyPrime, m, n);//yes
3,字符串比较
//字符串 不区分大小写比较
EXPECT_STRCASEEQ("how", "how");//yes
EXPECT_STRCASEEQ("how", "HOW");//yes
EXPECT_STRCASEEQ("how", "how are");//no
//字符串 区分大小写比较
EXPECT_STREQ("how", "how");//yes
EXPECT_STREQ("how", "HOW");//no
EXPECT_STREQ("how", "how are");//no
4,案例失败时候能够精确定位问题所在
int n = -1;
bool actualResult = Foo::Dosometing(n);
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方法 )
全局级别的:
//全局事件
class FooEnvironment : public testing::Environment
{
public:
virtual void SetUp()
{
std::cout << "Foo FooEnvironment SetUP" << std::endl;
}
virtual void TearDown()
{
std::cout << "Foo FooEnvironment TearDown" << std::endl;
}
};
在main函数中添加:
testing::AddGlobalTestEnvironment(new FooEnvironment());
class FooTest : public testing::Test
{
protected:
static void SetUpTestCase(){ cout << "SetUpTestCase" << endl;}
static void TearDownTestCase(){ cout << "TearDownTestCase" << endl;}
static int m_nShareAllCaseInt;//此变量为一个testsuit的所有case公有
protected:
virtual void SetUp(){ cout << "SetUp" << endl;}
virtual void TearDown(){ cout << "TearDown" << endl;}
int m_nCaseInt;//此变量为每一个case自己所有
};
int FooTest::m_nShareAllCaseInt=100;
//仔细分析c++的静态成员变量和普通成员变量就明白了,m_nShareAllCaseInt为类的成员变量,为公有;m_nCaseInt为对象成员变量,每一个对象自己所有
//TEST_F实际上是创建了一个类继承于FooTest,同时创建了此类的对象。因此下面两个TEST_F公有一个静态成员变量,各自私有m_nCaseInt
TEST_F(FooTest, Test0){ cout << "Test0" << endl;}
TEST_F(FooTest, Test1){ cout << "Test1" << endl;}
//-----------------------------------------------------------------------------
//批量参数测试
class ParamTest : public::testing::TestWithParam<int>
{
};
TEST_P(ParamTest, aLotTest)
{
int n = GetParam();
int m = GetParam();
cout<<"m="<<m<<" n="<<n<<endl;
EXPECT_TRUE(m == n);
}
INSTANTIATE_TEST_CASE_P(EqualParamTest, ParamTest, testing::Values(1, 10, 100, 1000, 10000));//参数生成器
//批量化测试:
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)作为一个参数。
//-----------------------------------------------------------------------------
//简单白盒测试例子
class Foo//待测试类
{public:
Foo(void): sum(0){}
void add(int num){ sum += num;}
void print(){ std::cout << sum << std::endl;}
friend class unittest_Foo;//声明友类
private:
int sum;//私有变量
};
class unittest_Foo : public testing::Test
{public:
static void test_foo() {//可以任意访问A的私有变量和私有函数
Foo a; ASSERT_EQ(a.sum, 0);
a.add(0); ASSERT_EQ(a.sum, 0);
a.add(100); ASSERT_EQ(a.sum, 100);}
};
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框架使用的更多相关文章
- gtest框架
解析gtest框架运行机制 1.前言 Google test是一款开源的白盒单元测试框架,据说目前在Google内部已在几千个项目中应用了基于该框架的白盒测试. 最近的工作是在搞一个基于gtest ...
- linux下使用gtest框架进行c/c++单元测试
linux下使用gtest框架进行c/c++单元测试 前言 关于此次开发工具的选择,因为我最近尝试在linux下使用vim进行c/c++编程,且之前已经对vim进行了相关的配置,所以这里应作业要求直接 ...
- 解析gtest框架运行机制
前言 Google test是一款开源的白盒单元测试框架,据说目前在Google内部已在几千个项目中应用了基于该框架的白盒测试. 最近的工作是在搞一个基于gtest框架搭建的自动化白盒测试项目,该项目 ...
- Google C++单元测试框架---Gtest框架简介(译文)
一.设置一个新的测试项目 在用google test写测试项目之前,需要先编译gtest到library库并将测试与其链接.我们为一些流行的构建系统提供了构建文件: msvc/ for Visual ...
- Google C++单元测试框架GoogleTest(总)
之前一个月都在学习googletest框架,对googletest的文档都翻译了一遍,也都发在了之前的博客里,另外其实还有一部分的文档我没有发,就是GMock的CookBook部分:https://g ...
- Google C++单元测试框架GoogleTest---GTest的Sample1和编写单元测试的步骤
如果你还没有搭建gtest框架,可以参考我之前的博客:http://www.cnblogs.com/jycboy/p/6001153.html.. 1.The first sample: sample ...
- 编写优美的GTest测试案例
http://www.cnblogs.com/coderzh/archive/2010/01/09/beautiful-testcase.html 使用gtest也有很长一段时间了,这期间也积累了一些 ...
- Ubuntu 16.04 c++ Google框架单元测试
环境:Ubuntu 16.04 在github网站上下载gtest框架:终端输入git clone https://github.com/google/googletest.git 然后找到 gool ...
- Gtest:Using visual studio 2017 cross platform feature to compile code remotely
参考:使用Visual Studio 2017作为Linux C++开发工具 前言 最近在学Gtest单元测试框架,由于平时都是使用Source Insight写代码,遇到问题自己还是要到Linux下 ...
随机推荐
- SVN使用方法总结
SVN使用方法 SVN版本管理模式:http://www.cnblogs.com/newstar/archive/2011/01/04/svn.html (集中式-trunk和分散式-branch ...
- Java的类演进过程
1.从面向过程到面向对象 在大家最熟悉的C语言中,如果要定义一个复杂的数据类型就用结构体(Struct)来实现,而为结构体的每个操作都定义一个函数,这个函数与结构体本身的定义没有任何关系.程序的重心集 ...
- org.apache.http.ProtocolException: Target host is not specified
对于httpClient4.3访问指定页面,可以从下面的demo抽取方法使用. 注意:对于URL必须使用 http://开始,否则会有如下报错信息: Caused by: org.apache.htt ...
- python的常用概念
常用的概念 主体字符串 主体列表 内置函数和方法的区别 映射表 引用 迭代器: 1. 字典:单步遍历迭代器 2. 文件:逐行读取的迭代器
- Hive QL 介绍
小结 本次课程学习了 Hive QL 基本语法和操作. 一.实验环境说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的 ...
- struts采用JavaServlet/JSP技术,实现了基于Java EEWeb应用的MVC设计模式的应用框架
今天我用Ecipse搭建Struts框架,并且使用Struts框架编写一个最简单的例子,相信读者能够很容易的明白. Struts是当今Java比较流行的三大框架之一,三大框架是Struts,sprin ...
- poj2828
很容易想到一种动态的做法:平衡树…… 或者是二分+树状数组 但,前者编程复杂度较大,而且据说会被卡(没试过):后者理论上超时(据说可以擦边过?): 所以要尝试新的算法: 倒着考虑,显然最后一个对象的位 ...
- 分享10个Js的小型库,效果真的很棒
1.$fx()简介:$fx()是一个轻量级的动画库,一些复杂的动画,可以由多个简单的动画效果进行组合,但是提供的是混淆压缩过的代码,对于研究动画源码的朋友可能特别不爽API:http://fx.ine ...
- 关于Memcache mutex设计模式的.net实现
之前在网上看过memcache-mutex的场景分析和实现代码,这里将.net方式加以实现,当然这里主要是依据原文的伪代码照猫画虎,以此做为总结及记录.如果您对相应实现感兴趣可以尝试使用本文提供的代码 ...
- [转载]C#基础-Func,Action
Func,Action 的介绍及其用法 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如 ...