【工作经历:阿里巴巴搜索技术研发中心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: