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

发布新日志

  • 跳出自我

    2010-01-18 15:26:50

    跳出自我。
    适应变化。

  • 无奈

    2010-01-15 00:16:58

    总结过自己为什么会失败。
    我只要安分的做,就一定可以成功。但是最后却没有坚持下来。
    我倒在了最后一公里上,半年的努力,终于功亏一篑。

    这半年,过的非常狼狈。终于承受不住了每个月4k的收入。承受不住了长期的这种压抑。

    每天一想到家人,就忍不住心痛。
    在阿里巴巴,我每天坐在办公室里面工作,怀揣着梦想,憧憬着未来。
    而我的家人,却在家里每天坚持着拮据的生活。
    对这一切,我是那么的无力与无奈。

    我的家里,满墙都是我在小学,初中的奖状。
    他们选择了保留这些,来怀念他们曾经的骄傲。
    他们容忍了我高中时的堕落,大学时的平庸,刚工作时的无知闯荡。
    给了我最大的包容。

    我坚信自己可以做到优秀,做到别人无法达到的境界。
    因为我有着别人不具备的能力,那就是牺牲。

    但是,滴滴答答的时间终于让我乱了方寸,我不是个长时间忍耐的人。
    我看到了昔日的同事都已经晋级调薪,看到了别人的生活幸福开心,
    我感受到了自己的落寞,感受到了时间的漫长。
    我每次都问自己,这就是你要的生活吗,我的一生是不是都在忍耐,爱因斯坦,大器晚成,到老气横秋的时候才成功,是你想要的吗?

    我看到了别人在百舸争流,而我则止步不前的时候,我的心理失去了平衡。
    所以我发疯似的工作。希望会有奇迹出现。
    而最终,我被这种节奏和情绪累倒。

    我开始接二连三的犯错。

    我没有参加公司的十周年,被大家认为是没有集体荣誉感。
    我掩饰不去的理由,让别人认为我不可信。
    我不参加集体活动,让别人认为我脱离组织。
    情绪最低落的时候,我没有去上班,让别人认为我无纪律,无责任。
    工作压力大的时候,我开始闹情绪。。。。

    成长比跌落的更快。

    来阿里巴巴,第一次发脾气。
    我认为发脾气的人,是最无能的。而我竟然也发脾气了。
    最重要的是,我已经深深感到我的存在,给了周围人很多压力。
    成为了一个顽固的石头。

    想过马上辞职。不想影响同事,但是我不能没有那可能会有两个月的年终奖。那是我可以一下子还清债务的机遇。
    我不想谈和领导谈工资,我不想让别人认为我自满自大,恃才傲物。
    我更不想在项目最忙的时候,决定辞职,把烂摊子留给团队,让领导感到这是一种威胁与不负责任。

    所以我又熬了一个月。

    这一个月,我开始了频繁的迟到,
    开始了连续24小时工作的刷新纪录,
    开始整夜整夜的呆在公司,,,
    开始头脑发热。。。
    开始心灰意冷。。。


    每次都会想,生活可以很简单,就是辞职,回北京,找工作而已。
    但是每次都不想放弃,感觉我应该做完什么,留下一道彩虹,料理好后续的工作,才可以抽身离开。
    同时又想,我只是个渺小的人,在阿里巴巴可有可无,干吗搞的自己这么伟大似的。
    每次看到不忍心的伤到同事,就很愧疚,又恨不得马上离开。


    我不是个理智的人,虽然我对技术非常的狂热,但是我更多的时候是在感情用事。
    唯一让自己不能走的,就是别人对自己的期待。
    今天还能呆在公司里写荒废很久的blog,唯一的原因,就是我对主管,对leader,对同事的一种亏欠。
    我不想让对我期望的人失望。




    距离放假,还有不到1个月的时间,该到理发的时候了。
    头发已经漫过嘴唇了。
    最近妹妹发来消息,已经开始列礼物清单了。呵呵。
    数码相机一部,手机一部,台式电脑搬回家。
    发了年终奖,我终于可以从卡奴,荣升到月光族了。到时候肯定要庆祝一下。







  • 责任

    2010-01-04 03:06:46

    开始沉思责任。
    是不是应该。。。。。。

    自己已经变了,
    不再是1年前的自己,可以提前1个小时去公司,和主管比谁来的早。
    也不再是那个曾经把计划贴满墙,每天想着如何把工作做更好的人。

    已经彻底变了,控制不住自己了,一切都已经失控了。
    如果自己还算负责任,就应该知道如何做。

    一个新的教训,就是
    不要奴役自己,也不要欺骗自己。
  • Bash Framework中加入了公司Logo

    2010-01-03 23:24:39

  • ATF框架的使用

    2010-01-03 02:13:52

    使用平台,分为三个角色。
    平台维护者,自动化测试用例的编写者,与自动化平台的使用者。
    平台维护者负责整个平台的流程设计与规划。
    测试用例开发者编写TC的控制流,使用atf的整体框架。
    平台使用者直接使用自己构造的数据去执行。

    使用流程是与开发流程是顺序相反的,需求从使用者身上获取,然后逐层向下反馈。

    举个例子。
    平台维护者的工作实现server的自动化,包括系统的启动,创建索引,查询等流程的自动化。
    测试用例开发者,借助平台,实现自己的逻辑定制,比如启动系统,然后发送数据进行查询,然后使用断言去判断预期结果。
    平台使用者直接构造测试数据。

    如下是一个简单的例子。


    平台维护者实现

    class Blend
    def start
    ....
    end

    def search
    ....
    end
    end


    测试用例开发者实现

    class Blend_Test
    def test_query(data={})
    ...
    blend.start
    ...
    blend.search
    ...
    assert_equal ...
    end
    end



    测试用例的使用者



    tc "x1"
    step "Blend.test_search"
    data "query","query1"
    data "expect","expect1"


    tc "x2"
    step "Blend.test_search"
    data "query","query2"
    data "expect","expect2"




  • 珍惜时间

    2009-12-28 23:57:15

    最近发现自己的工作又被陷住了。
    很多想法,很多计划无法付诸实施。
    时间的不足,导致很多事情无法做好。
    这是很严重的问题。

    很小的问题,但是处理不好,会拖垮自己的。早做决断为好。

    最近做项目,获得了不少心得。进度,资源的管理,在头脑中开始变的非常的清晰。
    也开始体会到了投入与产出的比例关系了。
    以前工作靠冲劲,现在要开始转向理智了。做一个理智的工作者。



  • 后台测试自动化平台开发的第一个弯路

    2009-11-29 01:52:05

    平台开发以来,进度还是蛮快的。
    最近因为项目忙,疏于管理。结果项目走样了。犯了几个错误。

    1、Excel解析到TC,是一个兄弟开发的。他采用了GBK编码。因为Excel文件是GBK编码我们的系统默认的。
    而且Excel很难转换到UTF8,默认的excel没有提供此功能。
    我是一直推崇UTF8的。有点担心GBL,但是为了项目的统一性,我让大家修改了编码为GBK。结果麻烦就来了。
    很多ruby的库都是不支持GBK的,在运行,以及使用中,遇到了GBK的很多问题。耗费了不少时间。
    GBK始终是有隐患的。以后随着数据的处理复杂,以及与多系统,数据库,web进行协作的时候,这个编码也会成为隐患。

    2、模块是分开开发的。有两位DEV,在开发过程中,进行了大量的扩展。这也是我的失误,之前没有让他们了解透彻。中间又没有去check他们的进度与代码。导致了功能重复,设计思路有点乱。
    而且底层的两个哥们直接进行联调了,把框架架空了。
    进度可喜,对整体设计不利。把其他人架空了。

    3、接口之间的定义不是太清晰。导致一些关键的衔接,还需要重新去整理。


    接下来的解决方法。

    1、碍于excel的固有缺点,还是采用GBK去读,但是扩展一个方法,把GBK全部转换为utf8。系统还是采用utf8编码。
    2、我写一个主线联通的CASE,主动去联调所有的模块。把大家的注意力拉到框架上来。
    3、接口之间的定义,通过联调,最终确定下来。



    一些其他方面的计划。

    1、配置解析模块完全不要。为了更好的扩展,采用yaml或者xml去序列化,反序列化配置。Yaml不支持汉字,不果可以通过扩展实现支持汉字。测试已经通过了。具备可行性。
    2、编写几个常用的业务。去模拟使用整个框架。
    3、Project模块增加版本代码比对功能。
    4、项目二期启动。



    今天去听淘宝主办的《互联网测试技术交流会》,挺好的。只听了上午了演讲。很精彩。
    从分享中领悟到不少新的东西,对我们的平台设计很有启发。
    下午没有机会去听淘宝的测试平台框架介绍了。可惜。

    我们部门的框架还需要继续完善与调整,我相信,我们部门可以做到最优秀,可以超越淘宝的那个框架。
    我们可以更快的去实现他们没有实现的功能。

    好多的设想,我都压着,不想把这个平台前期做的很优秀。
    毕竟是集体开发的项目,先求稳,可以扩展。然后再去更好的设计。
    我对设计的要求还是很苛刻的,我是个完美主义者。我的创新思维也是很活跃的。
    所以我相信,我们可以做到最优秀。

    我们的技术小组,也可以做到同心协力,做出最优秀的产品。








  • linux下文件传输的简便方法

    2009-11-13 00:29:51

    作为linux下的工作人员,我今天不得不感到羞愧。
    忙于工作,写报告,回复邮件,频繁点击鼠标,把手指点肿了。

    今天要和北京的同事传送一些文件,我可以ping通他们的服务器,但是却无法登陆,因为ssh受限了。
    我不好意思让他sudo去搞系统的一些东西,就开始想各种办法尝试下。

    第一次尝试,让他使用apache,搭建web服务,结果他们机器上没有apache
    本来计划写个自动下载,安装,运行apache的脚本,不过去官方网站,竟然下载失败。真是晕了。
    一想太麻烦就放弃了。

    第二次尝试,让他执行  python -m CGIHTTPServer
    这个命令调用python去开启http服务,很简单实用。
    结果他的机器python 版本太落后,没有 CGIHTTPServer 模块。
    然后疯狂思考,是否perl也可以一句话搭建web服务,转身问身后的同事,也不清楚。放弃。
    搜索了下,也没有太多mini型的服务器,或者自带的命令。
    rsync,nfs也想了下,太麻烦,放弃了。
    尝试了其他的用python编写的脚本,貌似在低版本上也不能运行。


    第三次尝试,nc -l  -v -p 8000 < 数据文件
    我在本地通过wget去访问,成功。
    而且这种方式出奇的快,比scp要快很多。

    不错的几次尝试,传输文件其实不用那么麻烦的,不一定非要知道对方的帐号与密码。





  • 自动生成bash脚本文档 bashdoc功能

    2009-11-01 19:09:22

    断断续续的完善QA bash 函数库,已经整整一年多。没有想到这个小东西,最后会变成今天这样一个小型的框架。
    它给我带来了很多的帮助,每次更新,都有一些新的领悟。
    再不断的使用中,实实在在的体会到了有使用平台的愉悦。

    最近很多人反映这个小框架的使用问题,没有文档,直接去看代码,很累,而且没有头绪。
    之前不想写文档,是因为自己认为,一个好的帮助文档,应该是类似rdoc,javadoc之类的模式,可以跟随代码自动更新。而不是人为的去维护。我是不想把自己的时间,耗费在写帮助文档上,而且辛苦写出来的东西,还很少有人看。

    不过随着代码,功能以及使用的增多,文档问题的重要性在不断的增大。
    如果没有文档机制,以后的发展也会受限。

    为了让新人更好的学习和了解这个小框架,决定周末加班下,解决自动生成帮助文档的问题。


    从网上搜索了下,发现没有bashdoc之类的工具,之前有人写过一个,还半途而废了。
    因为时间,精力有限,我也不可能再去开发一个。这个工作量是很大的。
    思考了下,决定采用借用别的框架去试试。

    doxygen是个不错的工具,支持的语言较多,但是好像是不支持bash的。而且配置比较繁琐。直接pass了。
    想了想其他的语言,与bash比较类似的,就是python与ruby了。

    最近在学习ruby,所以正好,就锻炼下自己的ruby吧。
    我的设想是把bash脚本,转换到ruby脚本,最后调用rubydoc去完成文档生成。

    bash的语法

    xx()
    {
    }

    ruby的语法

    def xx
    end

    使用awk,就可以很容易转换过去。而且bash与ruby的注释是一致的,注释基本上不需要修改了。
    不过鉴于函数库的注释特性,我加入了一些额外的扩展。

    最后很容易就实现了bash脚本生成文档。

    :<<seven_doc_help
    class:QA
    user:yansheng.huangys
    generate bash documention with rdoc ,  i like it very much
    seven_doc ~/QA
    seven_doc ~/QA/$USER
    seven_doc ~/QA/script. ~/QA/$USER

    if you write your bash script. like our style, reference to qahelp
    then you would be able to generate doc by seven_doc
    if you put your files in QA directory, you would be able to get help by man
    seven_doc_help
    =========================

    ========source code=========
    seven_doc is a function
    seven_doc ()
    {
        rm -rf /tmp/QA_src_doc_$USER;
        mkdir /tmp/QA_src_doc_$USER;
        for f in `find "$@" -name "*.sh" -type f`;
        do
            for cat in QA cmd performance other;
            do
                grep "class:$cat" $f >&/dev/null && {
                    echo "module `echo ${f##*/}|tr '[a-z]' '[A-Z]'`";
                    echo "class `echo $cat|tr '[a-z'] '[A-Z]'`"
                };
                awk -F"\t" 'BEGIN{key="#"}{if($1~/:<<.*_help/) {print "=begin rdoc";key="*";} else if($1~/[^:]*_help$/) {print "=end";key="#";} else if($1~/^.*\(\)/) {print "def "$0
    ;key="#";} else if($1=="}") {print "end#def";} else {print key" "$0} }' $f | awk 'BEGIN{RS="end#def";ORS=RS;}{show=1;if("'$cat'"=="other") {if($0~/class:/) show=0} else {if($0~/
    class:'$cat'/) {} else show=0};if(show==1) {print $0} }';
                echo;
                grep "class:$cat" $f >&/dev/null && {
                    echo "end#class `echo $cat|tr '[a-z'] '[A-Z]'`";
                    echo;
                    echo "end#module `echo ${f##*/}|tr '[a-z]' '[A-Z]'`"
                };
            done >/tmp/QA_src_doc_$USER/doc_${f##*/}.rb;
        done;
        rdoc /tmp/QA_src_doc_$USER --op /tmp/QA_src_doc_$USER/doc -S
    }


    使用这个功能的前期,是你的脚本要按照如下的形式去编写


    :<<qahelp_help
    class:QA
    #你的注释
    qahelp_help
    qahelp()
    {

    #你的代码内容

    }


    或者如下的形式


    #你的注释
    qahelp()
    {

    #你的代码内容

    }





    最后的文档,就和rdoc一摸一样了。














  • 使用ruby DSL构造测试领域专用语言尝试

    2009-10-18 02:44:21

    最近对DSL感兴趣,就使用ruby简单的做了一个试验。
    是为了简化p4p后台测试的操作。让TC编写起来更容易些。

    做了一个小小的demo。如果成型的话,测试人员就可以这样写TC了。
    这是一段检查百度搜索,然后验证的小demo。(实际测试当然不会这样子了)

    host "www.baidu.com" 
    port 80
    page "s"
    field "wd","美女"
    field "sourceid","Mozilla-search"
    get
    check_content "美女"
    check_content "淫秽词"

    把以上内容存到文件里,系统就可以自动运行了。
    登陆baidu,查询“美女”,然后检查里面是否有“淫秽词”。


    DSL定义代码如下

    # To change this template, choose Tools | Templates
    # and open the template in the editor.


    require 'open-uri'
    class MyDSL
      def self.dsl_accessor(*symbols)
        symbols.each { |sym|
          class_eval %{
            def #{sym}(*val)
              if val.empty?
                @#{sym}
              else
                @#{sym} = val.size == 1 ? val[0] : val
              end
            end
          }
        }
      end
      def method_missing(sym, *args)
        self.class.dsl_accessor sym
        puts "method missing #{sym}, #{args}"
        send(sym, *args)
      end
      attr_accessor :query
      dsl_accessor :test
      def self.load(filename)
        dsl = new
        dsl.instance_eval(File.read(filename), filename)
        puts File.read(filename)
        dsl
      end
      def self.loads(filename)
        dsl = new
        dsl.instance_eval(filename)
        dsl
      end

      def field(field_string,value)
        puts "#{field_string}=#{value}"
        if ! @query
          @query="#{field_string}=#{value}"
        else
          @query="#{@query}&#{field_string}=#{value}"
        end
        puts @query

      end
      def get
        puts 'get'
        @request="http://#{@host}:#{@port}/#{@page}?#{@query}"
        puts @request
        @result=open(@request)
      end

      def check_content(s)
        tmp=@result.read.scan(s).uniq
        if tmp.length!=0
          puts "found"
          puts tmp
        else
          puts "not found"
        end
      end

      def post
        puts 'post'

      end

    end#class MyDSL

    dsl=MyDSL.loads('
    host "www.baidu.com"
    port 80
    page "s"
    field "wd","xxxxxxx"
    field "sourceid","Mozilla-search"
    field "yy",0.222
    parameter  0.55,2.1,[2,3,4],{:a=>7,:b=>8,:c=>9}
    get
    check_content "xxx"
    check_content "ffffffffffffff"
      ')
    p dsl
    p dsl.instance_variables






  • ATF的TC管理系统设想

    2009-10-17 15:19:23

    目前正在推进ATF第一阶段的需求整理。

    整理出来的需求远超我们的预期,我们的初步计划是开发一套后台测试的框架。由测试人员写代码去完成测试。
    结果需求提的则是让测试人员完全不接触代码,在web或者excel中直接写行为描述。

    这个曾经也是我的设想。但是没有想到需求来的这么迫切。而且是测试人员提出的。
    这样就无疑增加了我们的开发难度,之前我并没有把UI设计囊括进去。

    为了缩短开发周期,我决定采用迭代式的开发形式。先采用一个基本的模型开发,然后逐渐完善。
    采用MVC的结构,前期注重建模,后期再进行控制器与视图的设计。

    最近两天的工作

    1、TC管理系统的设计。这是个难点。想做到完美不可能。暂时借鉴下流行框架。今天关注的关键词TDD,BDD,Rspec,元编程。
    http://www.ibm.com/developerworks/web/library/wa-rspec/
    http://www.ibm.com/developerworks/cn/java/j-lo-rubytesting/
    http://www.javaeye.com/news/10347-coulda-ruby-test
    研究设计什么样的TC管理框架

    2、参考下iauto与pwatir的框架


    最后的两种思路

    1、采用ROR,让用户登录web系统进行TC管理。web系统设计是男滴,UI设计与美化,数据管理与存储是难题。也许还要多个mysql累赘。
    2、采用EXCEL与目录管理的结构,简单管理TC。EXCEL的话,可以采用DSL或者pwatir的方式去重新定义解析。这样对于用户就更简单些。此处可以做到比pwatir还优秀。

    初步采用第二种,以后扩展的话,再使用第一种。




  • 后台自动化测试框架设计初步设想

    2009-10-13 21:30:35


    最近正在为部门设计后台自动化测试框架。
    以前,其他部门的同事已经搞好了一个框架,写的蛮好的。
    当时因为自己业务基础太差,担心会沉溺于代码,所以就没有放功夫上去。
    现在终于可以有能力与信心去做了。


    之前的框架有一些小瑕龇
    1、配置解析比较臃肿
    2、脚本散乱,没有采用函数的形式,也没有一个完善的管理框架,管理麻烦,而且导致无法很好复用。
    3、模块化不够,使用一些自动化操作不方便。耦合严重,不利于通用。
    4、运行TC太慢。多设计一些并发可能效果会更好些。很多TC是可以并发的。



    本次的初步设计如下

    1、TC管理模块,尽量和之前的框架一致。减少重复劳动,也有利于以后的交流。
    2、对部门功能进行脚本的函数化,并纳入到函数库中进行统一管理。这部分脚本,同时可以为其他部门服务。
    3、无人值守。定期监控svn。一旦有代码变更,立即回归测试。
    4、把内存泄漏测试,代码覆盖率检测,c++代码静态测试,性能测试,以及代码性能监控测试全部纳入到平台中去。
    5、引入场景机制,可以实现多进程无不干扰的运行。
    6、模块化设计,让其他部门也可以借用其中的功能。
    7、配置部分重新设计,是个难点。如何更人性化的去配置,更容易让人使用是个难点。初步计划使用yaml来代替xml。这样会更简练。
    8、TC编写简化。真想考虑采用DSL去搞个自己的部门语言去实现。不过还是easy下,使用一般的方法去调用吧。
    9、数据构造分割为单独的部分,构造数据有必要深挖下。
    10、结果解析要更加简便。借鉴xwaitr结构。
    11、整体结构借鉴微软的那套自动化测试框架结构。


    前期整理需求,设计不幻想这么多。
    下两个周就要好好的画设计图了。


    几条纪律要牢记

    1、项目流程要规范
    2、进度安排要合理
    3、需求,设计文档要齐备
    4、不要另立山头,要多请教别人,尽量统一
    5、里程碑要把握好。

    最大的问题,是时间。大家都有项目,而且项目也很多,不能全身心的投入势必会影响进度的。
    只能挤时间了。
    最近沉默了很多,时间与精力不够,少管闲事,明哲保身暂时成为了座右铭。







  • ahttp_load 改进2(增加query长度)

    2009-09-26 14:14:23

    对http_load进行了又一次的改进。
    上个版本中增加了post请求,但是限于http_load原来的一些原因,请求字符串的字节数大于600的query都会被截断。
    这是个很严重的BUG。

    因为不少的应用的query都是比较长的。而且很多人都不知道这点。
    我也是把ahttp_load 交给同事使用的时候,才发现这个问题的。
    同事的query,一般都会超过2万的。

    针对这个问题,我又进行了一次修改。

    本版本增加的功能

    1、对一些瓶颈进行了修改,目前ahttp_load可支持的最大query长度为50万字节。当然还是要保证你的query不要太长。否则的话,光发送你的query。就需要耗费一定的时间了。统计出来的一些响应时间可能就相对的受到影响。最好不要超过十万个字节。
    2、增加了调试选项。可通过-d 1 去打开调试开关。加压的时候,还是不要打开。这个功能只是用来做调试用的。

    ahttp_load  -s 30 -m 1 -r 300 $utmp

    http_load_200909261352.tar.rar(30 KB)
  • Bash $*与$@的微妙区别

    2009-09-19 12:48:09

    经过这个实验,我把自己的脚本全部改为"$@"了。

    [huangysh@qa16 bin]$ ff()
    > {
    > for f in $@
    > do
    > echo $f
    > done
    > for f in "$@"
    > do
    > echo $f
    > done
    > for f in "$*"
    > do
    > echo $f
    > done
    > }
    [huangysh@qa16 bin]$ ff 2 3 "4 5"
    2
    3
    4
    5
    2
    3
    4 5
    2 3 4 5
    [huangysh@qa16 bin]$ ff 2 3 '"4 5" 6 7'
    2
    3
    "4
    5"
    6
    7
    2
    3
    "4 5" 6 7
    2 3 "4 5" 6 7

  • http_load的未来

    2009-09-14 22:40:28

    因为修复了http_load 的时间差bug,才得以对http_load 有更多的扩展。
    http_load 只能支持1000的rate压力。-r 参数不能大于1000.
    不知道作者当初是怎么考虑的,我想可能的一个原因,是因为它的时间差有问题,导致1000以上的rate,没有办法计算时间差。它的最小时间单位是1ms。精度不够。
    但是通过读代码发现,http_load的加压机制,是不能支持太大的-r 参数的。

    对一个服务进行了加压。发现http_load 随着-r的增大,对加压越来越是力不从心了。
    我修改了上限,让rate增大到了2000,但是能支撑一万qps的服务,在http_load里,只能体现到1500。
    没有采用多线程,是http_load 的硬伤。
    http_load实现不了多线程,将始终是个小工具。成不了大气候。
    修改为多线程,是个很大的工作量,可能要伤筋动骨了,要颠覆http_load的整个机制了,、
    走的太远了,早就偏离了测试,还是重新选择工具吧。

    专注测试。不要偏离。
  • ahttp_load 改进

    2009-09-12 21:00:50

    看了看其他的代码,发现也不难,就忍不住又修改了下。
    稍微完善了下。

    1、可发送post请求
    2、修复-r bug。-r 300就是实实在在的300了。
    3、改成顺序读取。通过自测。是为了模拟线上环境。
    4、增加了一个小提示。真正开始连接的时候,会提示一下。还有其他的一些小标记。比如version的修改等。

    传到了QA工具包中。以后就可以放心使用了。

    相应的脚本不需要做改动了,原来的httpload脚本,可以不用改动,只需要把把http_load 指向ahttp_load 即可。
    发帖纪念一下,本期修改彻底完工了。

    因为修改时间较短,可能还有不少的bug,感兴趣的朋友可以一起研究。
    我会对这个工具进行持续的改进与测试。







    复件 ahttp_load_200909140050.tar.rar(12 KB)

  • 支持post,修复-r bug的http_load

    2009-09-12 19:39:37

    对http_load 的代码进行了重新研究。分析上次提到的-r bug的原因。
    上次提到是http_load 在发送请求间隔的设置上采用了毫秒,导致了-r 300实际会成为-r 333.
    今天重点研究了里面的关于时间的数据结构。进行了多次的跟踪修改,终于解决了这个问题。
    附件是在64位 redhat上编译通过的。

    两个特点。

    1、支持post请求
    2、-r bug修复。


    还有几个目标没有实现。
    1、随机读取文件,要改成顺序读取。
    2、无法处理太大的文件。采用数据池比较好。

    这两个就从长计议了。http_load的研究就暂时告一段落了。
    ahttp_load.tar.rar(30 KB)
  • bash 获得get与post请求数据的cgi脚本

    2009-09-12 04:47:00

    为了测试http_load ,就临时写了cgi脚本。用bash+apache去跑。
    挺方便的。分别获得get请求与post请求。

    #!/bin/bash
    echo "Content-type: text/html"
    echo
    if [ "$REQUEST_METHOD" = "POST" ]; then
        if [ "$CONTENT_LENGTH" -gt 0 ]; then
            read -n $CONTENT_LENGTH POST_DATA <&0
        fi
    fi
    {
    echo "$QUERY_STRING"
    echo dddd $POST_DATA $CONTENT_LENGTH ddddend
    }|tee -a /tmp/post.tmp
    ~

  • 可发送post请求的http_load版本

    2009-09-12 04:40:42

    今天晚上对http_load 进行了部分的改进。
    把post支持加进去了。

    用法

    [huangysh@qa16 http_load_post]$ ./http_load
    usage:  ./http_load [-checksum] [-throttle] [-proxy host:port] [-verbose] [-method 0|1 ] [-timeout secs] [-sip sip_file]
                -parallel N | -rate N [-jitter]
                -fetches N | -seconds N
                url_file
    One start specifier, either -parallel or -rate, is required.
    One end specifier, either -fetches or -seconds, is required.


    如下使用即可。
    ./http_load -method 1 -p 2 -s 10  /tmp/tmp_9589_huangysh.txt

    默认是get,只有加上了-method 1才为post请求。

    目前,正在和部门的同事对http_load 进行翻译注解,为进一步扩展做准备。

    http_load.rar(11.1 KB)



  • http_load两个bug的根源查明

    2009-09-07 00:34:44

    先粗略了浏览了一遍http_load的代码,主文件是一千八百多行。
    之前使用http_load,主要是有两个问题。

    1、http_load -r 的参数不准。
    这个原因是因为时间间隔它使用的是int类型,导致你设置的是-r 300,其实加压的实际压力是333.
    这个容易修改。
    2、文件太大读取慢。太大容易出问题。
    这是同事说的,我也不知道从什么地方得出来的。
    今天google了一下,也没有发现这个说话。
    发现他定义了一个结构数组存放所有的url,每个是5000个字节。文件的所有内容都会放进去。文件大小会有限制的,需要通过池的方式来解决了,貌似麻烦点。
    在我们公司,这个数字显然太少了。
    我使用500万行的query,占用了1.5G内存。

    3、随机读取query
    这个不是bug,有的时候,我们是不希望它随机读取的。
    希望按照原来的日志那样顺序的读取,实现模拟用户的操作。
    看了下代码,也找到根源了。http_load为了实现随机,他多写了不少代码。
    它是用心良苦了,我还要改回来,庆幸难度都不大。

    本月内完成这个任务。

1723/9<123456789>
Open Toolbar