[Investor Relations]  |  官方微博

C/C++培训

美国上市公司 · 亿元级外企Java培训企业

  • 全国服务监督电话400-827-0010
C++培训 > 资料库 > C++单元测试--打桩测试
  • C++单元测试--打桩测试

    发布:达内  来源:达内  时间: 2015年01月13日

  • C++单元测试--打桩测试...

  • 一 问题的产生

    当构造测试用例的数据,是在函数内部被另一个外部函数所使用时,我们需要忽略外部函数所带来的影响。

    需要进行"打桩",举一个具体的例子

    class DataGetter {

    public:

    ool Run();

    private:

    Client*  m_ptr_client;

    };

    ……

    ……

    bool DataGetter::Run() {

    std::string data;

    bool ret = m_ptr_client->GetData(data);

    }

    比如要对run这个函数进行单元测试,它内部调用了ptr_client->GetData(data)的方法,它是通过tcp协议从服务端取数据到data里,测试run这个函数,必然要构造data.

    如果不"打桩",要测试的话,我们就需要再从服务端去构造数据,而且还可能收到其他因素的影响。

    这时候"桩"就是很好的一种技术。

    那如何去构造"桩"呢。

    二 如何构造

    原理:利用c++ virtual的特性,改变m_ptr_client指针所指向的对象,重写一个"打桩"测试类。

    当然,前提是GetData的定义本身是virtual的。

    假设Client的定义如下

    class Client {

    ……

    public:

    virtual bool GetData(std::string& data);

    ……

    };

    我们只需要重写Getdata的方法,并且当参数data被传进来时,我们可以返回特定的值。

    这一套方法,google已经提供了很好的一套框架:gmock

    下面介绍一下它的用法

    #include "client.h" //被mock的类的头文件

    #include <GMOCK gmock.h>  // gmock 的头文件

    class MockClient : public Client {

    public:

    MockClient():Client() {}

    MOCK_METHOD1(GetData, bool(std::string&));

    }

    这里使用了一个宏MOCK_METHOD1

    原形是MOCK_METHOD#1(#2, #3(#4) )

    #1表示被mock的函数参数个数,#2表示被mock的函数名称,#3表示被mock的函数返回值,#4表示被mock的函数参数列表

    这样,一个"桩"就"打"好了。

    三 如何使用

    首先,要先改变m_ptr_client指向的对象,对于private的变量,在前一章有描述方法,

    然后测试的时候,直接将 m_ptr_client = new MockClient()即可,不过要记得释放它之前new的资源(如果有的话),不然就内存泄露了,哈哈

    使用gmock的几个宏,用一个例子简单介绍下:

    EXPECT_CALL( //mock被调用时,要发生的动作

    *m_ptr_client,  // 被mock的对象,看清楚,是对象,不是指针了

    GetData(test::_) // 被mock的方法,参数为占位符

    )。Times(2) // 表示被调用2次

    .WillOnce( 第一次调用

    testing::SetArgReferee<0>("test"), //设置第0个参数的值为"test"

    testing::Return(true), //设置返回值为true

    .WillOnce( 第二次调用

    testing::SetArgReferee<0>("test"), //设置第0个参数的值为"test"

    testing::Return(false), //设置返回值为false

    );

    四 总结

    测试的原则,尽量不修改被测函数,覆盖函数的每一个分支,保证外部条件都是正确的。

  • 上一篇:C语言培训:简单的客户端和服务端程序

    下一篇:C++:基于Policy的模板编程

网站导航
2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56