(假设你已经看过上一篇的《当孔明遇上QTP时》一文,下文继承上文的叙述方式和故事背景,对性能测试工具LoadRunner展开故事)
一切都是必然的,比如历史的必然性,比如孔明注定无法帮助蜀国一统天下。为何这样说?在《三国志里没有告诉你的》一书中说到:孔明曾建造了一种大型防御系统——律霸。律者,法令也,律霸号称是史上法令最严明、监管最细致的防御系统,能够抵挡住百万敌军潮水般的猛攻。但即便如此,孔明仍然六出祁山而无功,蜀国顷刻土崩瓦解,剩下个小禅禅乐不思蜀。可是为何会这样?我决定回到那个历史时期去查个出水芙蓉……嗯?哦不是,是查个水落石出。……(此处省去时间旅行的具体过程,保密)
我准确地传送到三国时期律霸城内孔明的办公室,并化装成一名小兵,便于暗访。室内有孔明和 LoadRunner团队(以下简称LR)。
“LR,你们的师弟QTP说你们能够胜任对律霸(服务器端)的性能测试,能测出它能够抵挡(处理)多少敌军(客户端),对吧?那你们几位是怎么协作的?”“回丞相,主要是这样的,首先需要模拟敌军的进攻行为(用户的操作),这由我VuserGenerator(虚拟用户生成器)来把他们的行为记录成脚本。与QTP不同的是:我不是记录表面的动作,而是往来的通信协议,比如你传令时采用的战旗、战鼓、炮号等通信方式(http\winsock等);
然后这位Controller(控制器)会根据我的脚本和设置的场景来指挥无数的兵将,向律霸进攻,向它施加压力,然后收集律霸的情况,保存数据;
再由这位Analysis(分析器)根据这些数据生成各种图表,描述各个细节的情况,以便找出性能问题的所在。”
“哦,那有个问题是敌军的进攻行为会各有不同,比如有刀枪兵、弓箭兵、炮火和冲车这些兵种,而且他们可能是同时进攻的……
“这个不是问题,把不同兵种归到不同的脚本,控制器能够同时控制他们。并且VuserGenerator可以设立集合点,让他们先在某一地点集结,等时机成熟时就一拥而上”
“控制器能不能控制敌方一批一批地上?”
“可以,通过设置场景来控制他们每隔一段时间就多上一批人,逐渐加大对律霸的压力,这样就可以知道律霸的性能是在多大压力时开始变差的。”
“那怎么衡量这些性能是好是坏?”
“最基本的是看我方人员能在多长时间(响应时间)内把来犯的敌人解决掉”
“那这个时间岂不是越短越好?”
“对。你可以把你关心的过程指定为事务,分析时的粒度就可以细化到这个过程上来。”
“那Vuser能不能做参数化?比如录制脚本时,A在A1位置上,B对A1位发一箭;而实际测试时A已经走到A2位了,B会不会还射向A1?能不能做到根据A的位置来调整B的目标?”
“啊……丞相真是心思缜密、深谋远虑、高瞻远瞩、顾全大局,我们对丞相的景仰,犹……”
“别废话!”
“是是是。呃……丞相,纠正一下,那个并不是参数化,而是叫关联:就是预先在脚本中获取A的当前位置,再把这个位置指定为B的目标,这样脚本就没错了。By the way ,我当然也能做参数化。”
待孔明修改完脚本后,测试开始了。只见无数兵将涌向律霸,他们就像是虚拟的,颜色几近透明,但他们确确实实能够像真人一样冲车架梯,弯弓搭箭,对律霸造成破坏。
测试结束了,分析器向孔明汇报测试结果:
“经测试,发现律霸能够抵挡的最大并发兵力接近一百万个,其中传统兵种比如弓弩,落石等部队的响应时间都在5秒以内,性能较好,而问题出在丞相设计的‘拿你命300’上面,它的出错率随着敌军并发兵力的增大而明显上升。”
“嗯?难道它又把玉米当武器投出去了?”
“这倒没有。我们对它进行细分(页面细分),发现问题在于……仍然是丞相发明的诸葛弩……”
“什么?诸葛弩可是我的成名作啊,你们查清楚没啊?要是搞得我的百度排名跌出前三我就……”
“别急啊丞相,听我们说完。我们又继续往下,深入到诸葛弩的各个部件,终于发现瓶颈是前端支架这个中间件。每次张弩,那个支架都会发生一点弯曲,频繁使用时来不及恢复回去,所以命中率就越来越低。”
“什么?这个支架可是山姆大叔那边弄过来的啊,还说是钛合金呢,难道被忽悠了?嗯……要尽快优化它,先改用青铜的试试,没准性能更好。等优化后再测一次。”
由于进展顺利,我反倒不解了:这样的测试结果很理想啊,如果诸葛弩的问题解决了,那杀伤力更是惊人了。没理由说后来会被打垮啊……嗯?且慢!孔明的脚本不够全面,没有尽可能地模拟真实情况:他考虑的都是律霸的被动防守,而没有加入主动进攻的情况。亮亮啊,难道你的军队只守不攻的吗?你没有正确认识到自己军队的作战能力,难怪不能统一天下。来,让我来完善它!
我找到LR团队,告知我的真实身份——测试专员后,在他们原有的脚本中加入了律霸军队主动进攻的部分,模拟敌军在这种情况下如何与律霸抗衡,这样可以测试律霸的进攻能力。我又加入了敌军撤退的动作,这也是重要的,可以测出当敌军对律霸的压力减小后,律霸的人员、武器等资源能否正确回收(检查内存回收性能),及时恢复原状。最后再写一行注释://Add by Romer.(LR会用几种语言:C,Java,VB,而最精通的是C)。
等律霸修复后就可以进行第二次测试了。可是奇怪,怎么LR没有建议孔明再多建一个律霸来作为测试平台,怎么直接在正式平台上测?如果正式平台挂了就要修复一段时间后才能使用了。
5、谁在掌控LR
“不好了,丞相!据可靠线报,LR是司马懿的卧底!”
“什么?……抓住他们,他们知道律霸的很多秘密!”
“报……LR正收拾微软,不是,是收拾细软,准备逃跑!”
“别慌,我知道LR也跟QTP一样不会触类旁通,完全是遵照脚本来执行的。幸好之前我没有加入律霸主动进攻的脚本,就是为了防着他们。我们现在主动进攻的话,LR是不知道怎么应付的,你随便带几百人去生擒他们回来。”
生擒,几百个人怎么行?LR按照我增加的脚本,以百万大军猛扑过来,这几百人瞬间被秒杀。孔明只好投入全部兵力,双方一场血战,惊天动地。混战许久,LR 才渐处劣势,于是他们遵照我的脚本——马上撤退了。而追击LR的孔明军由于没有了律霸城防的配合,战斗力减半,最终没能追上LR……
一切都是必然的,比如历史的必然性,比如孔明注定无法帮助蜀国一统天下。为何这样说?在《三国志里没有告诉你的》一书中说到:孔明曾建造了一种大型防御系统——律霸。律者,法令也,律霸号称是史上法令最严明、监管最细致的防御系统,能够抵挡住百万敌军潮水般的猛攻。但即便如此,孔明仍然六出祁山而无功,蜀国顷刻土崩瓦解,剩下个小禅禅乐不思蜀。可是为何会这样?我决定回到那个历史时期去查个出水芙蓉……嗯?哦不是,是查个水落石出。……(此处省去时间旅行的具体过程,保密)
我准确地传送到三国时期律霸城内孔明的办公室,并化装成一名小兵,便于暗访。室内有孔明和 LoadRunner团队(以下简称LR)。
“LR,你们的师弟QTP说你们能够胜任对律霸(服务器端)的性能测试,能测出它能够抵挡(处理)多少敌军(客户端),对吧?那你们几位是怎么协作的?”“回丞相,主要是这样的,首先需要模拟敌军的进攻行为(用户的操作),这由我VuserGenerator(虚拟用户生成器)来把他们的行为记录成脚本。与QTP不同的是:我不是记录表面的动作,而是往来的通信协议,比如你传令时采用的战旗、战鼓、炮号等通信方式(http\winsock等);
然后这位Controller(控制器)会根据我的脚本和设置的场景来指挥无数的兵将,向律霸进攻,向它施加压力,然后收集律霸的情况,保存数据;
再由这位Analysis(分析器)根据这些数据生成各种图表,描述各个细节的情况,以便找出性能问题的所在。”
“哦,那有个问题是敌军的进攻行为会各有不同,比如有刀枪兵、弓箭兵、炮火和冲车这些兵种,而且他们可能是同时进攻的……
“这个不是问题,把不同兵种归到不同的脚本,控制器能够同时控制他们。并且VuserGenerator可以设立集合点,让他们先在某一地点集结,等时机成熟时就一拥而上”
“控制器能不能控制敌方一批一批地上?”
“可以,通过设置场景来控制他们每隔一段时间就多上一批人,逐渐加大对律霸的压力,这样就可以知道律霸的性能是在多大压力时开始变差的。”
“那怎么衡量这些性能是好是坏?”
“最基本的是看我方人员能在多长时间(响应时间)内把来犯的敌人解决掉”
“那这个时间岂不是越短越好?”
“对。你可以把你关心的过程指定为事务,分析时的粒度就可以细化到这个过程上来。”
“那Vuser能不能做参数化?比如录制脚本时,A在A1位置上,B对A1位发一箭;而实际测试时A已经走到A2位了,B会不会还射向A1?能不能做到根据A的位置来调整B的目标?”
“啊……丞相真是心思缜密、深谋远虑、高瞻远瞩、顾全大局,我们对丞相的景仰,犹……”
“别废话!”
“是是是。呃……丞相,纠正一下,那个并不是参数化,而是叫关联:就是预先在脚本中获取A的当前位置,再把这个位置指定为B的目标,这样脚本就没错了。By the way ,我当然也能做参数化。”
待孔明修改完脚本后,测试开始了。只见无数兵将涌向律霸,他们就像是虚拟的,颜色几近透明,但他们确确实实能够像真人一样冲车架梯,弯弓搭箭,对律霸造成破坏。
测试结束了,分析器向孔明汇报测试结果:
“经测试,发现律霸能够抵挡的最大并发兵力接近一百万个,其中传统兵种比如弓弩,落石等部队的响应时间都在5秒以内,性能较好,而问题出在丞相设计的‘拿你命300’上面,它的出错率随着敌军并发兵力的增大而明显上升。”
“嗯?难道它又把玉米当武器投出去了?”
“这倒没有。我们对它进行细分(页面细分),发现问题在于……仍然是丞相发明的诸葛弩……”
“什么?诸葛弩可是我的成名作啊,你们查清楚没啊?要是搞得我的百度排名跌出前三我就……”
“别急啊丞相,听我们说完。我们又继续往下,深入到诸葛弩的各个部件,终于发现瓶颈是前端支架这个中间件。每次张弩,那个支架都会发生一点弯曲,频繁使用时来不及恢复回去,所以命中率就越来越低。”
“什么?这个支架可是山姆大叔那边弄过来的啊,还说是钛合金呢,难道被忽悠了?嗯……要尽快优化它,先改用青铜的试试,没准性能更好。等优化后再测一次。”
由于进展顺利,我反倒不解了:这样的测试结果很理想啊,如果诸葛弩的问题解决了,那杀伤力更是惊人了。没理由说后来会被打垮啊……嗯?且慢!孔明的脚本不够全面,没有尽可能地模拟真实情况:他考虑的都是律霸的被动防守,而没有加入主动进攻的情况。亮亮啊,难道你的军队只守不攻的吗?你没有正确认识到自己军队的作战能力,难怪不能统一天下。来,让我来完善它!
我找到LR团队,告知我的真实身份——测试专员后,在他们原有的脚本中加入了律霸军队主动进攻的部分,模拟敌军在这种情况下如何与律霸抗衡,这样可以测试律霸的进攻能力。我又加入了敌军撤退的动作,这也是重要的,可以测出当敌军对律霸的压力减小后,律霸的人员、武器等资源能否正确回收(检查内存回收性能),及时恢复原状。最后再写一行注释://Add by Romer.(LR会用几种语言:C,Java,VB,而最精通的是C)。
等律霸修复后就可以进行第二次测试了。可是奇怪,怎么LR没有建议孔明再多建一个律霸来作为测试平台,怎么直接在正式平台上测?如果正式平台挂了就要修复一段时间后才能使用了。
5、谁在掌控LR
“不好了,丞相!据可靠线报,LR是司马懿的卧底!”
“什么?……抓住他们,他们知道律霸的很多秘密!”
“报……LR正收拾微软,不是,是收拾细软,准备逃跑!”
“别慌,我知道LR也跟QTP一样不会触类旁通,完全是遵照脚本来执行的。幸好之前我没有加入律霸主动进攻的脚本,就是为了防着他们。我们现在主动进攻的话,LR是不知道怎么应付的,你随便带几百人去生擒他们回来。”
生擒,几百个人怎么行?LR按照我增加的脚本,以百万大军猛扑过来,这几百人瞬间被秒杀。孔明只好投入全部兵力,双方一场血战,惊天动地。混战许久,LR 才渐处劣势,于是他们遵照我的脚本——马上撤退了。而追击LR的孔明军由于没有了律霸城防的配合,战斗力减半,最终没能追上LR……
6、结局
不过看来司马懿并不完全信任LR,他只给LR一百万人数上限的License(许可),如果上限再大一点,就能击溃律霸了!接下来的情况可想而知:司马懿掌握了律霸的秘密,趁律霸还没恢复作战能力,利用LR的虚拟兵团大举进攻,而孔明无法抵挡,节节败退……最后司马氏吞并吴蜀,建立了晋朝。
依我看,谁能驾驭LR,谁就能取得天下!不过《三国志里没有告诉你的》一书中对LR却只字未提,这倒成了一个谜。而最令我出乎意料的是:原来毁掉蜀国的不是别人,正是我自己啊!呜呼!一千七百年后(2009年减230年)的人也没能改变历史,难道不是因为一切都是必然的吗?