【工作经历:阿里巴巴搜索技术研发中心QA ,百度新产品测试部QA】 【领域:测试分析,自动化测试,性能测试,安全测试 】 【个人定位:高级测试工程师+培训师+领域产品专家】

baiduhook框架

上一篇 / 下一篇  2011-11-20 05:05:27 / 个人分类:单元测试

baiduhook是一个优秀的linux下的hook框架,也是百度的同事贡献给业界的一个非常优秀的工具。
百度很少开源自己的技术的,所以,对于这次的这种行为,是颇值得赞赏的。
所以我在此处转载,希望可以让更多的人了解。

这个框架的作用,就不大作介绍了。简单的,使用它,可以mock系统的任何函数。
虚函数,非虚函数,共有,私有,以及系统函数等。

这个方案里面,其实暗藏着一种c++单元测试领域的一个巨大创新。

众所周知,googletest和googlemock都是非常优秀的,但是googlemock自身是有限制的,它要求在开发编写的代码中,必须使用虚函数,才可以使用googlemock。这样会给平常的c++单元测试带来一定阻碍。
而使用baiduhook框架,就可以轻松的绕过google给我们的一个紧箍咒。


代码示例


请在文本框输入文字
/***************************************************************************
 *
 * Copyright (c) 2011 Baidu.com, Inc. All Rights Reserved
 *
 **************************************************************************/
 
 

#include<gtest/gtest.h>

#include"mylib.h"

#include"bhook.h"

//隐含类指针参数需要在hook函数中显示定义
intMyPublicSay(MyLib::Person*person)
{
       interr;
       intret=fault_fail("MyLib::Person::PublicSay",&err);
       if(ret==0){
                printf("\e[33;1m[=HOOK=] this is no PublicSay!\n\e[m");
               returnerr;
       }

       typedefint(*REAL_FUNC)(MyLib::Person*);
        REAL_FUNC old_func=(REAL_FUNC)get_real_func_lib("MyLib::Person::PublicSay");
       returnold_func(person);
}

intMyPrivateSay(MyLib::Person*person)
{
       interr;
       intret=fault_fail("MyLib::Person::PrivateSay",&err);
       if(ret==0){
                printf("\e[33;1m[=HOOK=] this is no PrivateSay!\n\e[m");
               returnerr;
       }

       typedefint(*REAL_FUNC)(MyLib::Person*);
        REAL_FUNC old_func=(REAL_FUNC)get_real_func_lib("MyLib::Person::PrivateSay");
       returnold_func(person);
}

TEST(Person,PublicSay)
{
       //enable
        fault_enable("MyLib::Person::PublicSay",100,-1);

       MyLib::Person*person=newMyLib::Person();

       intret=person->PublicSay();

        EXPECT_EQ(0,ret);

       deleteperson;
}

TEST(Person,PrivateSay)
{
       //enable
        fault_enable("MyLib::Person::PrivateSay",100,-2);

       MyLib::Person*person=newMyLib::Person();

       intret=person->Call();

        EXPECT_EQ(0,ret);

       deleteperson;
}

int main(int argc, char **argv){
        testing::InitGoogleTest(&argc,argv);

        testing::GTEST_FLAG(color)="yes";
       //attach func
        attach_func_lib("MyLib::Person::PublicSay",(void*)MyPublicSay);

        attach_func_lib("MyLib::Person::PrivateSay",(void*)MyPrivateSay);

       returnRUN_ALL_TESTS();
}



感兴趣的同学可以去深入研究

项目首页:http://code.google.com/p/baiduhook/

官方的文档  http://code.google.com/p/baiduhook/wiki/Demos

百度QA blog上的一个技术文章 
http://hi.baidu.com/baiduqa/blog/item/454507494d1f6eeb82025c54.html

TAG:

散步的SUN的个人空间 引用 删除 散步的SUN   /   2011-11-23 14:47:20
楼主是否在上地这边~离我很近,看来在自动化测试这个领域,学的东西越来越多
 

评分:0

我来说两句

Open Toolbar