发布新日志

  • [转] 好文章。解释什么叫工作

    kunhappy2005 发布于 2009-12-01 19:06:07

     当时公司招了大批应届本科和研究生毕业的新新人类。平均年龄25岁。那个新的助理,是经过多次面试后,我亲自招回来的一个女孩。名牌大学本科毕业,聪明,性格活泼。私下里我得承认,我招她的一个很重要的原因,除了她在大学里优秀的表现之外,还因为她写了一手漂亮的字。女孩能写一手好字的不多,尤其像她,看起来长发飘飘,多么女性化的一个姑娘,一手字却写的铿锵倜傥,让我对她不由多了很多好感。      
      手把手的教。从工作流程到待人接物。她也学的快。很多工作一教就上手。一上手就熟练。跟各位同事也相处的颇融洽。我开始慢慢的给她一些协调的工作,各部门之间以及各分公司之间的业务联系和沟通让她尝试着去处理。  
        
      开始经常出错。她很紧张,来找我谈。我告诉她:错了没关系,你且放心按照你的想法去做。遇到问题了,来问我,我会告诉你该怎么办。仍然错。又来找我,这次谈的比较深入,她的困惑是,为什么总是让她做这些琐碎的事情?我当时问她:什么叫做不琐碎的工作呢?  
      她答不上来,想了半天,跟我说:我总觉得,我的能力不仅仅能做这些,我还能做一些更加重要的事情。那次谈话,进行了1小时。我知道,我说的话,她没听进去多少。后来我说,先把手头的工作做好,先避免常识性错误的发生。然后循序渐进罢。  
        
      半年以后,她来找我,第一次提出辞职。我推掉了约会,跟她谈辞职的问题。问起辞职的原因,她跟我直言:本科四年,功课优秀,没想到毕业后找到了工作,却每天处理的都是些琐碎的事情。没有成就感。我又问她:你觉得,在你现在所有的工作中,最没有意义的最浪费你的时间精力的工作,是什么?她马上答我:帮您贴发票,然后报销,然后到财务去走流程,然后把现金拿回来给您。  
        
      我笑着问她:你帮我贴发票报销有半年了吧?通过这件事儿,你总结出了一些什么信息?  
        
      她呆了半天,答我:贴发票就是贴发票,只要财务上不出错,不就行了呗,能有什么信息?  
        
      我说,我来跟你讲讲,当年我的做法吧:98年的时候,我从财务被调到了总经理办公室,担任总经理助理的工作。其中有一项工作,就是跟你现在做的一样,帮总经理报销他所有的票据。本来这个工作就像你你刚才说的,把票据贴好,然后完成财务上的流程,就可以了。  
      其实票据是一种数据记录,它记录了和总经理乃至整个公司营运有关的费用情况。看起来没有意义的一堆数据,其实它们涉及到了公司各方面的经营和运作。于是我建立了一个表格,将所有总经理在我这里报销的数据按照时间,数额,消费场所,联系人,电话等等记录下来。  
      我起初建立这个表格的目的很简单,我是想在财务上有据可循,同时万一我的上司有情况来询问我的时候,我会有准确的数据告诉他。通过这样的一份数据统计,渐渐的我发现了一些上级在商务活动中的规律,比如,哪一类的商务活动,经常在什么样的场合,费用预算大概是多少;总经理的公共关系常规和非常规的处理方式。等等等等。  
      当我的上级发现,他布置工作给我的时候,我会处理的很妥贴。有一些信息是他根本没有告诉我的,我也能及时准确的处理。他问我为什么,我告诉了他我的工作方法和信息来源。  
        渐渐的,他基于这种良性积累,越来越多的交待更加重要的工作。再渐渐的,一种信任和默契就此产生,我升职的时候,他说我是他用过的最好用的助理。  
        
      说完这些长篇大论,我看着这个姑娘,她愣愣的看着我。我跟她直言:我觉得你最大的问题,是你没有用心。在看似简单不动脑子就能完成的工作里,你没有把你的心沉下去,所以,半年了,你觉得自己没有进步。她不出声。但是收回了辞职报告。  
        
      又坚持了3个月,她还是辞职了。这次我没有留她。让她走了。  
      后来她经常在MSN上跟我聊天。告诉我她的新工作的情况。一年内,她换了三份工作。每一次都坚持不了多久。每一次她都说新的工作不是她想要的工作。05年的时候,她又一次辞职了。很苦恼,跑来找我,要跟我吃饭。我请她去写字楼后面的商场吃日本料理。吃到中途,忽然跟我说:我有些明白你以前说的话是什么意思了。  
        
      所谓的职业生涯,其实你很难预测到你将来真正要从事什么工作,将来所要从事的工作,是否跟你在大学里学的专业有关。大多数人,很有可能将来所作的工作,跟他当初所学的专业一点关系都没有。从22岁大学毕业在26岁之间这四年,重要的不是你做了什么,重要的是你在工作中养成了怎么样的良好的工作习惯。这个良好的工作习惯,指的是:认真,踏实的工作作风,以及是否学会了如何用最快的时间接受新的事物,发现新事物的内在规律,比别人更短时间内掌握这些规律并且处理好它们。具备了以上的要素,你就成长为一个被人信任的工作的人。  
        
      人都有惰性,也都愿意用那些用起来顺手的人。当你具备了被人信任的基础,并且在日常的工作中逐渐表现出你的踏实,聪明,和细致的时候,越来越多的工作机会就会提供到你面前。原因很简单,用一句话就能交代清楚并且能被你顺利完成的工作,谁愿意说三句话甚至半小时交待一个怎么都不明白的人呢?沟通也是一种成本,沟通的时间越少,内耗越少,这是作为管理者最清楚的一件事。  
        
      当你有比别人更多的工作机会去接触那些你没有接触过的工作的时候,你就有了比别人多的学习机会,人人都喜欢聪明勤奋的学生,作为管理者,大概更是如此。  
        
      一个新手,大多数新手,在这四年里,是看不出太大的差距的。但是这四年的经历,为以后的职业生涯的发展奠定的基础,是至关重要的。很多人不在乎年轻时走弯路,很多人觉得日常的工作人人都能做好没什么了不起。然而就是这些简单的工作,循序渐进的、隐约的,成为今后发展的分水岭。  
        
      漫不经心的对待基层工作的最大的损失,就是将看似简单的事物性处理方式,分界成为长远发展的能力问题。  
        
      聪明的人,总是不认为自己的能力有问题。时间长了,他会抱怨自己运气不好,抱怨那些看起来资质普通的人,总能比自己更能走狗屎运。抱怨她容貌比自己好,或者他更会讨领导欢心。等等等等。慢慢的,影响心态。所谓的怀才不遇,有时是这种情况。  
        
      工作需要一个聪明人,工作其实更需要一个踏实的人。在聪明和踏实之间,我更愿意选择后者。  
        
      而踏实,是人人都能做到的。和先天条件没有太大关系。

        这是在一论坛上看到的帖子,感觉不做,copy过来和大家分享一下。

  • 手机隐藏的功能

    ↘封伈锁嗳 发布于 2009-05-09 01:55:26

     1、隐形的备用电池

      你的手机电量不足了,为了让它能够继续使用,按*3370#键,手机会重新启

    动,启动完毕后,你就会发现电量增加了50%。这部分隐藏的备用电量用完了你就

    必须得充电了,再次充电的时候,隐形的备用电池也同时充电,下次电量低的时

    候又可以用这个方法。知道这个在紧急情况下如果手机电量不足非常管用。

       
        2、紧急情况

      全世界的手机都可以拨打的共同紧急救援号码是112,加入你发现自己所在的

    地区无手机信号覆盖,同时你又遇到了紧急状况,用你的手机拨打112准没错,因

    为这时候你的手机会自动搜索所有可用的网络并建立起紧急呼叫。特别有趣的是

    ,即使你的手机是在键盘锁定的状态,你同样可以拨打112。试试吧!

        3、手机被偷了?

      有个办法让小偷也用不了,嘿嘿!查看手机的序列号,只需键入* # 0 6 #,

    15位序列号会出现在手机屏幕上,全世界的每一台手机都有一个独一无二的序列

    号,把这个序列号记录下来并保存好。有一天如果你的手机不幸被偷了,打电话

    给手机提供商,并提供你的手机序列号,他们会帮你把手机屏蔽,这样即使小偷

    换了SIM卡,仍然无法使用,你的手机对小偷来说变得一无是处。如果全世界每个

    手机持有者都这么做,那么偷手机就没有意义了。在澳洲,警方甚至建立了一个

    被盗手机数据库,如果你的手机被找到了,就可以归还给你了。

        4、车用遥控器落在车里了?

      你的车用遥控能打开吧?如果可以,在你有一天将车用遥控器落在车里而且

    备用的遥控又在家里的话,你会发现有个手机真方便,用手机拨通家里人的手机

    ,将你的手机拿在离车门一英尺的地方,同时家里人拿着遥控器在他的手机旁边

    按响遥控器上的开锁键,这边你的车门就可以打开了。这个方法不管你把车开得

    离家有多远都奏效。 (SEVEN亲身试过了,很有效,很神奇哦)

      日常维护必用:

        1、手机电池不要等到没电才充电。

      一般我们都会有一种想法就是手机的电池电力要全部放完再充电比较好基本

    上是没错的,因为我们在以前使用的充电电池大部分是镍氢(NiH)电池,而镍氢电

    池有所谓的记忆效应若不放完电再充的话会导致电池寿命急速减少。因此我们才

    会用到最后一滴电才开始充电。但现在的手机及一般IA产品大部分都用锂(Li)电

    池,而锂电池的话就没有记忆效应的问题。若大家还是等到全部用完电后再充的

    话反而会使得锂电池内部的化学物质无法反应而寿命减少。最好的方法就是没事

    就充电让它随时随地保持最佳满格状态,这样你的电池就可用的又长又久喔。这

    是从厂商那得到的讯息,并经过本身测试而得。

        2、当手机正在充电时,请勿接电话!!

      原因是手机在充电时,来电接听的话会有潜在的危险。印度有一个31岁在保

    险公司任职业务经理的年轻人,十几天前在手机还接着充电器的时候接听电话,

    过了几秒大量的电流经过手机,这个年轻人被摔落到地面,家人发现时,手指烧

    伤,心跳微弱,并且已经失去意识。经紧急送到医院后,医生宣布到院死亡。行

    动电话是目前大家最常使用的现代发明。然而,我们也必须要警觉到仪器致死的

    危险。

      3、手机剩一格时不要使用

      收讯满格与只剩一格时相比,发射强度竟然相差1000倍以上.所以……常讲手

    机的人……要注意哦……^0^、昨天从一位手机商那儿获得一项很重要的讯息,那

    就是当你发现手机的收讯强度只剩下一格的时候,宁可挂断不谈或者是改用公用电

    话.千万不要再滔滔不绝、口沫横飞、浓情蜜意、欲罢不能、没完没了…为什幺呢

    ?大家都知道手机的电磁波一直是让人担心的问题.而手机的设计为了在收讯较差

    的地区仍能保有相当的通话质量,会加强手机的电磁波发射强度.当收讯满格与只

    剩一格时相比,发射强度竟然相差1000倍以上.电磁波强度高达0.6W(瓦特).0.6W究

    竟有多强呢?我无法具体描述它对你的脑袋会有什幺不良影响,但可以换成两个例

    子来比较:

      1)把喇叭直径约4公分左右的小型收音机音量开到最大然后贴在耳朵上,那样

    的噪音能量一般为0.25W,不到0.5W。

      2)把手指头放在输出强度0.1W的雷射光前面(相当于光纤网络的?D干线能量)

    几秒钟内你会有灼痛的感觉,你能长时间忍受上述这两种状况吗?

      那你又如何确认0.6W的电磁波紧贴在你的耳朵上会没事呢?

      4.12593+电话号码=陷阱

      你是不是把外地朋友的电话用17951+电话号码的格式储存在电话号码本里?而

    不是单独拨?那么收费就会从0.39元每分钟变成1.3元每分钟.我也向1860查询过了

    他们的解释是如果储存在电话号码本里?系统将无法识别。所以无法获得资费优惠

    ,必须每次在键盘上直接按12xxx。神州行用户如此?动感地带用户,全球通也一样

    。如果你是一个中国移动用户,当你知道中国移动为你设置以下的陷阱的时候,

    便不再惊讶于你的话费为何会像长了翅膀一样的飞走。用12593+电话号码可以优

    惠,但如果你预先将“12593+电话号码“存在手机的电话本,使用的时候调出来

    然后拔打出去,这时中国移动不承认你使用了12593这种优惠的拔打方式,而按照

    直接拔打的方式计费。如果你是在漫游,两种计费方式可以相差7倍之多!当我得

    知如此计费之后,我真的不知如何表达我的愤怒,后来打10086咨询时,如果不是

    主动冶询问这个问题,工号为6608的小姐根本就不告诉我这样的计费。

      5、手机费的寄生虫

      手机莫名其妙定置了无用短信,强烈建议大家都看一下自己有没有中招,最简

    单方法退订每月偷你手机费的寄生虫!中国移动在3.15被迫推出一项新业务,如

    果您是中国移动的手机用户,键入数字“0000“,发送短信至10086,数秒钟内将

    自动回复一条短信列表,显示您的手机上究竟订制了哪些短信服务,究竟是哪些

    短信服务商明着、暗着每月扣除您的手机费;键入数字“00000“,发送短信至

    186201,即可退订所有短信服务。

      6、不要赶着凑正好1分钟

      我们打电话的时候常常会为了正好赶在1:00前结束而庆幸,但其实并不是这样

    的,据一位中国移动的工作人员说,其实在你通话到0:55的时候就已经算一分钟了,

    所以0:55~1:00的通话时间其实是算你2分钟的钱~

      7、手机一进水,请切记不要作任何按键动作,尤其是关机(一按任何动作,

    水马上会跟着电路板流串),正确的方法为马上打开外盖,直接将电池拿下,直接

    强迫断电,可保主机板不被水侵袭。

      这个常识非常重要,故转告各位,使大家的手机可用久一点。学一学吧!以

    后以备不时之需啊!

      8、如何让手机电池起死回生

      当你的行动电话电池使用时间变短(记忆效应或老化)时,你是否会再买一颗电

    池来更换呢?

      下次当你碰到这种情况时请省下你的钱,告诉你一个很有效的方法不妨试试看

      1)把电池用报纸包起来再放进塑料袋裹包好放入冷冻库三天(报纸可吸收多

    余水份)

      2)三天后取出常温下放二天

      3)二天后将电池充电,充饱后装进行动电话裹测试(预估可救回80%-90%)

      本讯息由知名电池厂商工程师透露,根据测试过的朋友指出效果相当有效.

      至于有没有效果,反正电池快没用了,而且冰箱人人有,各位朋友不妨试试看吧

    !

      9、给你的手机做个CPR吧!

      手机是否常断电?或是明明充饱了电没多久就又没电了?

      一定怀疑过是不是手机的寿命终了?

      别担心,它只是一时“心跳停止”,只要一块小小的橡皮擦就能起死回生了

      把电池取出后用橡皮擦把电池上的接点(黄铜片)擦干净,再装回手机上,你

    会发现真是太神奇了!它竟然活过来了!还像颗新的呢!

      真的很有用,提供大家做参考!

      10、教你如何消除手机屏幕刮痕

      大家是否常常会遇到手机屏幕有刮痕而不知如何处理的情况呢?

      告诉大家一个好用的秘方....(前几天在电视上看到的)

      把牙膏适量挤在湿抹布上后用力在手机屏幕刮伤处前后左右来回用力涂

    匀.....

      你将发现.....手机的屏幕刮痕会因此而消失....很神奇吧...!!

      更神奇的事....在用干净的抹布或卫生纸擦干净后..手机屏幕还会变得更亮

    哦....

      台大化学教授表示:原理为牙膏它只是刷牙的辅助用品,具有磨擦作用(修补

    作用)

      和去除菌斑,清洁抛光牙面,因此使用在手机屏幕上面会有同样的效果。

  • QTP 学习视频汇总

    sixsigmay 发布于 2008-11-13 19:01:40

     


    [V] 小布老师QTP系列培训视频 - 1
    http://www.boobooke.com/v/bbk1043
    本讲讲了QTP的概述,希望大家喜欢。

    [V] 小布老师QTP系列培训视频 - 2
    http://www.boobooke.com/v/bbk1044
    本讲讲了测试规划,希望大家喜欢。

    [V] 小布老师QTP系列培训视频 - 3
    http://www.boobooke.com/v/bbk1045
    本讲讲了录制测试脚本,是使用QTP的第一步,希望大家喜欢。

     小强作品-零基础学习软件测试-qtp-目录
    1 qtp目录分析
    2 qtp界面分析
    3 qtp示例程序分析
    4 qtp学习指南
    5 qtp基本操作录制与回放
    6 qtp的三种录制绞?br /> 7 增强help步骤
    8 checkpoint
    9 参数化
    10 Tools下的工具介绍
    11 qtp插件分析
    12 qtp测试用例设计考题
    13 vbs
    14 recovery Scenarios
    15 虚拟对象
    16 专家视图测试脚本开发
    17 qtp描述性编程
    18 qtp测试脚本编写规范

    [V] 小强老师系列作品:QTP的安装目录分析
    http://www.boobooke.com/v/bbk1590
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP安装后的各个目录,重点介绍了大家需要关注的东西,希望对大家有帮助。

    [V] 小强老师系列作品:QTP界面剖析
    http://www.boobooke.com/v/bbk1594
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了QTP的常用界面和菜单选项,希望对大家有帮助。

    [V] 小强老师系列作品:QTP示例程序之研究
    http://www.boobooke.com/v/bbk1598
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了QTP自带的示例程序-飞机订票系统,别小看这个示例程序,小程序里面有大文章,且听小强老师给你道来, 希望对大家有帮助。

    [V] 小强老师系列作品:QTP学习指南
    http://www.boobooke.com/v/bbk1515
    在本集中,小强老师根据自己的经验和体会,向刚刚接触QTP的朋友介绍了如何学习QTP的一些方法和经验,希望对大家有帮助。

    [V] 小强老师系列作品:QTP脚本的录制和回放
    http://www.boobooke.com/v/bbk1591
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP最基本的脚本录制回放的功能,希望对大家有帮助。

    [V] 小强老师系列作品:QTP三种录制方式
    http://www.boobooke.com/v/bbk1516
    这是该系列讲座的第三集。在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP录制脚本的三种模式,希望对大家有帮助。

    [V] 小强老师系列作品:QTP检查点之研究
    http://www.boobooke.com/v/bbk1595
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了QTP的重要功能 - 检查点,希望对大家有帮助。

    [V] 小强老师系列作品:QTP参数化之研究
    http://www.boobooke.com/v/bbk1599
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了QTP重要的功能-参数化, 希望对大家有帮助。

    [V] 小强老师系列作品:QTP的常用工具阐释
    http://www.boobooke.com/v/bbk1589
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP附带的常用工具,希望对大家有帮助。

    [V] 小强老师系列作品:QTP插件分析
    http://www.boobooke.com/v/bbk1689
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP插件的基本知识,希望对大家有帮助。

    [V] 小强老师系列作品:QTP认证考试试题分析一则
    http://www.boobooke.com/v/bbk1575
    小强老师针对想入行软件测试行业的菜鸟级别的朋友,推出了零基础学习软件测试系列培训视频。
    在本集中,小强老师根据自己的经验和体会,向刚刚接触QTP的朋友介绍了如何QTP认证考试的一道典型题目的分析.

    [V] 小强老师系列作品:QTP中VBS介绍
    http://www.boobooke.com/v/bbk1621
    在本集中,小强老师给大家介绍了QTP脚本语言VBS的基本知识,希望大家喜欢。

    [V] 小强老师系列作品:QTP之场景恢复(Recovery Scenarios)
    http://www.boobooke.com/v/bbk1692
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP的场景恢复(Recovery Scenarios)的基本知识,希望对大家有帮助。

    [V] 小强老师系列作品:QTP中的虚拟对象入门
    http://www.boobooke.com/v/bbk1695
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP中虚拟对象的基本知识,希望对大家有帮助。

    [V] 小强老师系列作品:QTP之专家视图和测试脚本开发
    http://www.boobooke.com/v/bbk1690
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP的专家视图,并介绍了脚本开发的几个重要对象,希望对大家有帮助。

    [V] 小强老师系列作品:QTP之描述性编程
    http://www.boobooke.com/v/bbk1691
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP的描述性编程的基本知识,希望对大家有帮助。

    [V] 小强老师系列作品:QTP之测试脚本开发规范
    http://www.boobooke.com/v/bbk1693
    在本集中,小强老师向刚刚接触QTP的朋友介绍了QTP脚本开发的基本规范,希望对大家有帮助。

    [V] 小强老师系列作品:QTP脚本的增强一则
    http://www.boobooke.com/v/bbk1592
    本集是承接上集,小强老师向刚刚接触QTP的朋友介绍了如何对录制的脚本进行增强,希望对大家有帮助。

    ================================================================================
    [V] QTP 9的新特性 1 - 英文视频
    http://www.boobooke.com/v/bbk1050
    是QTP 9软件中自带的视频讲座,英语讲座

    [V] QTP 9的新特性 2 - 英文视频
    http://www.boobooke.com/v/bbk1051
    QTP 9软件中自带的视频讲座,英语发音

    [V] QTP 9的新特性 3 - 英文视频
    http://www.boobooke.com/v/bbk1052
    QTP 9软件自带的视频讲座,英语发音,希望大家喜欢。
  • loadrunner学习系列---脚本编写(2)

    zibeike 发布于 2007-12-12 20:58:53

       今天接着翻译http://www.wilsonmar.com/1lrscrīpt.htm上面关于LR脚本编写部分.

    VUser_Init部分

    这里是Vuser_init部分的一些例子:

    操作系统的User ID

    下面显示了使用advapi32.dll的GetUserNameA函数获得的操作系统的用户ID

    	char	sUserID[1024]; // Maximum possible UserID length.
    	long	lUserIDSize = sizeof(sUserID)-1;
    	int 	rc;
    
    	rc=lr_load_dll("advapi32.dll");
    	if( rc != 0 ){
    		lr_error_message("lr_load_dll of advapi32.dll failed. Aborted for rc=%d",rc);
    		lr_abort(); 
    	}else{
    		GetUserNameA(sUserID, &lUserIDSize);
    		lr_message("UserID='%s'", sUserID);
    	}
    所有的变量声明需要一块放到最上方。在vuser_init 部分创建的本地C变量(如 int或char)对其他部分的脚本是不可见的。所以使用lr_save_string函数来创建对所有脚本可用的全局参数。例子:
       
    char *itoa ( int value, char *str, int radix ); 
    vuser_init(){ 
    	int x = 10;
    	char buffer[10]; 
    	lr_save_string( itoa( x, buffer, 10) , "pX" ); 
    	lr_message ( "int x = %s", lr_eval_string("{pX}" )); 
    return 0;
    } 
     
     
    运行时设置的附加属性(Additional Attribute)
      8.0版本引进了一个非常有价值的特性:在运行时设置中指定属性,这个属性可以对不同的虚拟用户组设置不同的值。
     
     下面的代码是从运行时设置的附加属性中读取名为“usertype”的参数。然后使用参数值来对应的设置全局的"thinktime1"变量。
       
    int thinktime1=0;
    vuser_init()
    {
      LPCSTR strUsertype; // Define *str.
      strUsertype = lr_get_attrib_string("usertype");
      if (strUsertype==NULL){
        lr_output_message("### Run-time Settings Additional Attribute usertype not specified. Cannot continue.");
        lr_abort();
      }else{
        lr_message("### Run-time Settings Additional Attribute usertype=\"%s\"", strUsertype );
        if( strcmp( strUsertype,"advanced") == 0 ){ thinktime1=2; }
        else
        if( strcmp( strUsertype,"intermediate") == 0 ){ thinktime1=4; }
        else
        if( strcmp( strUsertype,"basic") == 0 ){ thinktime1=8; }
        else{
          lr_error_message("### ERROR: Value not recognized. Aborting run." );
          lr_abort();
        }
        }
        return 0;
      }
       
      Time Structure Fix(不知道怎么翻译,呵呵,“时间结构的解决“?)
      根据知识库34195的文章,默认当前时间戳的毫秒部分不被更新,除非ftime使用的时间结构被重新定义:
      typedef long time_t; 
      struct _timeb { 
         time_t time; 
         unsigned short millitm;
         short timezone; 
         short dstflag; 
      }; 
      struct _timeb t; 
      _tzset(); \\ 使用ftime设置变量 
      _ftime( &t ); 
      lr_message( "Plus milliseconds: %u", t.millitm ); 
      
      控制信息的显示:
      在运行时,当脚本的事务失败后继续,你怎么知道哪个用户失败了?
       Idea在每个失败的事务之后,发出一个能够唯一确定该用户的信息。
      Loadrunner提供了一些函数来在运行时显示信息:
         
    • // 往输出日志上发送消息,这个消息前边会带有action 的名称和行数
      lr_output_message("an output message");

      例子:

      • Actions.c (4): an output message

    • // 往输出日志和虚拟用户日志上发消息:
    • lr_message("*** a message"
        +"\r"+"A new line."
          );
    • Idea把");"放到另一行,这样可以容易的在命令上添加或者删除代码项。

      UNIX/Linux机器上,使用 "\n"来添加一个换行。

      Windows 机器上,使用"\r"来添加一个换行。

      // 往输出日志上发送不带action名称和行数的信息
      lr_log_message("number\t"+ numvar +"\t");

       

      // 只给控制器上的虚拟用户状态区域发送信息(当在VuGen中运行时,只是简单的显示):
      lr_vuser_status_message("a vuser status message");

       

      // 给LoadRunner控制器或者Tuning模块的控制台输出窗口显示一个红色高亮度显示的-17999 信息。
      lr_error_message("an error message");

       

      Idea 使用lr_error_message将会使日志信息堆栈在每个新的action开始时被自动清空。如果选择了"当错误发生时才发送消息", 这些信息仍然被创建在"日志信息堆栈"里, 但是被压缩了(没有显示),直到监测到一个错误。

       

       

         
         
         
         
         
      • Loadrunner学习---脚本编写(1)

        zibeike 发布于 2007-12-11 17:32:16

           中午看了两集《奋斗》发现越看越想看,但是想到好不容易没上班,在家还是赶紧学习下LR的知识吧。下面这个网页的文章原来也是看过的,但发现没几天就忘记了,为了加深学习的印象,特把它翻译出来。http://www.wilsonmar.com/1lrscrīpt.htm上是关于脚本编写的介绍.下面是第一部分,脚本的开发.

        VuGen脚本文件的开发过程

        1。定义测试项目的目标,环境,脚本,测试数据,硬件等。脚本应该符合编码规范或编码习惯。

        2。创建一个版本文件夹来保存被测应用程序相关的各种不同资源,例如截获的.png/.gif图形文件,录制过程保存的html文件,录制中的所有html源文件和VuGen的录制日志。

        3。列出(在表里)每一个手动操作业务过程需要的实际步骤

        1)截取每一个屏幕图像(screen image )。

        2)为每一个屏幕(screen)分配一个唯一的事务名称。

        3)为处理的每一个步骤使用的技术组件(URL或者方法和函数)做注释。

        4。创建一个版本文件夹。

        注:我不喜欢使用默认位置,我喜欢把所有脚本相关的文件放到一个相同的文件夹中。不幸的是,这意味着如果我在不同的测试间互相交换录制,那我每次都得记住修改默认的设置。

        注:当录制一个新的脚本时,我喜欢选择多协议而不是单个协议。。。

        5。根据你的业务处理列表上指定的用户使用步骤和screen的顺序来使用VuGen录制程序,产生一系列脚本代码。在“开始录制”对话框中

          * 使用COM/DCOM 协议时,选择“Win32应用程序“

          * 使用Web(HTTP/HTML)时,选择“Internet Application“

        6。根据改进脚本方法和脚本语言规则来修改脚本。

           改进脚本的方法:

           1)为每一个GUI的screen添加事务语句来获得事务时间。

           2)添加显示数据来帮助调试。

           3)添加验证点来验证是否期望的文本或者图片在每个脚本执行后显示。

           4)通过插入新参数和动态获得整个文件的方式对硬编码的URL,用户id,用户密码和其他的变量数据进行参数化。这样脚本中的参数就可以被动态的替换,以此来模拟运行时不同数据的使用。

           5)添加重试逻辑(retry logic)来处理不可见的错误。

           6)添加随机函数发生器变化脚本来模拟真实的负载。

           7)添加if/else逻辑来检查结果,或者来进行合适的操作,或者来在合适的时候退出脚本。

           8)在一个screen中添加语句来捕获需要在其他命令中使用的数据。当使用Microsoft .NET的web form技术的时候,需要避免习惯性的“脚本超时“错误。

           9)添加语句来调用外部库函数,以便保存和检索在内存Virtual Table Server中的数据。

           10)处理XML.

           11)添加语句来模仿客户端的Javascrīpt问题。

           12)添加语句来管理超时。

           13)从事务计时器中计算和减去无效的时间。

           14)输出日志。

           15)添加集合点。

           16)添加时间(Timing)。

        脚本语言规则:

            把cookie代码标注出来(因为脚本运行的时候他们被再次执行)。

        7。通过在VuGen中运行来调试和调整脚本(单个用户),同时运行时设置的日志能够显示如下信息:

            辨别和解决脚本编辑错误。

            决定timing.

            设置初始运行设置的场景。

        8。在控制器中使用full test Runtime Settings来运行脚本。

        脚本录制和产生:

        建立一个新脚本的第一步是选择一个单协议或多协议。

            * 一些协议可能在多协议模式下不能用。 

            * 只有在多协议的GUI下你才能重新排列action

         在使用Java协议之前,确保你在环境变量的路径下有JDK,否则你可能会遇到这个错误:

           Error: Failed to find javac.exe Java Compiler in Path and JDK installation folder   in registry. [MsgId: MERR-22981]
           Error: Failed to get JRE version. Check that your PATH environment variable contains \bin directory. [MsgId: MERR-22986]

        当选择Java协议的时候:

           * 只有选择了“RMI Java”才能录制。

           * 如果选择“Java user”,“开始录制”图标或菜单是灰色的。

        当你打开一个新的脚本时,默认的脚本名称为“noname1”。下一个新的脚本名称为“noname2”,以此类推。

        注:有顺序的录制多个动作(而不是录制一个动作,然后停止开始另一个动作)。这样能使你识别出在你脚本中需要关联的序列码(在例如PeopleSoft的程序中)。

        注:每次修改脚本后,脚本都需要重新编译。

        Java:略

        脚本文件的调用:

            VuGen是默认在你双击.usr后缀文件的时候被调用。

             在这个文件里,Javascrīpt被指定为“Type=General-Js”。

        为了避免重新编译,我使用命令行的变量和值得组合这样的批处理文件来调用控制器。例如:

          

          REM LoadRun from LoadRunner 8.0 default installation location:
          SET LR80=C:\Program Files\Mercury Interactive\Mercury LoadRunner\bin
          cd %LR80%
          wlrun.exe -TestRun c:\Temp\Scenario1.lrs
          -port 8080

        脚本文件Action

          主机上的代理发送的到服务器的请求是由虚拟用户生成器创建的(VuGen.exe)action的回放实现的。

          Loadrunner创建的脚本有三部分:

          * vuser_init 来初始化 Vuser。执行在这部分的虚拟用户的状态是"Init"

          * Action 用来重复多次迭代  执行到这部分的虚拟用户的状态是"Running"

          * vuser_end 推出虚拟用户。 执行到这部分的虚拟用户的状态是"Exiting"

        如果你的脚本只需要执行一次,你仍然需要把这些脚本写到Action部分,因为在其他部分(vuser_init 和vuser_end)有些命令是不合法的或者会忽略掉。

        VuGen允许脚本包含多个action。所以我为每一个screen创建一个新的action。

        注:如果你想使用不同的用户登陆,就不要把登陆操作放到vuser_init中,而是放到action部分。

        VuGen根据选择脚本选择协议的不同来添加不用的引用到“.h”头文件。

        C的.h头文件

        对于Web(HTTP/HTML)协议,

        创建globals.h,包含内容:

          

        #ifndef _GLOBALS_H
        #define _GLOBALS_H
        
        //--------------------------
        // Include Files
        #include "lrun.h"
        #include "web_api.h"
        #include "lrw_custom_body.h"
        	// recorded for web_custom_request functions.
        //--------------------------
        // Global Variables
        
        #endif // _GLOBALS_H
        

        对于COM/DCOM协议:略

        C脚本语言的格式:

        LoadRunner使用的没有进行微软扩展的ANSI C语法任意最小的action代码块如下:

        #include as_web.h // from LoadRunner's include folder.
        Action1()
        {
        	/* comment block 
        	*/
        
        	// comment line
        
        return 0;
        }
        

        C脚本编译/类库

        当VuGen编译脚本时,产生一个"pre_cci.ci"文件,这个文件包含了所有action的代码和包含文件。这就是为什么会有语法错误“not writing pre_cci.ci”的原因。

        控制器编译这些.ci文件为机器目标码。

        VuGen在每一个脚本文件中自动创建一个lib文件夹,这个文件夹中包含了combined_lib.c文件。该文件包含了所有引用文件。

          #include "lrun.h"   来定义 UNIX或者Windows的函数。
          #include "globals.h"  LoadRunner'的模版文件夹的其中一个。

          #include "vuser_init.c"
          #include "Action.c"
          #include "vuser_end.c"

         警告:当你使用类库中的函数却没有正确包含该类库的时候,你会收到一条错误信息:

          Error -- Unresolved symbol

        C类库

          LoadRunner 使用 A website external to this site 1994 GNU C Pre-Processor options 和 A website external to this site 1995 LCC-win32 Retargetable C Compiler/Linker from the Free Software Foundation via Chris Fraser of AT&T and Dave Hanson of Princeton.

         附加的函数定义在zip file ANSI C library中。

        外部的没有返回整型数的C函数需要在脚本的开头进行显式声明。例如,string函数中的 string tokenizer:

        extern char* strtok(char *token, const char *delimiter);

        Java语法:略

           OK,先到这里,休息一下,下期接着翻译LR脚本相关知识.

      Open Toolbar