提起白盒测试,很多程序员可能觉得就是个书上的概念,很多人写完代码根本没有具体的测试方案,自己觉得可行就提交了,其实这是个很危险的事情,毕竟出了bug,最后要加班的人还是你 ,因此做好白盒测试,100%的覆盖是很重要的.

事实上,VS中已经集成了单元测试框架.可是,要达到更广泛的测试目的,需要借助下外援了.

本文希望通过介绍由Google出品的Gmock和Gtest框架,帮助程序员完成单元测试.也是自己的学习记录

网上给的地址都在墙外,这里给个可以用的下载地址,1.7.0点这里

另外 附上1.8.0的Github,不得不说,自从有了github,码农的日子好了不少,特别是中国的码农.

整个框架并不大,只有几个文件.是的,如果测试框架都那么大,让真实的待测代码情何以堪.

  • 编译lib文件

    下载完成后,使用VS2008编译,在debug模式下编译的文件 ,主要使用的是gtest.lib和gmock.lib

这两个文件不是一起生成的,一个在Gmock的msvc下,另一个在gtest的msvc下,分别编译生成.

gtest

  • demo1构建

在VS2008中新建控制台程序,将gmock的include文件夹和gtest的include文件夹拷贝出来,放在一起,留在头文件库中使用.将生成的lib文件放入lib文件夹使用,这里可以自行放置.配置VS时定位到具体的位置即可;

需要特别主要的是,一定要将运行库设置为 多线程调试(MTd),因为文主是使用默认工程编译的gmock和gtest,其运行库就是MTd方式编译的.

然后在main函数的文件中 添加为如下代码:

#include <gtest/gtest.h>
int _tmain(int argc, _TCHAR* argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
return 0;
}

接下来,我们来试试水

新建一个cpp文件

测试代码

int funcForTest1(int i)
{
return i;
} TEST(FooTestCase1, Demo1Failed)
{
EXPECT_EQ(4, funcForTest1(6));
} TEST(FooTestCase2, Demo1Success)
{
EXPECT_EQ(6, funcForTest1(6));
}

这里故意做了一些区分,TEST宏的参数 含义为 [TestCaseName,TestName],EXPECT_EQ则标识相等的预期,以下是运行结果

[==========] Running 2 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 1 test from FooTestCase1
[ RUN ] FooTestCase1.Demo1Failed
e:\godertime\practicezone\unittestgogogo\demo1\demo1\dd1.cpp(11): error: Value of: funcForTest1(6)
Actual: 6
Expected: 4
[ FAILED ] FooTestCase1.Demo1Failed (2 ms)
[----------] 1 test from FooTestCase1 (5 ms total) [----------] 1 test from FooTestCase2
[ RUN ] FooTestCase2.Demo1Success
[ OK ] FooTestCase2.Demo1Success (0 ms)
[----------] 1 test from FooTestCase2 (2 ms total) [----------] Global test environment tear-down
[==========] 2 tests from 2 test cases ran. (19 ms total)
[ PASSED ] 1 test.
[ FAILED ] 1 test, listed below:
[ FAILED ] FooTestCase1.Demo1Failed 1 FAILED TEST

成功和失败是有颜色区分的.

测试结果表明,我们有一个测试失败了.而且标出了测试失败的位置.

  • 宏断言

一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:

  1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。

    常用: ASSERT_TRUE、 ASSERT_EQ、 ASSERT_STREQ
  2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。

    常用: EXPECT_FALSE、 EXPECT_NE、 EXPECT_STRNE

更多直接参考这里

这篇博文很全面介绍了gtest

gmock

测试一个模块的时候,可能涉及到和其他模块交互,可以将模块之间的接口mock起来,模拟交互过程。其作用就类似白盒测试中的打桩的概念。

gmock与gtest相辅相成,gtest测试真实的代码,而gmock则模拟真实的代码.在gtest测试时加入gmock代码也是受到google推荐的.

参考代码

class Cdd2
{
public:
Cdd2() {}
virtual ~Cdd2() {}
virtual std::string getAttrString() = 0;
virtual int getPosition(int parm) = 0; }; class MockCdd2:public Cdd2
{
public:
//0和1代表了参数的个数
MOCK_METHOD0(getAttrString,std::string());
MOCK_METHOD1(getPosition,int(int)); }; TEST(MockTestCase, Demo1)
{
int n = 100;
std::string value = "Hello World!";
MockCdd2 mockFoo; //期待运行1次,且返回值为value的字符串
EXPECT_CALL(mockFoo, getAttrString())
.Times(1)
.WillOnce(testing::Return(value));
std::string returnValue = mockFoo.getAttrString();
std::cout << "Returned Value: " << returnValue << std::endl; //期待运行两次,返回值分别为335 和 455
EXPECT_CALL(mockFoo, getPosition(testing::_))
.Times(2)
.WillOnce(testing::Return(335))
.WillOnce(testing::Return(455)); int val = mockFoo.getPosition(0); //355
int val2 = mockFoo.getPosition(1); //455
std::cout << "Returned Value: " << val <<" "<< val2 << std::endl;
}

