单元测试是一种保证代码质量的手段。程序员可以通过写单元测试来保证自己写的代码的功能正确。

本人所在公司使用GoogleTest测试框架来进行单元测试。虽然现在在公司的工程代码中写单元测试已经驾轻就熟,但是只是知其然不知其所以然,所以再此对Google Test测试框架进行一个全面的了解与学习。

本文只涉及Google Test的使用,不涉及对其源码的学习与解读。

Linux环境搭建Google Test测试环境

Google Test托管在github上,先通过git把Google Test拉取到本地

git clone https://github.com/google/googletest.git

Google Test 提供了多平台的构建方式,在Linux上推荐使用cmake来编译

cd googletest
cmake .

编译完成之后生成静态库,以后编译自己的单元测试需要链接这些静态库

最后,安装,将头文件和编好的库文件放在系统指定目录下,此步骤需要root权限

make install

安装完成之后,可以尝试编译运行Google Test自带的sample

cd googletest/googletest/make
make
./sample1_unittest

运行结果如图所示:

想要从头开始学些如何使用Google Test,去研究一下googletest/googletest/samples下的所有测试用例和googletest/googletest/doc目录下的指导文档,把这些搞清楚了,也就初步掌握了Google Test了。

基本测试

 

//myGtest.cpp
#include <gtest/gtest.h> int add(int a, int b) //待测试函数
{
return a + b;
} TEST(TestAdd, normal)//单元测试
{
EXPECT_EQ(, add(, ));
EXPECT_EQ(, add(, ));
} int main(int argc, char **argv)//初始化GoogleTest并运行所有单元测试
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

编译:

g++ myGtest.cpp -lgtest -lpthread -o myGtest

注意不仅要链接libgtest.a还要链接libpthread.a

运行结果:

可以看到测试结果,符合add函数的预期行为。

对于基本测试行为,必须包含以下的要素:

1. 测试文件必须包含头文件 gtest/gtest.h;

2. 单元测试函数使用宏 TEST,没有返回类型,有两个参数:第一个测试是测试用例名,第二个参数是本测试名;

3. 测试内容和逻辑需要你自己编写,GoogleTest提供了一系列的宏(类似于安断言)来判断你的代码是否符合预期结果;

4. 需要有一个main函数来初始化并执行所有测试,这个main函数的写法是固定的(由于其是固定的,也可以不写main函数,Google Test提供了一个写好的main 函数只要在链接时链接libgtest_main.a即可),RUN_ALL_TESTS()来执行所有的测试。返回值为0说明全部测试通过,1则说明有失败的测试。

Test Fixtures

有些地方也翻译作测试夹具,我感觉找不到对其合适的翻译。

就是将有相同的流程或使用相同数据的测试用例聚合起来,共享同一套流程或同一份数据,这套流程或数据会在每个测试用例运行之前和之后执行固定的操作。

待测试类:

//MyClass.hpp
class MyClass
{
public:
int add(int a, int b)
{
return a + b;
} int plus(int a, int b)
{
return a * b;
}
};

测试:

//myGtest.cpp
#include <gtest/gtest.h>
#include <iostream>
#include "MyClass.hpp" class TestMyClass : public testing::Test //test fixture类
{
protected:
void SetUp() override//每个测试运行前调用
{
std::cout<<"test start"<<std::endl;
}
void TearDown() override//每个测试运行后调用
{
std::cout<<"test done"<<std::endl;
}
MyClass mc;
}; TEST_F(TestMyClass, testAdd)//测试用例1
{
EXPECT_EQ(, mc.add(, ));
} TEST_F(TestMyClass, testPlus)//测试用例2
{
EXPECT_EQ(, mc.plus(, ));
} int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

运行结果:

可以看到测试结果,符合MyClass类的类方法的预期。并且在测试开始和结束时打印出来我们想要的提示信息

当一个测试执行时会发生以下事件:

1. GTest构造TestMyClass对象(我们称之为t1)。

2. t1.SetUp()函数初始化t1。

3. t1的第一个测试testAdd执行。

4. 在测试执行完后调用t1.TearDown()清理现场。

5. t1被析构。

6. 以上步骤重复一遍,这一轮是执行测试testPlus

使用Test Fixtures可以讲一些流程重复或者数据重用的测试用例聚合起来,更方便编写和维护

对于Test Fixtures而言,具有一下几个要素:

1. 从::testing::Test集成一个类。根据我们希望访问子类的fixture成员的权限,限定为protected或public

2. 在类中,定义任何你想使用的对象

3. 如果需要,实现默认的构造函数或SetUp()函数来为每个测试准备数据

4. 如果需要,实现析构函数和TearDown函数来释放SetUp()函数分配的资源

5. 如果需要,请自定义测试需要共享的函数

6. 使用时,用TEST_F代替TEST(在使用TEST_F前必须先定义好Test Fixtures 类)

7. TEST_F无返回值,有两个参数,第一个是Test Fixtures 类名,第二个是测试名

相关链接:

https://github.com/google/googletest/blob/master/googletest/docs/primer.md

https://www.cnblogs.com/panda_lin/p/gtest_primer.html

GoogleTest初探(0)的更多相关文章

  1. Arcade初探[0] 目录与导航

    2017年6月,ESRI开发者页面出现了一个新玩意儿:Arcade. 连接:点我 这是什么东西呢?有什么用呢? 1. 是什么 Arcade一种表达语言,可以在ArcGIS平台上使用.不管是编写简单的脚 ...

  2. GoogleTest初探(1)

    此篇主要了解一下GoogleTest中的断言. 总的来说,GoogleTest中的断言分为两大类:EXPECT_*和ASSERT_*,这两者在测试成功或失败后均会给出测试报告,区别是前者在测试失败后会 ...

  3. GoogleTest初探(2)

    前面的随笔介绍了Google Test中的基本测试单元TEST和测试夹具TEST_F,此篇介绍区别于这两种测试的参数化测试TEST_P 当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多 ...

  4. GoogleMock初探(0)

    在进行测试过程中,待测的类或者方法经常会依赖其他类或方法的实现.如果此时这些依赖还没有实现,则需要打桩.另外测试讲求独立,测试之间的互相依赖会导致测试最终混乱不堪. GoogleMock提供一套方法来 ...

  5. Spring入门(9)-AOP初探

    Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...

  6. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  7. ZAM 3D 制作3D动画字幕 用于Xaml导出

    原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...

  8. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  9. osg编译日志

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

随机推荐

  1. 设置Web AppBuilder的HTTP代理

    在使用Web AppBuilder快速搭建webgis应用时,我们往往需要访问外部互联网的在线gis服务资源.假如要通过代理服务器才能访问互联网的在线gis服务资源,那么则需要预先配置web appb ...

  2. 如何在FineReport中解析数据库内XML文件

    在数据库表中,其中字段XML所存的为xml格式数据在表xmltest中.那么在使用该表进行报表制作时,需要将存于xml字段中的值读取出来作为报表数据源. XML每条记录数据格式如下: <Fiel ...

  3. SVN的正确提交方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Rundy_Deng/article/details/80338093 也会让我们百思不得其解,甚至耽 ...

  4. java字节码文件指令集

    网上找的没有指令码这列  自己把它加上 更方便查阅 指令从0x00-0xc9 没有0xba 常量入栈指令 指令码 操作码(助记符) 操作数 描述(栈指操作数栈) 0x01 aconst_null nu ...

  5. [翻译] FSLineChart

    FSLineChart A line chart library for iOS. 一个iOS的线状图控件. Installing FSLineChart - 安装 Add the contents ...

  6. CSS制作图形速查表

    很少会有人意识到,当浏览器绘制的border,会有一个角度的问题.我们就是得用这样的一个技巧来制作三角的效果.我们只需要保证一边的边框是有色,其他边框色为透明色,这样我们就很容易制作出三角形,然后改变 ...

  7. [BZOJ 3514]Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES)

    [BZOJ3514] Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES) 题意 \(N\) 个点 \(M\) 条边的无向图,\(K\) 次询问保 ...

  8. [Codeup 25481] swan

    莫名其妙还找到了另一个铟炔锶烃的OJ : Codeup墓地 25481: swan 时间限制: 1 Sec  内存限制: 128 MB献花: 86  解决: 13[献花][花圈][TK题库] 题目描述 ...

  9. BT提权wind2008R2

    昨天中午打开电脑,对着菜刀在那翻啊翻,找到一个64bit的os. 因为这个ip不在曾经提权过的主机列表里面,心想这应该是个低权限的网站,顺手打个whoami试试,结果给我返回了"nt aut ...

  10. css3 网格背景

    background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(.25, rgba(255, 255, 255, .2)), ...