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

发布新日志

  • mysql的微秒补丁

    2012-02-10 15:55:06


    最近做一个项目的性能测试,是涉及算法相关的。整个项目由c++开发。读文件,写数据库,查询网络接口,写数据。蛮简单。

    不过发现了2个性能问题。解决过程中,折腾了不少,其中用到了一个mysql的性能排查方法,在此标注下,以备参考。


    mysql在性能profile的过程中,有很多的方法和工具,比较靠谱的一个方法,就是打开slow query log。
    但是slow log在5.1之前的版本,只能精确到1m级别。这个很鸡肋,不能满足性能profile的需要。
    所以需要进行进一步的精确。

    国外已经有人研究出了对应的方法。对mysql的代码进行修改,并做了一个补丁。
    连接参考如下


    用法很简单 
    patch patch.diff
    ./configure 
    make
    make install
    安装并启动mysql后,设置long_query_time=0  就可以开启slow query的微秒记录功能了。

    这个方法,是国外2006年搞定的,已经6年了。。汗。
    google之竟然发现被引用了无数次。

    下一步开始考虑mysql的研究学习了,发现mysql的性能问题还是蛮多的,mysql的各种机制需要深挖下。


    附上mysql官方的支持情况,有点无语。。

    Summary of Official Support

    v4.0, 4.1, 5.0: not supported; long_query_time is limited to a resolution of 1 to 10 seconds.

    v5.1 up to and including 5.1.20: not supported; long_query_time is limited to a resolution of 1 to 10 seconds.

    5.1.21+: for the value of long_query_time "the minimum is 0, and a resolution of microseconds is supported when logging to a file. However, the microseconds part is ignored and only integer values are written when logging to tables." (MySQL :: MySQL 5.1 Reference Manual :: 5.2.5 The Slow Query Log)

    6.0 up to and including 6.0.3: not supported; long_query_time is limited to a resolution of 1 to 10 seconds.

    6.0.4+: for the value of long_query_time "the minimum is 0, and a resolution of microseconds is supported when logging to a file. However, the microseconds part is ignored and only integer values are written when logging to tables." (MySQL :: MySQL 6.0 Reference Manual :: 5.2.5 The Slow Query Log)

  • 苹果血汗工厂的思考

    2012-01-31 15:19:45

    几个发小也在ipad和iphone的工厂里面工作,工资只有2-3k。
    工厂里面的生活,就和解放前的社会没什么两样。

    一个大工厂+拥挤的员工宿舍,上万人在一起。
    里面打架斗殴的不少,各种事情都有。还有个不到二十岁的女工自己在员工宿舍生了个男孩,就扔到垃圾桶了。
    一个个黑暗而充满罪恶的工厂。。。

    其实这根apple没什么关系,在中国,什么工厂都是这样情况。能关心中国底层老百姓是否幸福的人总是中国政府的对手。。

    作为农民工,农民,在中国被我们伟大的共产党给抛弃了。共产党打了江山,拥有了天下,然后把自己变成资产阶级和封建权贵,继而以一种伪装的脸孔干着罪恶的勾当,它把土地从农民手中夺走,然后又以户籍政策限制农民的自由,让农民变为了隐形的奴隶。
    以前无产阶级是农民和工人,而现在换政府了,农民却成了民工了。。。。

    这些民工没有保险,享受不到住房,医疗等福利。为大城市贡献者力量,还要忍受着各种歧视。
    留守儿童,老人在老家没有人好好的照顾,不少民工带着儿童去大城市,却没钱上学,办个民工学校还要被政府以资质不够频频破坏。

    想起来让人心酸那。。


    改革了几十年,越改越退,
    能挣钱了,民工却越来越苦,
    人民做主了,人大代表却大部分都是富翁了,


    想起了杜甫的话,“安得广厦千万间 大庇天下寒士俱欢颜 风雨不动安如山”
    广厦千万间是有了,寒士却无法欢颜。。。。
    又想起了屈原的话,“长太息以掩涕兮,哀民生之多艰”

    希望中国有一天可以走向新加波那样的社会。

    摘录原文。



    请在文本框输入(联合早报网讯)据东方早报报道,上周开始的时候,苹果公司还在为创纪录的季度利润而洋洋得意,然而到了上周结束的时候,该公司则经历了一场公共关系的“大退步”。

      “恐怖工厂”

      1月26日,《纽约时报》A1版头条以“In China,Human Costs Are Built Into an iPad”为题,披露了苹果在中国组装iPad和iPhone的工厂剥削工人的现象。这一采访了36位现任或前任苹果雇员及苹果供应商的深度调查报道,重新点燃了媒体对苹果“血汗工厂”的兴趣。

      被称为美国2010年度最具影响力男性的斯图尔特(Jon Stewart)在喜剧中心电视台(Comedy Central)的脱口秀节目里,把苹果巨大的利润幕后的富士康工厂讥讽为“恐怖工厂”(Fear Factory),这次公共关系事件对苹果造成的打击因而又被推高了一个层级。(据东方早报编注:在截至去年12月的财季,苹果公司的销售额和利润都创下了新纪录。其中销售额大涨了73%,至463亿美元;利润则翻了一倍还多,至131亿美元。根据数据提供商Capital IQ的数据,这一业绩使得苹果的现金储备达到了976亿美元。)

      苹果面临的问题在于,在幽默而令人震惊的新闻标题背后,有关中国大陆工厂的很多真相被揭露了出来,这足以令苹果的客户感到被冒犯,并最终对该公司的金字招牌造成损害。(编注:根据《纽约时报》进行的一项全国性调查,56%的受调查者认为苹果公司完美无缺;14%的人认为苹果公司最大的缺点是它的产品过于昂贵;只有2%的回应者提到了海外劳动力问题。)

      出厂速度

      堪忧的是,追究责任以及改进当前的状况远非易事。(编注:一些苹果的前任高管向《纽约时报》透露,违规情况屡屡发生的原因之一是,一旦苹果与核心供应商发生冲突,或影响到新产品出厂的速度,从而威胁苹果的竞争优势。据《纽约时报》披露,去年10月去世的乔布斯在2010年一次业内会议中曾谈及苹果与供应商的关系:“我认为苹果对于其供应链各个公司的工作条件的了解以及付出的努力,恐怕是业内做得最好的。”)

      《纽约时报》的重磅报道出炉后,苹果的首席执行长库克随即给全体员工发出电邮,对有关供应商不安全工作条件的报道表达了极端愤慨,并承诺加强审计。(编注:在外界的一再要求下,本月初,苹果公司首次公布了全部主要供应商的名单。但苹果并未公布其间接供应商的名单。此外,在公布的供应商名单中,苹果没有透露任何有关其工厂地点的信息。不仅如此,权益组织表示,他们曾试图检查苹果供应商的运营情况,但却被告知其将无法踏入大门一步,而这一禁令直接来自于苹果公司。)

      姑且不论“愤慨”是否能打消外界的质疑,应该记住的是,苹果只是以富士康为组装供应商的众多国际公司当中的一个,其他公司还包括诺基亚、戴尔和微软等。

      2010年,富士康工厂就曾发生过一系列员工自杀事件,当时媒体对此进行过广泛报道。富士康在中国的雇员人数逾100万。

      自杀事件发生之后,富士康不但给员工加薪,还开通了帮助热线,拉上了安全网,防止员工跳楼。富士康员工的底薪从每月1200元提高到了2000元。但这些显然未能阻止媒体继续“口诛笔伐”。

      因为“体积庞大”的缘故,富士康每每吸引众多关注的目光。在富士康深圳厂区工作和生活的员工数量超过了30万,相当于一个小镇的人口。(编注:1月22日出版的《纽约时报》披露,2011年2月,在美国总统奥巴马参与的硅谷杰出人物聚餐上,奥巴马向当时仍在世的苹果创始人乔布斯提了一个问题:为什么不能让苹果iPhone、iPad在美国制造?为什么不能把这些工作机会带回家?当时,乔布斯给出了一个非常明确的答案:“这些工作不会回来。”《纽约时报》为此列举了一个细节:某次,就在iPhone上架销售前几周,苹果改进了制造设计,主要是涉及显示屏的设计,这使得此前准备的组装线要彻底重置。新的显示屏近半夜才被送到中国工厂。当夜,工厂领班立即叫醒了8000名工人,每人发了一杯茶和一包饼乾。这些工人在半夜12点换班中,半小时即到位将新的显示屏装入机器。仅仅96小时,该工厂完成了日产10万台的iPhone量。)

      中国式转型

      尽管工人们住的很可能仍是局促的公共宿舍,但过去10年来,深圳已经转变成一个高楼林立、地铁发达、路上新车川流不息的城市。

      在中国引人注目的经济发展的幕后,有大约1.2亿农民工在辛苦劳作,他们大多在条件艰苦的厂区里生活和工作。

      农民工面临的苦闷前景是,由于数十年来存在的户口制度,他们不能像当地人一样享受住房、教育、医疗等居民福利,差不多成了二等公民。

      中国的工业转型已经进行了20余年,在中国开始工业化进程之初,这样一种体系或许还能说得通,但眼下这样做,不可避免地在促使紧张关系升级。

      户口制度的另一个不良后果是,它使农民工家庭难以在新的地方安置下来。估计有5800万农民工子女成为留守儿童,由亲戚或福利院照顾。

      围绕改革户口制度反覆进行了讨论,但目前为止却没有什么实际行动。其面临的一个难题是,不仅是企业从户口制度带来的顺从的廉价劳动力中获益,地方政府也得到了好处。任何改革都将意味着收入进行重新分配!

      然而,众所周知,中国需要恢复经济的平衡,以便从投资向消费倾斜。中国的经济在全球表现突出,而家庭消费率却处于前所未有的低点,只相当于国内生产总值(GDP)的36%。

      看起来再明显不过的是,第一步将是解除对这些农民工的束缚,允许他们安居乐业。记者最近在走访广东惠州期间体会到了中国失衡经济的现实。在那里,工厂旁边就是不断扩张的尚无人居住的住宅楼。

      对此类现象常见的回答是,中国缺乏推进户口改革所需的政治共识。

      与此同时,苹果和其他跨国公司会辩称,它们只是在遵守当地的规定。

      这或许可以理解,但这种局面还能维持多久,特别是如果它开始冒犯具有社会责任感的苹果消费者的时候?

      毕竟,如果消费者心甘情愿要求购买有机柴鸡蛋,那么距离他们要求购买由有基本尊严的工人所生产的智能手机或许也不太远了。

      这一事件的发展还有待观察。这回不太可能是苹果或中国政府方面在这个棘手问题上的最终发言。

      随着国际媒体把目光转移到中国条件恶劣的制造业,中国方面也势必将为此感到不安。文字
  • 好样的,百度QA

    2012-01-20 19:42:39


    终于把百度QA大部分的技术内容看完了。眼睛都瞎了。
    看了三个月,一有时间就阅读大家的经验。
    各种topic,单元测试,code review,自动化测试,敏捷测试,覆盖率,测试工具,测试框架。测试平台,测试流程。
    还有各种数据,各种经验,各种分享,各种培训,各种业务,各种架构。。。


    百度QA同学做的是很扎实的,分享的热情也很高涨,研究的内容也是非常的深入。而且有很靠谱和扎实的产品在不断的面世,后续会有不断的开源的。百度QA有望在c++测试方面做行业领头羊了。

    向这些有贡献的QA同学致敬下。







  • 天猫好名字

    2012-01-18 16:31:06

    tmall终于改名了。可喜可贺。

    从tmall这个域名开始,我就感觉淘宝商城会一直悲剧。商城的命运也的确在这两年曲折了点。
    这个名字真的不好,这种中英文混杂的体验,对用户是很不好的。
    当时想淘宝商城肯定会改名,但是什么名字很好那,我当时一直没想起来,感觉太难凑了。
    马总的这个名字,真是出奇的好。

    我记得当时商城在杭州的一个广告牌,让我汗颜,上面写,“tmall你知道如何读吗,是剃么。。。。”
    当时那个汗啊,心想这真是”才子“啊。。。


    现在终于改名了,终于舒服多了。商城是个好名字,不过已经臭了,但是还是有很大价值的。
    天猫这个名字也很好,也符合时尚,高贵的形象。

    去域名注册那里查了下,发现域名已经归淘宝了。

    再说一个题外话。月光博客上看到一个很二的文章,我估计马总也看到了,所以他委婉的在其他场合回了下,其实应该直接忽视的。

    http://whois.www.net.cn/whois/domain/tianmao.com

    月光博客的影响力还文章还是不错的,不过这次这篇文章,让我对月光博客的文章水准印象大打折扣。
    这个年代喷子真多,自己不做事,专对别人评头论足。哎。

    其实天猫这个名字好坏与否,不取决这个名字本身,而是取决于淘宝商城以后会如何做,如何影响用户。

    当当,京东商城,甚至是microsoft,facebook说实话,也不是好名字,就是因为品牌效应,反而让大家对这些名字刮目相看。

    事在人为,淘宝商城加油。
  • 基于调试的测试技术——从批量数据反推测试用例

    2012-01-18 15:46:19

    接上文

    以某个c++项目为例,程序a需要一个输入文件,每行代表一条记录,每行中包含2个字段,一个是qid,一个是title。
    它接受批量的输入数据,然后分析输入做一些算法上的处理,比如数据挖掘,个性化推荐等。

    先进行基本的测试设计,根据需求和细节设计做一些测试用例覆盖。确保需求覆盖率。

    然后构造测试数据,测试数据构造基于历史数据,取线上真实的数据,然后做一些扩展。从三个维度去挑选测试用例数据
    1、线上真实的基本数据,然后做扩展
    2、阅读代码,根据代码逻辑,进行code review,然后做扩展
    3、使用批量数据反推

    依赖上面的两个步骤,就足以保证你的测试覆盖率了。
    这次主要介绍第三种方法。这是一种新维度。

    使用上文的方法,首先做出一个工具,我命名为gdbtest。它自动下断点,然后运行特定的命令,最后分析log。统计数据。然后开始执行如下步骤

    1、分拆你的数据。为了区别不同的测试用例,你必须对输入数据拆分。我取线上1000条记录,然后拆分为1000个文件。当然,线上一般都是百万级以上的数据。具体如何拆分,自己把握吧。采用二分法什么的都可以。

    2、分别使用gdbtest运行你的项目。可以采用多进程加速

    3、最后对所有的log分析,并归类。就可以发现不同的测试用例了。

    4、即使log中断点的信息不同,但是仍然表示测试用例是一样的,可以进一步去重



    我的项目为例,第三步就可以发现200条数据中,有6条记录是走同样逻辑的。
    走同样逻辑的数据的md5值是一样的。
    研究后发现,走不同逻辑的原因是因为有些数据的长度不同,由此可以印证,长度不同的title,也是不同的测试用例。


    然后排除掉长度不同导致的逻辑不同,就可以发现。在所有两百多条记录中,只有三种情况。
    也就是说,其中至少包含了3个最有效的测试用例。
    然后自己分析具体的测试数据就可以了。



    如果你的数据量更大,覆盖度更大,那么发现的测试用例也会更多。

    此方法还有一个好处就是可以用来寻找bad case,这在一些搜索引擎和算法的测试中,是经常用到的。








  • 基于调试的测试技术

    2012-01-16 02:12:53

    很久没有发技术文章了,实在对不住大家。今天决定放点技术的东西出来跟大家交流下。

    基于调试的测试技术

    大家都知道,通过gdb可以动态的跟踪程序,通过gdb,你可以实时的追踪任何你想了解,甚至是介入的逻辑,实现对程序的完全控制。那么测试和调试技术结合,会带来什么那。这是个很有意思的中间地带。

    趁在这边重新接触了c++的测试,就做了一些探索。

    一个程序,其实是可以看成一个树结构,树有一个树根入口,然后不同的数据,通向不同的业务逻辑和执行路径。
    但是程序中,除了简单的if else之外,还有一些for while之类的循环,这些会导致程序的代码运行不再是简单从上到下,而是充满了各种的”短路“,“调头”等。

    一个只有if else switch的程序,是一个树结构。
    一个带有for等循环语句的程序,是一个复杂的图结构。

    如果你输入一些数据给程序,程序就会分拆,分析数据,然后根据具体的数据,去走各种各样的逻辑。
    这根测试用例是一样的,你如果测试一个程序,那么这个程序有多少种测试数据,其实就代表了,程序有多少种的业务规则。


    简单的以百度搜索为例,当你输入不同的词语,所出现的内容是不一样的。这就是程序的逻辑不同。
    比如,你输入abc,他们会出abc
    你输入1+2,他就会弹出框架算应用。
    如果你输入一个不存在的词,他会提示你找不到等等。

    这些不同,是由底层的代码逻辑,和一些附属数据决定的。其实就是数据结构和算法决定了一切。
    那么对于一个已经设计好的程序,一旦他的代码和数据确定,那么他的行为就确定了。
    它自身会有多少个逻辑分支,会有多少的异常,都已经确定了。

    而QA回去度量这个程序是否满足需求,功能是否OK,代码质量如何,测试覆盖率有多少等等。
    其实包括需求在内的范围,是程序所不能控制的。需要QA严格保证。

    但是对于已经确定的代码,却包含了所有的分支逻辑。也就是它不能保证它正确,但是它能知道自己到底做了哪些事情。一个程序所表示的所有逻辑中,就有一部分是为了保证需求的。

    那么对于QA感兴趣的,就有如下几点。

    1、找到所有的分支逻辑,并测试它。确保行为可预期。并消除一些bug。
    2、找到包含业务逻辑的分支逻辑,针对性的验证,消除需求和功能上的bug

    对于第一点,我目前还没有去研究,因为它需要专家才可以搞定,需要你了解汇编,编译原理和语法分析等。代价很大。
    而对于第二天,却有个小技巧可以做。

    对于一般的项目而言,如果一个项目是升级项目,或者这个项目已经有了应用的场景,可以构造,甚至是拿到具体的应用数据。那么容易到了。
    举个例子,就好比,如果是搜索引擎升级,那么我可以拿到所有的日志,或者用户的query,然后测试引擎。

    通过ccover,或者gcov,c++的程序是可以统计到测试覆盖率的,可以定位到具体的代码行。然后补充自己的测试用例。通过这些测试覆盖率工具,我们可以把测试做的足够透明,并能保证覆盖率和测试用例的完备。
    但是对于测试数据的生成,却需要QA自己去构造实现。这是QA里面很耗时的一个工作流程。

    那么就诞生了一个新的想法,能不能从线上的数据,反推出测试用例数据。或者根据批量的数据,然后找出有效的测试用例。

    gdb可以很好的跟踪到程序的每一个细节,如果有一份批量的数据被灌入了某个程序,这个程序的所有的运行轨迹,都可以被探测到,只需要从里面拆解出所有的分支,并得到数据,那么就可以很好的实现这个过程了。


    所以我找了一个项目做测试,自己也编写了一个程序demo,然后使用gdb去跟踪整个过程。
    我使用了break+commmands命令,保持gdb非交互运行,
    使用脚本自动对程序中所有的分支,循环自动下断点。

    因为这些分支代表了业务逻辑,而for循环则代表了一些新分支的诞生。都是需要跟踪的。

    然后记录所有的断点情况,如下是一个断点情况。

    1 2 3 4 5 5 5 5 6 7 5 5 8 5 9 5 10 11 12
    1 2 3 4 是依次执行的条件分支
    5在循环体内,以下是若干分支
    5 6 7   
    5 8  
    5 9 
    5 10 11 12

    如此,可以看出,一个程序的执行,其实是一个序列,这个序列包含了分支和循环,所以导致了有些断点总是为被不断的执行,直到所有的数据遍历完才退出。



    为了方便的分析,对数据做处理,生成一个树结构。

    Main是树的开头
    If开始是一个必经的节点,if之后的语句,会分支执行,看成分支点
    For循环会导致断点重复,所以把for开始处看成分支点,每个for执行看成一个子树。
    函数调用也会导致重复,让它不重复,如果调用栈发生了变化,就认为是新增子节点
    经过上面的步骤,所有的叶子节点就可以代表程序的轨迹了


    然后重新对数据做处理,就出现了如下的结构
    这个结构非常好的代表了程序的逻辑。


    它从根节点开始,然后不断的经过各种分支,到达第一个叶子节点后,重新又从某个for循环处衍生出新的分支。


    从测试角度考虑,只要能够遍历所有的叶子节点,那么就可以确保测试覆盖率达到一个非常理想的境界。

    如果不同的数据,但是业务处理逻辑一样,那么这些数据都走过了同样的节点序列,那么就认为这些数据是重复的测试用例,只需要选取一个就可以了。

    通过gdb的运行log和这些树结构,就可以非常清楚的知道程序的算法逻辑,找到没有被覆盖的分支,并能消除重复的测试用例。


    深入的分析gdb的log,可以挖掘更多的有价值的东西。
    比如测试覆盖率,通过gdb就可以很好的度量覆盖率


    以下是可以通过gdb做到的。

    测试覆盖逻辑路径图(ccover,lcov)
    代码覆盖率统计(ccover,gcov)
    从批量数据中挖掘测试用例
    断点切入测试
    性能分析(结合google-perftools)
    Fuzz测试
    代码分析
    抛砖引玉。。。。


    把调试技术应用于测试会带来很多惊喜


    目前我做了一些进一步的探索。
    1、如果反向从gdb运行log推理出测试数据。(探索中)
    2、自动找到未被遍历的条件,协助分析。(已完成)
    3、自动设置断点状态去走向未被执行的逻辑,比如把true改变为false。(价值不大,可以探测出问题,但是会影响业务逻辑)


    以某个项目为例
    运行gdbtest -run "bin/qs qs.data"
    然后得出的一个报表,就可以看到那些逻辑被执行了,那些逻辑没有执行。然后做一些对应的测试用例添加就可以了。




  • 淘宝的ruby站点

    2012-01-01 21:25:05

    淘宝发布了rubygem是的一个镜像站点。   ruby.taobao.org

    超赞啊。很多人应该都遇到过rubygems访问不到,导致gem install失败的情况。
    stackoverflow,iteye上也有人不断的问起这个事情。

    对于国内的用户,其实大部分的原因除了gem版本太旧之外,另外一个就是rubygems被墙。
    被墙的原因就不得而知了,可以确信的是,使用GFW的那些混蛋肯定是不用ruby的。

    很多技术站点被封,让国内的IT人员很委屈。很多公司也都暗地里提供了代理让员工去访问了。
    不过,对于处于公网的用户来说,就很恶心了。

    幸好,淘宝的同学很给力,提供了这样一个镜像。不然我的heroku应用就废了。
    我记得人人网也提供过apache下载的镜像。都是很赞的。




  • 骚动的季节

    2011-11-27 20:13:48

    今天一天,做了不少事情。

    研究冯大辉的各种资料
    搜索了他的相关工作资历
    读了他的微博
    注册了知乎社区,搜索了感兴趣的话题和之前出去创业的同事

    看到这些人天天都在讨论创业,身边的同事,无论是开发,还是测试,有不少都出去创业了,或者参加了创业公司。
    心里也有点骚动,又有点孤寂。

    感觉自己已经快要30了,到现在为止,没钱,没房,没车,没城市户口。一无所成。
    仍像个学生一样在工作上和学习上忙的不亦乐乎。
    应该想想后路了


    上周纠集了三五好友,一起讨论了下,决定业务时间做个项目练手下。打算为将来创业热身下。
    当然不一定真做,只是先通过项目,锻炼下能力。
    如果能够盈利,当然也是不错的。

    想证明下自己,并不是完全死等工资的人。




  • 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函数中显示定义
    int MyPublicSay(MyLib::Person *person)
    {
            int err;
            int ret = fault_fail("MyLib::Person::PublicSay", &err);
            if(ret == 0) {
                    printf("\e[33;1m[=HOOK=] this is no PublicSay!\n\e[m");
                    return err;
            }

            typedef int (*REAL_FUNC)(MyLib::Person *);
            REAL_FUNC old_func = (REAL_FUNC)get_real_func_lib("MyLib::Person::PublicSay");
            return old_func(person);
    }

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

            typedef int (*REAL_FUNC)(MyLib::Person *);
            REAL_FUNC old_func = (REAL_FUNC)get_real_func_lib("MyLib::Person::PrivateSay");
            return old_func(person);
    }

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

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

            int ret = person->PublicSay();

            EXPECT_EQ(0, ret);

            delete person;
    }

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

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

            int ret = person->Call();

            EXPECT_EQ(0, ret);

            delete person;
    }

    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);

            return RUN_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
  • 技术梳理

    2011-11-20 04:43:10

    进baidu一个月后,继续不厌其烦的梳理自己的技术结构。

    所在的部门,跟自己在b2b的部门很像,负责引擎后面的各种算法设计。我的工作,就是测试这些模块。
    接触了工作中林林总总的技术框架后,终于知道自己要加强什么了。


    1、c++
    之前一直想转到java测试,看来这次不可能了。百度更重视c++。各方面的原因吧。不过已经形成这种氛围,自己也没办法了,重新温习c++。现在java已经开始走下坡路了。以后转java测试,是不会再有机会了。死了这条心吧。
    也许以后自己可以跳过java,去研究更好的语言,比如scale或者nodejs。
    当然更大的可能是,c++会像cobol语言一样,可以继续持续几十年。所以未来十年内,学习好是没有坏处的。
    要学习googletest和googlemock。最近已经开始写单元测试用例了。
    在这个领域,还是有很多的空间发展的,比如TDD模式。java领域已经很火了。但是c++领域里面,还是没有太成型的案例。

    2、ruby
    工作语言经常需要顾及稳定性和性能,但是对于自己的项目来说,我们就可以忽略这些东西了。
    近年来,nodejs,scale,以及其他F#等并行计算语言开始兴起。但是看了下,都不算成熟。
    缺少资源库,IDE和各种支持。所以仍然暂时观望。
    目前最好的方案始终是Rails。没错,就是它。让可以让你很快的创建和发布自己的项目。
    Rails的理念仍旧是超前的,比如最近在国外很火的一本书是《持续交付》,其实在rails中,已经实现了。
    heroku平台和GAE平台,都是不错的云计算paas解决方案。heroku已经支持了java,ruby,python,nodejs。可以说,已经是非常的成熟了。GAE虽然不支持ruby以及google自身压根就没有这个想法,但是支持java,无疑就让jruby有机可乘了。在GAE上部署ruby已经很成熟了
    另外,在移动平台上,基于android的ruby解决方案也已经有了————Ruboto。通过ruby可以顺利和便捷的编写android的应用


    3、javascript
    javascript不算是很强大的语言,但是它独特的机制和地位,已经奠定了在未来十年,没有语言可以代替它。
    计时是google的dart语言,亦或者类似GWT这种其他语言的转换框架,都无法拜托javascript。
    更何况nodejs的崛起。。
    这一切,让javascript发展迅猛。
    目前移动平台上,也已经有了非常成熟的框架。比如sencha解决方案,phonegap等。这些让移动应用开发非常便捷。








  • 离职去百度了

    2011-11-20 04:15:11

    在阿里云做了半年多的安全产品测试。发现里面的水很深。
    已经跟自己原来玩技术的时候,不是一个时代了。
    对于在这个行业里的发展,有点失去了信心。

    1、部门里都是国内的顶级黑客团队,不乏大师级人物。在这些优秀的人才当中,拿到271中的1,基本是不可能的。
    2、部门的测试很乱。没有足够的资源去整顿。自己也没有各种原因无法投入足够的精力。
    3、经济压力导致自己一直犹豫要不要废掉自己三年backend的测试经验去做另一个领域的小角色。感觉即使做到最好,工资也不可能double

    后来也发生了不少事情,几经犹豫和转折。最后还是放弃了。
    其实很喜欢那里的人和工作,可惜自己因为各种原因无法坚持。


    先后面试了腾讯,百度和seven公司。

    跟腾讯无缘,腾讯问我ruby的block机制,我竟然突然想不起来。
    后来同事也推荐了腾讯好几次,想让我去深圳,但是最后都没有下文了。看来真的没缘分。
    总体感觉,腾讯还是非常重视技术和沟通管理能力的。

    百度电话面试了5次,一路很顺利。最后拿到offer,因为部门的事情,我拒绝了百度。但是后来又峰回路转了。

    还有seven公司,面试没有问题,但是没有下文。我想可能他们作为世界五百强公司在华的分中心,团队规模还不大,先入为主的人心中小九九是少不了的。没再等

    其实要想真正的学到东西,就必须去大公司,只有大公司的学习机会和发展领域才是最大的。
    创业公司也不错。几个创业公司也找过我,待遇要比大公司好,但是考虑到自己还没有做好充分的准备,所以拒绝了。

    面试过yahoo中国,技术都没有问题,只有英语没过关,所以就pass了。从面试官问的问题上,明显就可以看出至少面试官所在的部门,技术是很差的。

    vmware招聘云计算测试工程师,要英文简历,我回绝了。很想去,待遇很好,云计算领域也热门,可惜的就是经验不多,也懒得去整英文简历。说没有问题,但是写就很折腾了。


    几经周折,终于选择了新东家。搬家,离开杭州去北京。
    杭州不堪的三年终于结束了。自己多少也算是个阿里三年陈的员工了。

    在杭州的第一年,自己成长的很快。也做了很多事情。
    第二年,就开始各种悲剧。穷困潦倒+工作不如意
    第三年,挣扎后转到阿里云,然后又纠结

    人生经历是宝贵,在这三年的日子里,认识了很多很好的朋友,也留下了很多的遗憾。
    难忘,这是一生中弥足珍贵的经历。





  • 转岗了

    2011-01-24 16:32:22

    David说过,不要证明自己,否则容易陷入歧途。
    我的确一直被这个命题所累。

    今年转岗了。选择了新的领域,以一个空杯的心态,面对变化。
    这不只是岗位的变化,也是我个人职业生涯的一次转型。

    这一次转变,我要放弃技术,放弃不服气,放弃急躁,重塑信心与自信,以平静的心态,面对新环境。
    一切从新开始。我不服输。我要在新的岗位上证明自己。
    我相信自己也可以学好,做好。


    下一年的目标

    1、乐观,信心,积极,敏捷。
    2、放弃技术成长,转型
    3、还清所有的债务。不再让银行再他妈催债一次。
    4、不允许KPI出现3.5与3.25。要么做最好,要么不做。





  • 看书中

    2010-11-10 16:52:54

    最近晚上看了一些书。

    走马灯的看了下《c++ primer》,对以前不是很清晰的章节进行了重温。
    慢慢的读《高效能人士的7个习惯》,写的很好。一点点的读与思考。
    系统的看完了《黑客攻防宝典web实战篇》,写的很好。外国人写的,还是有分量的,比国内的一帮菜鸟好多了。

    现在不想考虑太多,静静等待。
    不知道自己一年后会是什么样子。
  • 自己究竟适合做什么

    2010-09-05 21:04:56

    最近在思考这个问题。

    人生路已经走过了太多。不能再随便转向了。
    浑浑噩噩的半年过去了。我没有太多时间了。

    周末在公司通宵了。早凌晨5点半,去了1号楼6楼的天台呆了一会。
    我很喜欢那儿。可以每天看到太阳冉冉升起。

    凌晨的冷风与湿冷的空气,让自己的精神很振奋。
    我在黑夜中呆了太久的时间了。我错过了太多的黎明。

    最近变了很多。

    从喜欢黑夜,转向了向往黎明。
    从讨厌假期的到天天盼着周末。
    从不屑于与女生交往,到周末构思着如何跟mm约会。
    从以前天天泡到代码里面待到口舌退化,到现在谈笑风生精心收集黄色笑话。。。

    变了好多。。


    我收到了很多暗示,我应该回头了。


    每次我决定要安稳的时候,就会做一个梦,梦到自己得了癌症,梦里一直告诫我,不能等待,不能退缩。
    很凌乱的梦。我梦到了自己成为了幽灵,成了这个世界的旁观者。在无法控制的游荡。
    我梦到秋叶飘零的家乡,梦到了随水漂流的花瓣。梦到了被藤蔓缠住的狐狸。。

    秋叶飘零的家乡,其实代表了我的家庭。
    随水漂流的花瓣是我的爱情。
    那只被藤蔓缠住的白狐,其实是我。

    梦到的,才是最真实的自己。那是自己心灵深处的想法。
    白天告诉自己,要相信希望,有信心,会有奇迹出现。
    到了梦里,一切都会暴露无疑。

    感觉自己老了。慢慢开始感觉到力不从心,甚至是有气无力。
    继续观察自己,看看自己会做出什么。会如何成长。















  • 海豚湾

    2010-08-09 03:24:29

    《The Cover》。中文名也叫《海豚湾》。
    这个真实的故事。揭示了日本人的丑恶。
    其实何止是日本人,在没有监督下,有多少人还在干着肮脏的事情。中国人又好到了哪里?


    看了校内上分享的一个flash。看哭了。

    顺便鄙视下人人网。越做越烂了。。。。。
    早晚要被别人挤下去的。。。
  • 最后一道关卡

    2010-07-07 00:20:14

    又一次证明了自己的幼稚。
    就像一个小孩哭闹着说,我输掉了一盘棋,我不玩了。开始撒娇着把一盘棋推翻。


    我能获得什么
    1、节省半年或者一年的努力。赢到宝贵的青春。
    2、得到一种暂时的虚荣。
    3、回归到从前的朋友圈。
    4、一种满足自我惩罚的欣慰。

    我会失去什么

    1、朋友
    2、长期稳定的工作与期望
    3、最后的信任
    4、安逸的生活


    如果有一天,我离开了。
    发展好,我很难回来,发展不好,我也没脸回来。
    虽然这是一种暂时的选择,但是却是影响一辈子的决定。

    问自己,你对得起当初的誓言吗?
    问自己,你放得下吗?
    看我在这最后一道关卡上如何绊倒吧。








  • 留下什么

    2010-07-06 23:22:02


    我的工作,生活,都不是靠一种正确的心态来生活的。
    我的一切表现,都是靠着自己的一口气来顶着。
    一种不服输的精神,一种要努力证明自己的精神。一种不放弃的坚持。
    一年,两年,三年,
    回头再看的时候,泪已无法控制。

    爱过的女孩,要结婚了。
    爱我的女孩,被我逼退了。
    我爱的女孩,我没有能力去追。

    只是感觉突然一瞬间,我失去了努力的目标。
    当选择放下的时候,突然感觉没有了力气。
    我曾经无数次的走过黑暗的长街,虽然疲惫但是欣慰。
    但是这些天,却感觉有些迷茫。
    我沿着钱塘江,骑着电动车,沿着一条路,一直开,
    在灯火阑珊的高楼大厦下穿过,在漆黑没有路灯的公路上驰过,一直开到路的尽头。
    然后下车,在江边吹吹风。
    只是感觉有些委屈。


    我倾听感情不顺利的朋友的倾诉,用言语与大家的陪伴来抚慰他们的伤口。
    我用自己的热情,号召起来一群可以成为死党,互相鼓励的群友。
    因为自己的经历,我怜惜那些特殊的人。
    不过这一切,却无法消除,自己的落寞。

    感觉人生,就像一场戏,别人在上面快乐的跳舞,我只能蜷缩在角落里颤抖。


    之前,我什么都不怕。什么都无所谓。
    现在,我必须去认真的对待这一切。

    我还有什么东西可以挥霍,还有什么可以依靠。
    也许,哪一天,领导会突然fire掉你。
    也许,哪一天,楼市崩盘了,你照样买不起房子。
    也许,哪一天,家人病了,你照样没有能力照顾。
    也许,哪一天,我在一个偏僻的地方死掉,直到尸体腐烂也没有人知道。

    我重情义,重感情。我的一生,为家人而活,为朋友而活。
    在家人的幸福中,我感觉到温暖,
    在朋友的相处中,我体会到快乐。
    我的生命的意义,不在于自己的感觉。

    这些天,一直在看《这个杀手不太冷》,看了几十遍。
    越来越感觉,自己很像李昂。
    我在的时候,一切会很好。
    有一天,我不在了,就什么都归零了。
    也许有一天,老了,会成为意大利餐馆里面的那个老头,神情木然的接受别人的施舍。

    以前,我总会在意,我做了什么,有什么样的意义。
    我从没有想过,我离开后的世界。

    留下什么,给所有人。











  • 深蓝约定

    2010-06-22 22:04:20

    和群里单身的朋友,打了一个赌。

    一个月之内,用每月2000的价格,包养一个女朋友。
    做不到,就用2000请大家吃饭。

    我追加了一个赌约,如果一个月之内找不到女朋友,
    我会在7月22号之后的一个周,找到女朋友。否则再请大家吃饭。

    第一次用真心,第二次则会不择手段。





  • Java单元测试的自动化与智能化

    2010-06-08 05:57:52

    被很多人写了N年了单元测试代码,早该淘汰了。
    Java的单元测试,其实是可以自动生成框架的。
    做Java的单元测试,不需要coding,只需要拖拽与填表i。

    Junit机制很强大,不过直接用来写单元测试,虽然小巧,简洁,高效。但是还是有更好的方式的。
    公司的JTester做的不错,我之前的想法,也都实现在里面了。是过不错的框架。

    不过,其实还可以再大胆的迈出几大步。

    提出如下几个设计想法
    1、实现对Java代码的scan,获得接口函数的类型。或者一些类与函数信息。
    2、对这些函数,根据反射分析出函数的类型,参数类型等。
    3、根据类型,生成对应的测试框架。包括测试数据,以及测试函数之间的调用关系。
    4、运行。然后分析结果


    最终的目标,就是作出一个工具,让一般人都可以通过自动的扫描,去勾选函数,拖拽函数之间的调用关系,去生成自动化的代码。以及逻辑测试体系。
    然后由用户去填写测试数据。去填充函数的调用。

    Java单元测试,其实也是可以自动化的。总体难度不大的,只不过一些处理依赖,代码细节等需要考虑。大部分的技术问题,都已经有成型的解决方案了。
    后续还可以通过mock方法,去自动学习函数库的测试数据。实现更好的自动化,或者智能化。
    这样测试人员的很多体力活,就可以消减了。留出精力去测试重点,分析难点。

    最近在学Java与JRuby。我会尽量去实现。也希望其他感兴趣的朋友,可以研究出更好的工具。





  • 为了什么

    2010-06-08 05:19:52

    最近很累,在思考一些问题。

    工作是为了什么。
    为了公司?
    为了同事?
    为了业绩?
    为了薪酬?
    为了满足自己的技术创新热情?
    为了炫耀?


    如果得不到认可,何必要改进
    如果得不到信任,何必去推动
    如果为了薪酬,何必努力,熬日子多好
    为了业绩?自己很在乎吗
    为了满足自己的技术创新激情?自己是不是很贱


    如果改动,有利于公司,却会伤及同事,你还会做吗?
    如果努力,有利于集体,却有害于自己,你还会继续吗?
    做技术,是不是最后要免不了沦为别人随意使用的廉价”工具“。
    谁才是最后可以值得信赖的依靠。


    最近在装傻,很多技术可以轻松推动的事情,我都delay着了。很多事情,假装视而不见。
    在技术里面,走的太深入了,谁能保证不会有悲哀的结果。
    也许,一张纸,就可以完全否定一个人。

    公司是虚的,技术也是虚的。只有人,才是实在的。
    难道在企业里面,最后都是要混人际关系,拼地盘吗?


    将近2年了。大多数同事都在谈论结婚,买车,买房的时候,我的工资卡里,却只残存着几千块钱。
    自己就像个怪物一样,在一些熟悉的陌生人眼里。没有生活,没有情调,没有交际,什么也没有。

    有一天,没有上班,开着电动车,沿着钱塘江开了很久。一直沿着河岸向西走,一直走到路到尽头。才回头。
    看一路上的行人,一路上的各色建筑,一路上的各种风景。
    在江边坐了很久,看潺潺的江水,想以后的事情。
    也许,人生的变化,还会有很长。谈归宿还太早。。。。


    为了结束单调的生活,我成立了单身群,也举办了几次小型的活动。开心的是,自己被誉为了最帅的群主,还有一些fans,最重要的,还是多了很多可以开心聊天,一起玩的朋友。呵呵。

    为了在杭州,有份美好的记忆,不会显得那么寒酸,我租了一套2200一月的阁楼。
    在窗台摆放了两盆栀子花,房子好看多了。栀子花的花香,一度弥漫满屋。
    依靠在飘窗上,听听歌,舒服很多。





























1721/9123456789>
Open Toolbar