运行结果:

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from MockTestCase
[ RUN ] MockTestCase.Demo1
Returned Value: Hello World!
Returned Value: 335 455
[ OK ] MockTestCase.Demo1 (17 ms)
[----------] 1 test from MockTestCase (19 ms total) [----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (28 ms total)
[ PASSED ] 1 test.

说明:虽然MockCdd2 继承于 Cdd2,但是其实并没有执行Cdd2的相关函数,而是MockCdd2的期望返回值,我们通过手动设置返回值的方式,达到了测试打桩的目的.

该文章中有项目中较为成熟的mock用法

更多参考

使用gmock白盒测试的更多相关文章

  1. 白盒测试之gmock入门篇

    一.gmock是什么 gmock是google公司推出的一款开源的白盒测试工具.gmock是个很强大的东西,测试一个模块的时候,可能涉及到和其他模块交互,可以将模块之间的接口mock起来,模拟交互过程 ...

  2. gTest&gMock learning

    在C++中,编写服务后的一种测试方式是使用google的gTest和gMock结合 之前写py,测试方式是将服务挂起,使用工具模拟请求发包,check resp,这样的缺点在于不方便,即使存下了所有的 ...

  3. 软件测试第六周学习笔记之“Win8 APP应用程序的白盒测试”

    这周的学习笔记我想写点自己关于实验中碰到的问题和感想. 因为这次做的是白盒测试,所以我决定去测试一下上回测试的app的功能函数. 这次我用的是单元测试项目来做的白盒测试: 创建单元测试的步骤: 1.点 ...

  4. 黑盒测试与白盒测试(Black box Testing)

    黑盒测试和白盒测试的优缺点 类别 优点 缺点 黑盒测试 不需要了解软件代码 从用户角度出发 无法保证代码内各个路径被覆盖到 白盒测试 强制测试开发工程师关注代码的具体实现 揭露隐藏在代码中的Bug 是 ...

  5. 白盒测试之初识gtest工具

    因为公司最近对软件产品质量提高了要求,之前项目组中黑盒测试方法就越来越无法满足公司的要求.虽然作为研发,但是也要求对白盒测试有一个系统的了解(毕竟之前没有系统的接触过白盒测试). 单元测试工具有很多种 ...

  6. 嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导

    在嵌入式平台上使用了gtest白盒测试工具,覆盖了被测函数,但是不知道自己测试的效果如何,测试行覆盖率.函数覆盖率,分支覆盖率的数据. 便开始研究gcov这个代码覆盖率工具能否使用,来检查白盒测试的效 ...

  7. 嵌入式平台使用gtest进行白盒测试

    看了coderzh大神写的gtest(http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html)使用的帖子,觉得gtest这个工具比 ...

  8. 实践作业3:白盒测试----我是如何写测试用例DAY6

    一开始接到写白盒测试的任务,我感觉挺难的,因为感觉之前我所想到的都是黑盒测试啊,说到测试系统逻辑,感觉就有些神秘的样子没有思路了,那黑盒和白盒写的到底有啥区别.后来我请教了实验室的一个同学,他虽然还没 ...

  9. .net白盒测试

    很久没写博客了,刚好这段时间空闲,做点记录 前提:最近部门需要白盒测试的工具,在网上也搜索了很多资料,国内很少有类似的资料(很少公司.net代码进行白盒测试),最后在国外(FQ)网站查找到了部分资料 ...

随机推荐

  1. COJS:1829. [Tyvj 1728]普通平衡树

    ★★★   输入文件:phs.in   输出文件:phs.out   简单对比 时间限制:1 s   内存限制:128 MB [题目描述] 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需 ...

  2. 原生的 promise 的局限性

    本文来自:https://ekyu.moe/article/limits-of-native-promise-and-async-await/ 众所周知,Nodejs 已原生支持 Promise 和 ...

  3. vim寄存器与复制粘贴的实现

    对于大多数在Ubuntu下使用vim作为常用编辑器的同学来讲,他们遇到的第一个比较大的麻烦来自于vim与外部应用的复制粘贴. 当然,愿意选择ubuntu以及vim的同学肯定是google好手.不幸的是 ...

  4. Java之JNDI详解

    转载自(http://blog.csdn.net/u010430304/article/details/54601302) JNDI的基本应用         JNDI是Java Naming and ...

  5. JSON and XML Serialization in ASP.NET Web API

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/json-and-xml-seri ...

  6. nginx作为TCP反向代理

    基于windows环境 基于nginx1.12.2版本 1. 解压nginx 2. 修改conf配置 # 打开conf/nginx,conf文件,写入以下配置 # upstream backend 里 ...

  7. 解题报告:hdu1257 LIS裸题

    2017-09-02 17:28:44 writer:pprp 那个裸题练练手,讲解在之前的博客中提到了 代码如下: /* @theme:hdu1257 @writer:pprp @begin:17: ...

  8. mysql中索引利用情况(explain用法)

    使用explain查看,如下 1.首先创建表test,语句如下 create table test(a int,b varchar(10),c varchar(10)); 2.在表中的a,b都创建索引 ...

  9. 使用unity2017.3 vuforia7摄像头放大的问题

    最近项目需要用到vuforia并且运行环境是Win10,所幸vuforia7刚好出来了,特此记录下开发中遇到的坑 1.从assets store下载示例,运行找不到vuforia命名空间 很多人说的解 ...

  10. 1-16-1 LVM管理和ssm存储管理器使用&磁盘配额

    大纲: 1-1- LVM逻辑卷的管理 1-2- SSM管理工具的使用 1-3- 磁盘配额技巧 ====================================== 问题描述: 当我们需要在一个 ...