HP LoadRunner 12.02 Tutorial T7177-88037教程独家中文版
HP LoadRunner 12.02 Tutorial T7177-88037教程独家中文版
Tylan独家呕血翻译
转载请注明出自“天外归云”的博客园
Welcome to the LoadRunner Tutorial
LoadRunner所包含的组件
如下所示:
Vugen:Virtual User Generator,虚拟用户发生器的简称,用来录制用户的业务流程,创建自动化性能测试脚本,亦称之为Vuser脚本。
Controller:控制器,用于组织、驱动、管理并监控负载测试。
Analysis:分析器,帮助你查看,剖析并比较负载测的结果报告。
Load Generator:负载发生器,用来攒动与运行虚拟用户以对目标系统产生负载的计算机。
LoadRunner术语
场景:在场景中将根据性能需求来定义测试过程中所发生的事件。
虚拟用户:虚拟用户会在系统中模仿真实用户的行为。一个场景可以包含数以千计的虚拟用户。
虚拟用户脚本:录制了你在程序中所操作的业务流程。
协议:协议就是客户端和服务器之间的交流方式。
事务:事务用以衡量你的系统性能。一个事务代表了一个或多个终端用户的业务流程。一个事务让你衡量业务流程所花费的时间成为可能。
脚本足迹:由负载发生器所需的大量不同资源所定义,以执行Vuser脚本为目的。典型的资源包括内存,CPU能源,硬盘空间。
LoadRunner负载测试流程:
- 计划负载测试:计划你的负载测试都需要做哪些准备,比如:并发的用户数,主要的业务流程,和需要的相应次数等。
- 创建Vuser脚本:用VuGen把终端用户的操作活动录制成脚本。
- 设计场景:用Controller创建一个负载测试的环境。
- 运行场景:用Controller驱动,管理并监控这个负载测试。
- 分析结果:用LoadRunner Analysis生成图表与报表,对系统的性能进行评估。
开始HP Web Tours(惠普在线旅游)
为了理解LoadRunner是如何做为负载测试的解决方案,这个教程将用性能需求作为一个样本应用。这个样本应用——HP Web Tours(惠普在线旅游),是一个web-based(基于网络的)旅游代理系统。HP Web Tours的用户连接到一个web服务器,用于搜索与预订航班,检查航班行程。
LoadRunner支持超过50种应用,这个教程仅仅用来讲述怎样来对一个web-based类型的应用进行负载测试。如果你要对其他类型的应用进行负载测试,请联系惠普以求帮助。
在教程的这一部分中,你将会学到如何开始并登录HP Web Tours。
- 打开样本的web server:选择Start > All Programs > HP Software > HP LoadRunner > Samples > Web >Start HP Web Tours Server,在基于图标的桌面中,比如Win8,查找"Start HP",在Search结果中选择并打开"Start HP Web Tours Server"
在你访问这个应用的同时你一定要让 "Start HP Web Tours Server"的窗口始终开着。
- 打开HP Web Tours:选择Start > All Programs > HP Software > HP LoadRunner > Samples > Web > HP Web Tours Application。Win8同上,搜索HP Web,选择HP Web Tours Application。(确保你的LoadRunner安在你的计算机的默认文件夹中,否则HP Web Tours Application不会被打开。)
- 登陆HP Web Tours:
- 用户名和密码分别输入jojo和bean
- 点击login。
- 预订航班:
- 在左侧导航栏中点击Flights,Find Flight页面被打开;
- Arrival City选择Los Angeles;
- 点击Continue;
- 在跳转页面保持默认设置,点击Continue;
- 在Payment Details页面,点击Continue,Invoice页面显示了你的机票预订信息;
- 在左侧导航栏中点击Sign Off。
定义应用的性能需求
现在你已经熟悉了HP Web Tours,设想你是性能工程师,你要对HP Web Tours的性能负责并让其符合HP Web Tours的商业需求。你的产品经理已经给出了四点产品的发布标准:
- HP Web Tours必须能撑得住10个并发的旅游客户端;
- HP Web Tours必须能同时运行十个航班预订,并且响应时间不得超过90秒;
- HP Web Tours必须能够撑住10个旅游客户端同时运行itinerary checks,并且响应时间不得超过120s;
这个教程将教你如何建立一个满足所有这些需求的负载测试,以便于在产品发布前你可以给出诸如产品性能通过或失败的数据。
第一课:建立一个Vuser脚本
要对你的系统产生负载,首先你要创建一个可以运行的能够模仿真实用户操作的Vuser脚本。这里,你需要用Vugen来完成这一需求。
介绍一下Vugen——Virtual User Generator(虚拟用户发生器)
在一个性能测试环境中,LoadRunner用虚拟用户代替了真实用户,虚拟用户也叫Vusers,虚拟用户通过可预见的,重复性的模拟真实用户操作来对系统产生负载。
Vugen帮你创建虚拟用户脚本,它以录制与回放的原则去工作。当你在你的应用中完成一遍业务流程的同时,Vugen会记录你的操作并将其按步骤翻译成虚拟用户脚本。虚拟用户脚本是你负载测试的基础构成。
创建一个空的虚拟用户(Vuser)脚本
去开发一个虚拟用户脚本,你首先要打开Vugen并创建一个空脚本。此后你才可以通过录制事件或加入人为改善的方式来改善这个空脚本。
本节你将创建一个基于Web-based HTTP/HTML协议的虚拟用户脚本。
定义:协议是服务器与客户端之间的交流方式。
接下来我们创建一个空的虚拟用户脚本:
- 点击你桌面上的Virtual User Generator图标打开Vugen。
- 点击File>New Script and Solution,在弹出页中选择Web-based HTTP/HTML协议。(左侧的Vugen Category一定确保是Single Protocol)
录制一个虚拟用户脚本
这部分内容将帮你完成之前预订航班和检查行程的录制。
首先,你要点击Record>Recording Options:
确保Track processes created as COM local servers这一项是没有勾选的,然后点击OK。
接下来我们录制虚拟用户脚本:
- 开始在HP Web Tours网站上的录制;
- 点击录制按钮:
- url处填写:http://localhost:1080/WebTours/,其他保持默认,然后点击Start Recording:
- 注意:确保你的Start HP Web Tours Server是打开的,否则可能打不开HP Web Tours页面。之后你会看到录制框出来了:
- 在弹出的HP Web Tours页面输入用户名和密码:jojo和bean,然后点击login;
- Arrival City选择Los Angeles,Seating Preference选择Aisle其他保持默认,点击Continue;
- 点击Continue;
- Credit Card栏输入12345678,Exp Date栏填06/14,点击Continue;
- 点击左侧Itinerary;
- 点击左侧Sign Off;
- 点击Stop Recording按钮: ,弹出的页面点击Close按钮;
- 保存脚本:
- File>Save Script As
- 名字取为basic_tutorial
查看虚拟用户脚本
左侧的Solution Explorer给出了Vuser脚本的各个组成部分与相关文件。
Step Navigator以小图标的形式列出了虚拟用户各个步骤的操作,你在录制脚本的过程中所做的每一个操作,Vugen都会在Step Navigator中生成相应的步骤。
每个步骤名字右侧的小图标代表有截图:
用户的操作是以API函数的形式显示在右边的编辑器中的,你可以用C语言或者LoadRunner API函数或是一些流程控制语句在其中直接进行编写。
第二课:回放你的脚本
上一节,你录制了脚本。但是在你把你的脚本放到场景中执行前,你需要回放你的脚本以检查你录制的Vuser脚本是否能正常工作。
在你回放脚本之前,你必须配置脚本的runtime settings,它定义了虚拟用户的行为。
怎样设置虚拟用户的runtime行为?
LoadRunner的运行时设置(runtime settings)让你能够模拟不同种类的用户活动和行为。例如:你可以模拟一个对服务器的输出立刻做出响应的用户,或者你也可以模拟一个每一步都要思考才能做出响应的用户。你可以配置运行时设置(runtime settings)来具化虚拟用户需要重复多少次脚本中的操作。
本节介绍通用的可以应用与所有的虚拟用户协议的runtime settings该如何配置,关于特殊的协议在第四节课中将会讲到。General runtime settings包括:
Run Logic(运行逻辑):Vuser重复不同部分Vuser脚本的次数。
Pacing(节奏):每两次重复之间的等待时间。
Think Time(思考时间):脚本之中步骤之间Vuser所需要停顿的时间。
Log:设置在你回放脚本过程中所需要收集的信息的level(等级)。
本节课介绍用Vugen修改runtime settings,之后的课程将介绍如何用Controller修改runtime settings。
修改runtime settings:
- 打开你上节课保存的Vuser脚本;
- 打开runtime settings对话框,点击Replay>Runtime Settings(按F4)出现编辑界面:
- 设置Run Logic配置:
在左侧栏中选择Run Logic,设置Number of iterations(重复次数)为2,这个是用来设置脚本中Action部分的重复次数:
- 设置Pacing settings:
在这里你可以设置每两次重复之间的等待时间,你可以设置一个随机值,这将以一个随机的间隔时间更加精确的模拟真实用户在重复操作之间等待所用的时间,比如你不会看到真实用户在每两次重复操作之间总是等待六十秒。
选择第三个圆按钮,设置随机时间间隔为60到90秒:
- 设置Log settings:
这里设置在运行时要记录那些log信息。在你开发脚本的时候你可能会为了debug方便而想要得到一些特别的log信息,但是一旦你调试通过了,你可能以后只需要得到error的log信息,或根本不需要log信息了。
选择Extended log并勾选parameter substitution。这个选项和以后课程中将要讨论的点相关。
- 设置Think Time:
保持默认设置,忽略Think Time时间。你可以在Controller中设置。
我怎么运行我的Vuser脚本?
在录制好脚本并设置好runtime settings后,你就做好了运行脚本所需要的准备。Vugen在你运行脚本的过程中会给予你一些的指示器。
- 左下角会出现"Running"字样。
- 编辑器中会出现小黄箭头,它会指向正在被回放的脚本。
- 下面output中会显示回放过程中的消息。
介绍完界面上的东西,下面我们来运行录制好的脚本:
- 在Vugen中打开Vuser脚本;
- 点击Replay>Run或者直接点击工具栏上的按钮。
在回放结束后会弹出个东东建议你检查相关的,点击NO。
我在哪里可以看到回放信息?
当Vuser脚本停止运行,你可以看到回放的一个总结,回放的总结会显示在Replay Summary 标签下。
回放总结标签下列出了关于脚本运行的基本信息,比如回放时间间隔,回放的开始与截止时间。下面的两个link分别是脚本运行的详细结果和回放时所收集的log。
回放的log里记录了回访时所发生的事件,在Vugen的output栏里显示。
在教材的这一部分,你将打开log,在log中找到指定的事件和提示。
查看回放log:
- 在脚本回放完成后,点击View>Output或在Vugen工具栏中点击Output按钮。或者你也可以在Replay Summary标签下点击The Replay Log的链接;
- 确认你的Output栏中Replay已经被选择:
- 在Vugen菜单中点击Search>Quick Find去打开Search对话框;
- 在Scope中选择Current Script;
- 点击展开Include in search,之后勾选Logs;
- 通过Search对话框在回放log中定位以下信息:
- "Virtual User Script Started"——脚本运行的开始;
- "Vuser Terminated"——脚本运行的结束;
- "Iteration"——每一次重复的开始和结尾以及重复的次数。(橘色字体的文本)
注意:Output栏中绿色的是成功信息,红色的是失败信息。Output栏中也会指出出现的的error在脚本中对应的行号。
双击Output栏中的行,将会定位到相应的脚本行。
我怎么知道我的脚本回放是否成功?
在你回放了你所录制的脚本后,你需要查看回放结果去判断脚本是否回放成功。如果有哪有东西失败了,你想知道什么时候为什么失败了。
这一部分你将学会检查和分析脚本运行结果。Vugen在Test Results窗口中总结了回放结果。
你打开Test Results窗口后会发现它有两个栏,左侧的树栏和右侧的结果总结栏。
- 树栏包括结果树,每一次重复在树中都被标注了数字。
- 结果总结栏包含了脚本回放的详细信息,当然也包括了屏幕录制器(Screen Recorder)的移动,如果有的话。顶部的表告诉你哪些次重复(Iteration)失败了,哪些次成功了。和原始录制的过程相比较,如果虚拟用户顺利完成了整个过程,那么这次测试将被认为是通过的。底部的表告诉你事务(Transactions)或检查点(CheckPoints)是否成功或失败。在教程的后续章节你将学到如何添加这些特色(指事务或检查点)。
可以通过下面两种方法来查看回放结果:
- 点击Replay Summary标签;
- 点击Reply>Test Results,Test Results窗口打开了并显示了Results Summary。
下一部分,你将钻入回放结果中仔细研究,从而判断脚本在回放过程中是否到达了预期的web页面。
我应该怎样查找或过滤回放结果?
如果你的回放结果表示有什么东西失败了,你可以进一步定位失败的原因。
在Test Results窗口中左侧的树栏,你可以展开你的测试树,分别查看每一次重复中每一步的结果。右侧的总结栏中会显示该次重复过程中对应的回放截图。
- 展开树上的一个重复节点:
- 在结果树上展开basic_tutorial Iteration 1节点;
- 展开Action Summary节点,展开的列表将按顺序显示该次循环中所执行的操作步骤;
- 查看结果截图:
点击Submit Form:reservations.pl,右侧总结栏将显示该步操作时所对应的截图:
- 查看步骤总结:
总结栏显示关于步骤的总结性信息:如对象或步骤名,详细的关于页面是否成功加载,结果是否通过,每一步的发生时间等。
- 查找结果状态:
你可以在回放结果中搜索"Passed"或"Failed"。
这是非常有帮助的,因为如果你的回放结果总结中告诉你失败了,它可以帮你找到哪里失败了。
- 想要查询回放结果,点击Tools>Find或者点击工具栏中的Find按钮,查询对话框就会被打开;
- 勾选"Passed",其他的不勾选,点击"Find Next",测试树栏中将把第一个通过的(Passed)步骤高亮显示出来,如果没有通过的则不高亮显示。
- 过滤结果:
你可以过滤测试树栏来显示一个指定的循环或状态。比如,你可以过滤它只显示"Failed"状态的。
- 点击View>Filters或点击工具栏中的Filters按钮,Filters对话框就会被打开;
- Status选择Fail选项;
- Content选择All选项,点击OK。
可以看到左面的树栏空了,这是因为过程中不存在失败。
- 关闭Test Results窗口:
点击File>Exit。
第三课:解决回放过程中所遇到的一般问题
当你录制好一个脚本后,你通过在VuGen中运行来验证该脚本是否通过。有时回放会失败,即便同样的操作在录制时是成功的。
有很多应用是动态生成值的,你每次打开这个应用的时候都不一样。比如,有些服务器为每一个新的会话都赋予一个独一无二的会话ID。当你试着回放一个录制好的会话时,会话会生成一个与录制时不同的新的会话ID。当你回放特定的脚本时,像会话ID这样的动态值将会给你带来麻烦。比如当你回放Web-HTTP/HTML类型的脚本时动态的会话ID就会带来麻烦,但是当回放Web-TruClient类型脚本时就不会。
LoadRunner利用关联性来定位与解决这种动态值的问题。关联性保存这种变化的值到一个参数中,就像我们这个例子中的会话ID。当我们运行脚本时,虚拟用户将不会采用事先录制的值,取而代之,会采服务器所赋予其的新会话ID。
这节课你讲学习LoadRunner是如何解决在Web-HTTP/HTML类型Vuser脚本运行时产生的动态值问题。
为HP Web Tours的回放错误做准备
为了说明一个普遍存在的回放失败,你需要在HP Web Tours应用中修改一个设置。这个设置会让HP Web Tours服务器需要独一无二的会话ID。
- 打开HP Web Tours:
Start > All Programs > HP Software > HP LoadRunner > Samples > Web > HP Web Tours Application. 之后HP Web Tours的Home Page页面就被打开了。(Win8的话在界面输入HP Web进行搜索)
- 改变服务器选项:
- 在页面点击"administration"链接,Administration页面就被打开了;
- 选择"Set LOGIN form's action tag to an error page.",这个设置将不允许服务器复制会话ID;
- 点击"Update"按钮;
- 点击页面底部的"Return to the Web Tours Homepage"链接。
我们对于独一无二的服务器值是如何处理的?
在HP Web Tours被修改的配置中,服务器给每一个虚拟用户一个独一无二的值。如果你试着回放没有修改过的在第一课中所录制的虚拟用户脚本,回放的结果将是失败的。
为了克服这个问题,你需要用VuGen去实现这个关联会话 ID的需求。你需要在VuGen中添加一步把这个独特的会话ID添加到一个参数中。在后续的每一个会话中,VuGen都会将新的独一无二的会话ID存入一个参数中。在虚拟用户运行Vuser脚本中的步骤时,虚拟用户会使用已经保存的会话ID值,而不是原先录制好的值。
- 录制一个新的包含动态值的脚本:
- 录制一个新的包含和第一课中所录制的脚本具有相同步骤的虚拟用户脚本;
- 将脚本保存为"basic_tutorial_Cor"。
- 回放新录制的脚本:
点击录制按钮进行录制,VuGen运行这个新的脚本,你会注意到回放log中有一些红色字体的错误信息出现。
回访结束后,一个消息对话框会弹出提醒你检查关联,点击"No"。
- 检查回放总结:
观察回放总结栏(Replay Summary Tab),总结中会指出你的回放失败了。
- 检查脚本中的关联(Scan for correlations):
选择"Design > Design Studio"
VuGen检查脚本和它所关联的数据,查找可能的动态值。Design Studio下Correlation这个栏列出了三个需要关联的动态值。这三个值中最长的那个是会话ID。
- 关联会话ID:
- 在Correlation栏选择会话ID那一行,并点击Correlate。VuGen会把会话ID的状态变化Applied,并会在脚本的顶部插入一个新的方法,这个方法将把原始的会话ID存入一个参数中。
在之后的每一个回放会话中,VuGen都将保存新的独一无二的会话ID到参数中。当虚拟用户运行脚本时,会以该参数取代原先录制的值;
- 点击"Close"关闭Design Studio。
- 来查看一下关联语句的语法:
在VuGen编辑器中个,定位到VuGen加到脚本中的语句。新的语句看起来就像下面这样:
这个语句告诉VuGen将第一次包含在正则表达式中的值(独一无二的会话ID)存入参数中并叫CorrelationParameter这个名字。
- 重新运行脚本:
- 点击回放按钮,结束运行后在Output栏中查看回放log,发现没有错误信息了;
- 在脚本中,右键点击web_reg_save_param_regexp选择Go to step in Replay Log,VuGen将鼠标定位在Replay Log中所对应的行处。Log表明方法web_reg_save_param_regexp方法执行成功,关联顺利。
- 重置HP Web Tours服务器以忽略独一的会话ID:
- 打开HP Web Tours Application;
- 在Home Page页面点击Administration链接;
- 取消勾选"Set LOGIN form's action tag to an error page";
- 在页面底部点击"Update"。
现在你对回放中的错误有一定的了解了,可以去学习第四课了。
第四课:为负载测试准备一个虚拟用户脚本
在之前的课程中,你已经确认你的脚本回放的过程精确的模拟了真实用户的行为。下一步,就是为了负载测试准备脚本。那么,多个用户同时并发的在系统上工作会怎样呢?系统会不会慢到一个不可接受的程度?
在这一课中,你将会学到不同的方法去丰富你的脚本,让它在负载测试的过程中更加有效率。
怎样去估量一个业务流程的持续时间呢?
当你为一个应用做部署时,一定要准确的估测业务流程的持续时间——登陆需要多久,订飞机票等等。每一个业务流程都由你脚本中的一步或多步组成。在一个虚拟用户脚本中,你通过把这些步骤加到一个事务(transaction)中来设计一系列你想要估测的行为。
当你运行一个包含事务的脚本时,LoadRunner将会收集关于事务所花费时间的信息,并且以彩色编码的段落显示结果和报告。你通过这个信息去判断这个应用是否能满足你的性能需求。
你可以手动 的在虚拟脚本中的任何位置插入一段事务。为了将一系列步骤组成事务,在第一步之前插入一个事务开始(start_transaction)标识,在最后一步之后插入一个事务结束(end_transaction)标识。
这部分你将在你的脚本中插入一段事务来衡量用户查找和预订机票这个过程所花费的时间。
在虚拟用户脚本中插入一段事务(transaction):
- 在VuGen中,打开在第一课时你所创建的Basic_Turorial脚本;
- 点击"Step Navigator"栏;
- 插入一个事务开始标识:
- 在Step Navigator中,定位到步骤:Image: Search Flights Button.
- 双击该步骤以找到对应在编辑器中的位置;
- 点击View >Steps Toolbox,右侧将出现工具栏;
- 在工具栏中Common下,找到lr_start_transaction并把他拖进编辑器中,并把它放在web_image步骤前。此时开始事务对话框会被打开;
- 在Transaction Name栏中填写"find_confirm_flight"并点击"OK"。Vugen将在Step Navigator中插入一个lr_start_transaction的步骤以及一个相应的叫做lr_start_transaction的方法在编辑器中。
- 插入一个事务结束标识:
- 在Step Navigator中,定位到步骤:Submit Data: reservations.pl_2;
- 双击,定位到编辑器中相应的代码行;
- 在Steps Toolbox的Common下找到lr_end_transaction,并把它拖到web_submit_data这部分代码的后面,此时结束事务对话框会被打开;
- 确认Transaction Name为"find_confirm_flight",然后点击"OK"。Vugen会在左侧的Step Navigator中插入一个lr_end_transaction步骤,并在编辑器相应的位置插入一个lr_end_transaction方法。
现在你知道该怎么样去定义"find_confirm_flight"这个事务了。
要怎样才能模仿多个用户?
在你的模仿中,你记录了一个预定航班和选座的过程。但是真实的生活中,往往多个用户会有不同的选择。为了改进你的测试,你需要检查当多个用户做出不同的选择时(Aisle,Window或None)预定是否依然能正常工作。
为了完成这个愿望,你需要参数化你的脚本。这就意味着你要把你录制的值,比如Aisle,用参数来替代。你将在一个参数文件中替换这些参数的值。当你运行脚本时,虚拟用户将会使用参数文件中的值(Aisle,Window或None)以便更加真实的模拟一个客户端环境。
参数化你的脚本:
- 找到你想要更改值的区域:
- 选择View>Step Navigator,在左侧栏中打开Step Navigator;
- 在Step Navigator中定位到Submit Data:reservations.pl这一步;
- 右键点击Submit Form:reservations.pl这一步,选择Show Arguments。Submit Form Step Properties对话框打开了:
这个图标代表有定值。
- 改变定值为可变值:
- 在Submit Form Step Properties对话框中选择第七行seatPref;
- 点击seatPref右侧的按钮,Select Or Create对话框出现:
- 创建一个参数:
- 在Parameter name处填写seat;
- 点击"OK",Submit Form Step Properties对话框中VuGen将图标替换成图标。
- 点击图标,Parameter Properties对话框打开:
- 为参数指定值:
- 点击Add Row;
- 将Value改成Window;
- 点击Add Row;
- 将Value改成None;
备注:值并不是大小写敏感的。
- 对话框的Select Column和File Format部分保持默认设置。
- 定义测试将如何改变数据:
- Update value on保持默认设置:Each Iteration;
- 点击"Close"关闭Parameter Properties对话框;
- 点击"OK"关闭Submit Form Step Properties对话框。
你现在已经为seating preference创建了一个参数,当你运行负载测试时,虚拟用户会使用参数中的值而不使用你事先录制好的脚本中的值——Aisle。
当你运行脚本时,Replay log里将会告诉你每次重复所用到的参数中的值。虚拟用户第一次运行使用的是Aisle,第二次是Window,第三次是None。
我怎样确认网页上的内容?
当你运行一个测试时,你经常需要确认返回页面上是否包含某些特定内容。Content check功能将会在脚本运行时自动帮你在页面上检查你的预期信息。你可以插入两种内容检查:
Text Check:在网页上检查一段文字;
Image Check:在网页上检查一张图片。
在这一部分你将插入一个text check去检查是否Find Flight字样出现在HP Web Tours的Reservations页面上。
插入一个text check:
- 点击切换到Step Navigator栏;
- 在Step Navigator栏中定位到Submit Form:reservations.pl这一步;
- 在VuGen工具栏上,点击Show Snapshot pane按钮让Snapshot栏显示出来;
- 在Step Navigator中Submit Form:reservations.pl的截图标志,相应的截图将出现在Snapshot栏中:
- 从VuGen的菜单中点击View>Steps Toolbox。Steps Toolbox栏出现;
- 在Steps Toolbox的Search框中输入web_reg并在Filter Results中定位到web_reg_find这一步;
- 将web_reg_find这一步拖拽到web_submit_form方法前:
Find Text Dialog打开了:
- 在Find Text对话框中,在Search for specific Text框中输入Find Flight,并点击"OK";
- VuGen插入一个web_reg_find步骤到Step Navigator中,和一个相应的web_reg_find方法到编辑器中。
当你回放脚本时,VuGen将会查找文字"Find Flight"并在回放log中表明是否找到相应文字。
我应该怎样去生成调试信息?
在测试中 的一些点上,你想让LoadRunner生成并发送一些和脚本运行时相关的消息,这些消息既会显示在Output栏中的Replay log中,也会显示在Controller的Output窗口中。你可以生成标准输出信息,或生成信息以指出错误所在之处。
对待错误消息的推荐处理方式是检查Failed状态,如果发现了状态为Failed的信息,你让VuGen去生成一个错误消息。更多的详细信息请查看HP LoadRunner Function Reference中的例子。
在教程的本部分,你将让VuGen在应用完成一次完整的预订后插入一条输出信息(Output Message)。
插入一条输出信息:
- 点击Step Navigator栏;
- 在Step Navigator栏中定位到最后一步:Image:SignOffButton;
- 双击Image:SignOffButton这一步,编辑器中显示相应的web_image方法;
- 在Steps Toolbox中Common下定位到lr_output_message方法;
- 将lr_output_message方法拖拽到web_image方法后,Output Message对话框打开;
- Message Text中填写:The flight was booked;
- 点击"OK"。VuGen添加一个lr_output_message的方法到脚本中,并且在Step Navigator中生成相应的一步。
- 点击VuGen工具栏中的Save按钮保存脚本。
请注意,插入一条错误消息你要重复相同的过程,除非在Steps Toolbox中选择lr_error_message方法而不是lr_output_message方法。
我的脚本回放真的成功了吗?
在这一部分,你将学习运行强化后的脚本并在Replay log中查找text check信息。你将会检查text check的结果以及事务和参数化的详细信息。
默认情况下,image(图片)和text(文本)的检查在回放过程中是禁用的,因为它们需要更多的内存。如果你想要执行图片或文本的检查,你需要在runtime settings中enable他们(使它们可用)。
- 使图片和文本检查可用:
- 点击Replay>Runtime Settings;
- 选择nternet Protocol>Preferences;
- Enable image and text check;
- 点击"OK"。
- 运行脚本:
点击VuGen工具栏上的Replay按钮,VuGen开始运行脚本,在Output栏的Replay log中生成条目信息。
等待脚本完成运行。
- 定位文本检查:
- 点击Output栏,选择Replay;
- 在Replay log中点击鼠标,按Ctrl+F进行搜索;
- 搜索web_reg_find;
点击Find Next,你先后会搜索到符合的信息:
web_reg_find started
Registering web_reg_find was successful.
这其实不是真正的text check,这是在表单提交后进行的查询。
点击Find Next显示下一处包含web_reg_find的地方:
Registered web_reg_find successful for "Text=Find Flight" (count=1)
这行表明text被找到,如果有人改变了网页并移除了Find Flight字样,那么在之后的运行中,Output将指出找不到相应的text。
- 定位一个事务的开端:
- 在Replay log中点击Ctrl+F打开搜索对话框;
- 搜索"Transaction",提示会以蓝色字体表现。
- 检查参数的替代值:
- 在Replay log中点击Ctrl+F打开搜索对话框;
- 搜索"Parameter",log中告诉你"seat"="Aisle"。
- 选择File>Save或点击VuGen工具栏上的Save按钮保存。
第五课:创建一个负载测试场景
在之前的课程中,你用VuGen来验证你的虚拟用户脚本。在本节课中,你将在多个虚拟用户负载你的系统下来测评你的系统,你将模拟10个客户端不同程度的同时使用订票系统,并在此负载下观察系统的运行。为了设计并运行这个测试,你需要使用LoadRunner Controller。
场景目标:
在本节课中,你的目标是创建一个场景来模拟十个不同的用户并发的进行登陆,查询飞机票,预订飞机票,检查旅程与注销的行为。
介绍一下LoadRunner Controller
负载测试意味着要在典型的工作场景下测试你的系统。比如,你需要对许多旅游客户同时在网上对同一个票务预订系统进行操作的情况进行测试。
你设计场景是为了模拟真实的情况。为了达到这个目的,你需要能够对你的系统产生负载,并且对负载进行时间上的编排(因为用户不会同时登陆和注销)。你也需要模拟不同用户的不同行为。比如有些用户用火狐浏览器去访问这个系统,而其他的用户则用IE。用户也会通过不同的网络连接到该系统,比如modem,DSL,或cable。你在场景中创建并保存这些设置。
Controller为你提供能够让你真实的模拟你的工作环境而创建与运行测试所需要的所有工具。
我怎么样开始使用Controller?
要创建一个场景,你首先要打开LoadRunner Controller。
- 打开HP LoadRunner Controller:
HP LoadRunner Controller打开并显示New Scenario对话框。
- 选择一个Scenario Type(场景类别)。
有两种Scenario Type:
Manual Scenario:让你能够控制虚拟用户的数量以及他们分别运行脚本的次数,并且能够让你测试你的系统同时能够响应多少用户的操作。
你可以根据你的业务需求分析用百分比模式(Percentage Mode)来对脚本间虚拟用户的总数进行分配。如果你正常安装LoadRunner的话Percentage Mode这个默认是被勾选的。如果它被勾选了,你要把它取消勾选。
Goal-Oriented Scenario:为了验证你的系统是否可以达到一个特殊的目标。例如,你可以基于一个事务的响应时间或一秒钟执行的事务数来验证,那么LoadRunner会为你基于这些目标自动的创建一个场景。
- 添加一个Vuser脚本到负载测试中:
在本次教程中,你只会使用一个脚本,让所有的用户都模拟相同的操作。想要多方面多角度的模仿真实世界中的用户操作,你可以创建不同的虚拟用户群,每一个群都用不同的脚本和不同的用户设置。
你之前在VuGen中录制的脚本包含了你想要测试的业务流程,包括登陆,搜索飞机票,买飞机票,检查飞机票,以及退出网站。你将要把类似的脚本添加到场景中,并配置场景,以实现8个不同的用户同时在这个飞机票预订系统上进行并发操作。在本次的测试中,你还需要额外添加两名虚拟用户。
为了实现这个目的,你需要提供一个和你之前创建的那个脚本类似的脚本。在这里我们建议你使用给出的样本脚本。
- 如果basic_script已经在Available Scripts栏中(我们之前创建的那个叫basic_tutorial,这里教程说的有些偏差,大家理解意思就可以,实际操作可以随便一点,不用一板一眼的照书来),点击add按钮将脚本添加到Scripts in Scenario栏中。
- 如果这个basic_script没有在左侧的Available Scripts中列出,点击Browse按钮找到它并把它加到Scripts in Scenario栏中来。
- 点击OK,LoadRunner Controller打开了并显示你所创建的新场景的Design栏。
初识Controller
Controller的Design栏是你设计你的负载测试的主要接口。Design栏又分为三栏:
- Scenario Groups栏:你在该栏中配置虚拟用户组。你创建不同的用户组来模拟系统的用户种类并指定操作该应用系统的虚拟用户数量以及这些虚拟用户所用的机器种类。
- Service Level Agreement栏:当你设计一个负载测试场景时,你可以为性能的度量定义goals或SLAs(Service Level Agreements)。当你运行场景时,LoadRunner收集并存储性能相关的数据,Analysis将收集的数据和SLAs做对比好对定义好的度量确定SLA的状态。
- Scenario Schedule栏:在Scenario Schedule栏,你设定负载行为以精确模仿真实世界中的用户行为。你通过虚拟用户将要运行的应用,该应用相应部分的负载比率,负载测试的持续时间,以及负载是如何结束的来定义用户的操作。
我怎样修改脚本中的细节?
按照以下的方法来修改脚本中的细节:
- 在Scenario Groups栏中检查一下Group Name列下的Script名为:basic_tutorial
- 改变Group的名字:
- 在Scenario Groups栏中选择basic_tutorial并点击Details按钮,于是Group Information对话框打开了:
- 将Name改为一个更有意义的名字,比如:travel_agent;
- 点击OK,新名字将显示在Design栏的Scenario Groups栏下。
我怎样对系统产生一个负载?
在你添加你的虚拟用户脚本到你的场景后,你将要配置负载发生器(load generator),也就是你对目标系统产生负载的计算机。
定义:一个负载发生器意味着一台能够运行多个虚拟用户并对系统产生负载的计算机。你可以用许多负载发生器,每个发生器主持着多个虚拟用户。
在这一部分,你将学习关于向场景中添加负载发生器,测试负载发生器的连接。
添加负载发生器:
在Controller工具栏中点击Load Generator按钮。负载发生器对话框打开了:
Load Generator对话框允许你查看与配置你场景中定义的负载发生器,上图中显示了一个叫localhost的负载发生器的详细信息。localhost这个负载发生器的状态为"Down"。这表明Controller没有连接到loadhost这个负载发生器。
在本教程中,你将用你的计算机作为复杂发生器。
备注:在一个典型的操作型系统中,你可能会有多个负载发生器,每一个负载发生器都拥有多个虚拟用户。
测试负载发生器的连接:
当你运行一个场景时,Controller会自动连接负载发生器所在的机器(load generator machine)。然而,你可以在尝试运行脚本前测试这些连接。
- 在Load Generator对话框,选择localhost并点击"Connect":
Controller尝试连接负载发生器所在机器。当连接已经建立,负载发生器的状态就会从"Down"变成"Ready";
- 点击Close。
我怎样去模仿真实的负载行为呢?
当你已经添加了负载发生器,你就可以准备配置负载行为(load behavior)了。
典型的用户基本不可能精确的在同一时间log on以及log off系统。LoadRunner允许用户逐步的log on以及log off系统。它也允许你决定场景的持续时间,以及场景结束的方式。你下面将要进行配置的场景将会相对简单。然而,当你要设计一个更加贴近真实的场景时,你可以定义更多逼真的虚拟用户行为。
你在Controller的Scenario Schedule栏中为manual scenario配置负载行为(load behavior)。Scenario Schedule栏被分成三个部分:Schedule Definition区域,Actions格表,以及Interactive Schedule图表。
你现在将要更改默认的负载设置并配置一个Scenario Schedule(场景时间安排计划):
- 选择schedule类型与run mode:
在Schedule Scenario栏中,确定你选择了Schedule By:Scenario,Run Mode:Real-world schedule。
- 设定Scheduled Actions定义:
你可以在Global Schedule格表中或通过操作Interactive Graph图表来对Scenario Schedules设置Start Vusers,Duration,以及Stop Vusers actions。当你在图表中进行定义时,对应在格表中的属性也会有相应的变化与调整。
现在你要进行设置,来让Global Schedule的格表像下面一样显示:
- 建立虚拟用户初始化:
初始化意味着通过运行脚本中的"vuser_init "action来为一个负载测试准备虚拟用户(Vusers)和负载发生器(load generators)。依于你系统的配置,在运行前初始化Vusers会带来更加真实的结果。
- 双击Global Schedule格表中的Initialize(上图中Action下的第一行)。Edit Action对话框弹出并显示Initialize action;
- 选择Initialize all Vusers simultaneously;
- 点击OK。
- 为Vusers指定一个陆续开始的时间(gradual start):
也就是说每隔几分钟增加几个Vuser对系统产生负载是在这里设置的。
- 在Global Schedule格表中双击Start Vusers,Edit Action对话框弹出并显示Start Vusers;
- 如上图中进行设置,Start 8 Vusers,2 Vusers every 30 seconds;
- 点击OK。
- 计划持续时间:
你需要确定一个持续时间以确保虚拟用户能够在指定的时间段内持续执行Schedule action,持续产生负载。如果你设定一个时间段(Duration),脚本会在该时间段内尽可能多的重复运行来满足需求而忽略掉你在脚本runtime settings中设置的重复次数。
- 确保Interactive Schedule Graph是Edit模式(通过点击Interactive Schedule Graph工具栏中的Edit Mode按钮)。
- 在Interactive Schedule Graph中点击代表Duration的水平线。线被高亮显示,如下图:
备注:说明会显示在结束点的上面,点击Interactive Schedule Graph工具栏中的隐藏说明按钮来控制它的显示。
- 向右拖拽钻石形状的结束点,到11:30的位置,这样你就设置好了让虚拟用户运行10分钟脚本。
- 设置一个逐步的关闭:
当应用运行到一个临界值的时候,逐步关闭虚拟用户有助,检查内存泄露以及系统恢复。
- 在Global Schedule格表中双击Stop Vusers。Edit Action对话框被打开:
- 如上图所示,选择All-2 Users every 30 seconds;
- 点击"OK"。
配置好的Global Schedule如下:
我应该怎样模拟不同种类的用户呢?
现在你已经配置了一个负载计划表,你需要进一步指定用户在测试的时候是如何"行为"的。
当你去模拟一个真实用户的时候,你需要考虑用户的实际"行为"。这里的"行为"指的是:一个用户两个操作步骤之间所需要的停顿时间,对于一个步骤用户所重复的次数,等等。
在这一部分,你会学到更多关于LoadRunner的runtime settings,并且你会使用到Think Time和Logging。
- 打开runtime settings:
- 在Controller中点击Design栏;
- 在Scenario Groups栏中选择travel_agents组;
- 点击Runtime Settings按钮,runtime settings对话框将被打开:
Runtime settings允许你模拟不同种类的用户活动与行为。它们包括:
Run Logic,一个虚拟用户重复一组操作的次数。
Pacing,重复操作前需要等待的时间。
Log,在测试过程中你想要收集的信息等级。你第一次运行场景时是推荐你生成log信息的,以防你第一次运行时会失败,log会提供你有关的调试信息。
Think Time,用户步与步操作之间的停顿时间。由于新老用户对系统的熟悉度不同,步与步之间的停顿时间也不同,老用户肯定比新用户娴熟的多。虚拟用户通过think time可以更加真实的模仿真实用户步与步之间的停顿。
Speed Simulation,用户通过不同的网络连接,包括modem,DSL以及cable。
Browser Emulation,用户通过不同的浏览器来查看应用的性能。
Content Check,能够自动的检查用户定义的错误。
假设你的应用在出错时会发送一个自定义的页面,这个自定义页面包含ASP Error这个字样,你需要查找服务器所返回的所有页面来检查这些字样是否包含在内。
你可以让LoadRunner通过runtime settings中的Content Check在测试过程中自动的完成这个检查的过程,LoadRunner会自动的检查你设定的字样,如果发现则会产生一个错误信息。在场景运行时,你可以确认这些内容检查方面的错误。
- 使用Think Time:
- 在Runtime Settings对话框,点击General>Think Time;
- 选择Replay think time,并选择Use random percentage of recorded think;
- Min选50%,Max选150%;以上的设定将会对录制的think time使用一个随机的百分比。例如,如果选择一个航班时录制的think time为4s,那么随机的think time将会在2-6s内(4的50%或150%)生成。(笔者认为:这很好的模拟了新老用户由于对应用的熟悉程度不同而导致了think time不同这一特点)
- 使用Logging:
- 在Runtime Settings对话框中,点击General>Log;
- 选择Enable Logging;
- 在Log options下,选择Always send messages;
- 点击Extended log,选择Data returned by server;备注:在初始的调试运行阶段之后,不建议对负载测试开启Extend Log模式。本教程中使用它的目的仅在于想要输出Vuser的log。
- 点击OK关闭Runtime Settings对话框;
- 保存场景。
在负载的情况下我要怎样监控系统?
现在你已经定义了你的虚拟用户在测试中的行为,已经为建立监控器做好准备。
当你对一个应用产生负载时,你想要实时的查看这个应用的性能以及潜在的瓶颈所存在的地方。你将在负载测试的过程中使用LoadRunner的monitor来监控每一层次结构的性能,包括服务器,系统的组件。LoadRunner提供了许多主要的后台系统组件(包括Web,Application,Database,以及ERP/CRM服务器)的监控器。
例如,你可以根据正在运行的Web Server的类别选择一个Web Server Resources监控器。你可以为相关的监控器买一个证书,比如IIS,并用这个监控器来找出反映在IIS resources中的问题。
在这一章节,你将学会怎样添加以及配置Windows Resources监控器(monitor)。你可以用监控器来确定负载对你CPU(处理器),disk(硬盘)以及memory resources(内存资源)的影响。
- 选择Windows Resources Monitor:
- 在Controller的左下角点击Run栏:
Windows Resources图标是显示在图表视图区域四个默认图表中的一个。你将在下一节课中学会如何打开其他的图表。
- 右键点击Windows Resources图表并选择Add Measurements。Windows Resources对话框打开了:
- 选择要监控的server:
- 在Windows Resources 对话框中的Monitored Server Machines区域,点击Add。Add Machine对话框打开了:
- 在Name栏中填写localhost(如果你的负载发生器在其他的机器上,你可以填写那台机器的server名或IP地址);
- 在Platform列表中,选择负载发生器所在机器的操作平台;
- 点击"OK"。
默认的Windows Resources measurements会在Resource Measurements on <server machine>列表中列举出来。
- 激活监控器(monitor):
在Windows Resources对话框中点击"OK"关闭对话框,monitor就被激活了。
第六课:运行负载测试
当你运行负载测试时,LoadRunner会对系统产生负载。你可以随后用LoadRunner的监控器和图标来观察负载的情况下系统的性能。
初始Controller Run视图
Controller的Run栏是场景的管理和监控中心。它包含五个栏:
- Scenario Group栏:左上角的栏,你可以观察组中虚拟用户的状态,你可以通过右边的按钮开始、停止、重置场景。去查看独立的虚拟用户状态,在场景中通过手动添加更多虚拟用户来对应用增加负载;
- Scenario Status栏:右上角的栏,你可以在此查看负载测试的一个总结,包括运行的虚拟用户的数量,以及每一个虚拟用户操作的状态;
- Available Graphs栏:在中间左侧的栏,你可以看到一列LoadRunner的图表。为了打开一个图表,选择一个树中的图表,把它拖拽到Graph Viewing区域;
- Graph Display栏:在中间右侧的栏,你可以自定义显示一个到八个图表(View>View Graphs);
- Graph Legend栏:在底部的栏,你可以查看你所选择的图表中的数据。备注:Run栏在Controller的底部。
我怎样运行一个负载测试场景?
在这一部分,你将打开场景:
- 打开Controller Run视图:
点击Controller底部的Run栏。
注意到Scenario Groups栏中的Down列下有8个虚拟用户,这些虚拟用户是你创建场景(Scenario)时所创建的。
由于场景还没有运行,所有其他的计数器都保持在0,图表视图区域的所有图表都是空的,当你在下一步运行场景时,图表和计数器将会开始显示信息。
- 开始场景:
点击Start Scenario按钮或选择Scenario>Start来开始运行场景。
如果你是按教程第一次运行的话,Controller会开始场景并将结果文件自动保存到负载发生器的temp文件夹下。
如果你是在重复做测试,你会被建议去覆盖已有的结果文件。
点击No,因为第一次负载测试的结果要用来和之后的测试结果进行比对。之后设置结果保存目录的对话框被打开:
确定一个新的保存结果的文件夹路径,为每一次的测试结果起一个有意义的独特的名字,因为分析图表时你可能会需要把多次场景的运行结果叠加。
在负载情况下该如何管理应用程序呢?
你会使用Controller的在线图表来观察监控器(monitors)所收集的性能数据。你通过这些信息来让你的系统远离潜在的危机。
- 检查性能图表:
Run栏下的Graph Display栏中显示了如下的默认图表:
- Running Vusers(运行着的虚拟用户)-Whole Scenario graph(全景表):显示在指定时间运行着的虚拟用户数量;
- Transaction Response Time(事无响应时间)-Whole Scenario graph(全景表):显示了每一个事务完成所花费的时间;
- Hits per second(每秒点击数)-Whole Scenario graph(全景表):显示场景运行时每秒对web服务器的点击数(HTTP请求数);
- Windows Resources graph(Windows资源表):显示在场景运行时系统资源的使用情况。
- 高亮个性化定制:
- 双击Windows Resoures表,它将放大到占据整个图表显示栏。注意到每个measurement都是用不同的颜色来表示,每一行都以相同的颜色对应图中的一条线;
- 选择哪一行,哪一行在图表中就会被高亮显示;
- 再双击图表,让其缩小到原始尺寸。
- 查看Throughput(吞吐量)信息:
在Available Graphs栏中,Web Resources Graphs下,选择Throughput表并把它拖拽到Graph Display栏中。Throughput表的measurements显示在Graph Display栏和Graph Legend栏中。
Throughput(吞吐量)表显示虚拟用户从服务器接收 的数据在任意指定的某一秒中的总量(以bytes衡量)。你可以将此图与Transaction Response Time(事务响应时间)图表进行比较以检查Throughput(吞吐量)是如何影响Transaction(事务)的性能的。
当吞吐量的规模随着时间的进行与虚拟用户数的增加而变大时,这表明带宽是足够用的。当图表随着虚拟用户数量增加而趋于相对平缓时,我们有理由去猜测与推断带宽限制了数据传输量。
要怎样才能实时的观察一个虚拟用户的运行?
当我们模拟用户的时候,你可以实时的查看虚拟用户的操作以确定他们执行的操作是正确的。Controller通过Runtime Viewer让你能够实时的查看虚拟用户的操作。
形象的观察一个虚拟用户的操作:
- 在Controller的Run栏中,点击Vusers按钮。Vusers对话框打开:
Status列显示了每个虚拟用户的状态。在上面的例子中,你可以看到四个虚拟用户在运行,四个已经处于down掉状态。Scheduler中的Start Vusers操作让Controller一次释放两个虚拟用户。随着场景的进行,虚拟用户将会2个2个的以30秒为周期被添加到组中。
- 在虚拟用户列表中选择一个虚拟用户;
- 点击Vusers工具栏上的Show the selected Vusers按钮。Runtime Viewer被打开并显示选择的虚拟用户所执行的操作。Runtime Viewer将会随着虚拟用户在脚本中步骤的进行而更新。
- 点击Hide the selected Vusers按钮,关闭Runtime Viewer。
我在哪里可以看到一个关于虚拟用户操作(Vuser actions)的总结?
想要单独看一个虚拟用户在运行测试的过程中的进展,你可以显示一个包含虚拟用户操作文字总结的log文件。
查看虚拟用户操作的文字性总结:
- 在Vusers窗口选择一个running状态的Vuser;
- 点击Vusers工具栏中的Show Vuser Log按钮。Vuser log对话框被打开:
log中包含了与用户操作相对应的信息。比如,在上面的窗口中,Virtual User Script started表明虚拟用户运行的开始时间。滑到底部你会观察到随着虚拟用户操作的进行,相应的新信息也会被添加进来。
- 关闭Vuser Log对话框,以及Vusers对话框。
怎样在测试中增加负载?
为了给系统增加负载,你可以在测试的过程中手动的添加更多的虚拟用户。
- 为了在负载测试时增加负载:
- 确定当前是在Controller的Run栏;
- 点击Run/Stop Vusers按钮,Run/Stop Vusers对话框被打开并显示了当前场景中运行的虚拟用户数;
- 在#列输入你想要向组中添加的虚拟用户数,想要再添加两个虚拟用户,则在#列把数字8改为2;
- 点击Run按钮来添加虚拟用户;
- 选择Run New子按钮选项。
两个额外的虚拟用户被添加到travel_agent组中并且在localhost负载发生器上运行。场景状态栏将显示现在有10个虚拟用户正在运行。
你可能会收到LoadRunner Controller无法激活额外的虚拟用户的消息。这是因为你可能在用你的本机来当作负载发生器而且它只有很有限的内存资源。通常来说,用一个专业的机器作为负载发生器就可以避免这种情况的发生。
应用在负载的情况下是怎样执行的?
在你的Scenario Status栏【Run栏中】中,你可以仔细的看到有哪些虚拟用户引起了应用的问题,事务失败数以及错误数偏高表明了你的应用在负载下可能执行的并不好。
- 检查场景的状态:
Scenario Status栏的头部显示了场景的整体状态:
- 查看虚拟用户操作的分解:
- 点击Scenario Status栏中的Passed Transactions,Transactions对话框被打开并列出了事务的详细;
- 点击Close关闭Transactions对话框。
你的应用遭遇错误了吗?
在重负的情况下,应用开始出现失败的情况,你可能会遇到错误和事务的失败。你的Controller会在Output窗口中显示错误信息。
- 检查error或warnings消息:
- 选择View>Show Output,你可以按照种类对信息进行排序,例如warnings或errors;
Output对话框被打开并显示了消息信息文字,包括产生的所有消息数,虚拟用户和负载发生器产生的错误,以及发生错误的脚本。
- 要查看一条消息的详细内容,选择消息并点击"Details",Detailed Message Text框出现,显示了消息详细完整的内容文本。
- 查看log信息的详细内容:
你可以通过点击相应列的蓝色链接查看关于每条消息、虚拟用户、脚本以及关联的负载发生器的错误信息。
例如:想要知道脚本中哪里出了错,查看点击进入Total Message列。Output窗口将显示你选择的错误代码的所有相关信息,包括时间,重复次数,以及脚本中出错的位置行。
- 进入查看Line Number列:
点击Line Number列下的链接,VuGen将被打开,显示了脚本中出错的行。你可以通过这一信息来帮你确认哪些响应时间较慢的事务导致了应用在负载下的失败。
我怎样得知场景是否已经运行结束?
在场景运行的总结处,Scenario Status栏的头部显示了Down这一状态。这说明场景中所有的虚拟用户都已经运行结束。
你可以打开Vsuers对话框来分别查看每个虚拟用户的状态。虚拟用户对话框显示了每个虚拟用户执行的重复次数,成功的重复次数以及经历的时间(Elapsed Time)。
你的系统是否在负载下运行良好?
想要知道你的系统是否在负载下依旧运行良好,你要去查看事务的响应时间并决定响应时间是否在可接受的范围内。如果事务的响应时间在场景中增加,你需要去查找瓶颈出在哪里。你会在最后一课中学习更多关于这方面的知识。
一旦一个问题被发现,就可能需要包括开发,DBAs(数据库管理员),网络以及其他方面的系统专家来修复这个问题。在做出适当调整后,我们需要重新进行负载测试来验证该次做出的调整是否满足了所需的要求。你重复这一循环来使得系统的性能不断得到优化。
为了便于你再次运行具有相同配置的场景,选择File>Save或点击Controller工具栏中的Save按钮进行保存。
第七课:分析你的场景
在之前的课程中你学会了如何设计,控制,运行一个场景。你运行负载测试,就一定希望能够分析运行的结果,以找出需要排查的问题来提高你的系统性能。在你的分析的过程中所生成的图表和报告代表了你场景性能的重要信息。通过这些图表和报告,你可以找到你应用程序中存在的瓶颈,以确定需要做怎样的修整才能提高它的性能。
Analysis Session是怎么工作的?
Analysis session(分析会话)的目的是为了发现你系统性能上存在的缺陷并找到其根源,例如:
- 测试的预期达到了吗?在负载的情况下客户终端的事务时间是多少?SLA满足目标吗?事务的平均事务时间是多少?
- 系统的哪些部分会导致降低系统的性能?网络和服务器的响应时间是多少?
- 你可以通过联系事务响应时间和后台监控模型来找到一个可能的原因吗?
在后续的章节中你将会学习如何打开LoadRunner Analysis,并建立与查看能够帮你找到性能问题与根源之所在的图表和报告。
我怎样开始我的分析会话?
- 打开HP LoadRunner Analysis:
双击桌面上的Analysis图标,LoadRunner Analysis被打开;
- 打开分析会话文件:
为了达到本节课的目的,能够举例分析说明尽可能多样的结果,我们将会运行一个和你在之前的章节中运行的场景相似的场景。但是这一次,你的场景中将包含70个虚拟用户,而不再是10个。你现在将要打开针对于你的测试结果所创建的分析会话。
- 在Analysis窗口选择File>Open,Open Analysis Session对话框被打开:
- 在你的<LoadRunner Installation>\tutorial文件夹下选择analysis_session文件并打开,Analysis打开了你选择的会话文件。
初始Analysis窗口
Analysis包括以下主要栏:
- Session Explorer(会话浏览器)
- Properties pane(属性栏)
- Graph Viewing pane(图表查看栏)
- Legend pane(说明栏)
- Session Explorer:左上角的栏,Analysis显示了可以查看的图表和报告。从这里你可以增加一些新的图表或报告也可以删除一些不想看的图表或报告。
- Properties栏:左下角的栏,Properties栏显示了你在Session Explorer中选择的图表或报告的详细信息,黑色字体部分的是可以进行编辑的。
- Graph Viewing栏:右上角的栏,Analysis显示图表的地方。默认情况下,Summary Report(总结报告)当你打开一个会话的时候会显示在这里。
- Legend栏:右下角的栏,你可以在这里查看所选择的图表的数据。
备注:还有一些可以从工具栏中访问的栏,这些栏可以进行拖拽并在屏幕上任意地方进行拖放。
我达到了我的目标吗?(Service Level Agreement)
在这一部分,我们将介绍一下Service Level Agreement,即我们所说的SLA。
SLAs是你为你的负载测试场景所定义的特殊目标。Analysis将这些目标和LoadRunner运行时收集与存储的性能相关的数据相比较,然后为目标判断SLA的状态(通过或失败)。
例如,你可以为你脚本中事务的平均事务时间定义一个具体的目标,或临界值。在测试运行结束后,LoadRunner将你的目标和实际录制的平均事务时间相对比。Analysis将显示你定义的每个SLA的状态,通过或失败。例如,如果实际的平均事务时间没有超过你定义的临界值,SLA的状态就将是通过的。
作为你目标定义的一部分,你可以让SLA将负载的标准也考虑在内,换句话说也就是可接受的临界值将会随着负载的等级不同而变化,例如,Running Vusers,Throughput等等。当负载增加,你可以允许一个更高的临界值。
根据你所定义的目标,LoadRunner通过以下几种方法中的一种确定了SLA的状态:
按照时间轴上的时间来定义SLA的状态:Analysis在运行时按固定的时间间隔显示SLA的状态(比如:每隔5s)。
按整个运行过程来定义SLA的状态:Analysis为整个场景的运行显示一个单独的SLA状态。
SLAs可以在场景在Controller中运行前就定义好,也可以之后在Analysis中来定义。
在后续的部分中,你将要用HP Web Tours这个样例来定义一个SLA。假设HP Web Tours的管理员任何时候都想要知道book_flight和search_flight的平均事务时间是否超过了固定的值。为了达到这个目的,你可以选择事务并设置临界值(threshold values)。这些临界值就是平均事务时间在可接受范围内的最大值。
你也将设置三个临界值来将具体的负载标准考虑在内,在这个例子中我们指的就是Running Vusers(运行着的虚拟用户)。换句话说,随着运行的虚拟用户数的增加,临界值也随之升高。
这是因为虽然HP Web Tours的管理员希望平均事务时间越低越好,但是我们不得不承认这一年中的有些时候HP Web Tours站点确实会承担相比于平时更大的负载。例如,在旅游高峰季的时候,会有更多的旅游客户去登陆网站来预订飞机票,检查航班等等。在这种可以理解的高负载情况下,一个稍微长一点的平均事务响应时间将是可以接受的。
你将设定SLA来考虑三个负载场景,轻负载,正常负载和高负载。每一个场景都有它的临界值。
我怎样定义一个SLA?
你将在场景运行后在Analysis中定义一个SLA。
备注:推荐在场景运行前,在Controller中定义一个SLA。但是出于本教程的目的,你还没有对之前的章节中运行的场景进行分析,你将会在Analysis中定义SLA。想在Controller中定义一个SLA,在Design栏的Service Level Agreement模块中点击"New"。
定义一个SLA:
- 打开SLA Wizard(向导):
- 在LoadRunner Analysis中,选择Tools>Configure SLA Rules。Service Level Agreement对话框被打开:
- 点击"New"打开Service Level Agreement向导:
注意:当你第一次打开SLA向导,Start页会显示在你面前。如果你不希望下次运行向导的时候再看到这个页面,勾选"Skip this page next time"。
- 点击"Next"。
- 为你的目标选择一个度量尺度。
- 在Select a Mearsurement for Your Goal页面,选择Transaction Response Time为Average:
- 点击"Next"。
- 选择要监控的事务。
在Select Transactions页面,在Available Transactions列表中选择一个想要监控的事务。
- 双击check_itinerary事务,将它移到Selected Transactions列表中:
- 点击"Next"。
- 设置负载标准。
在Set Load Criteria页面,你要让SLA考虑到不同的负载场景。
- 从Load Criteria下拉列表中选择Running Vusers;
- 像下图中一样设置Load Values:
在上图中,你设置了SLA,对三个潜在的负载场景定义了一个可以接受的平均事务时间:
-Light Load(轻负载):0到19个虚拟用户;
-Average Load(正常负载):20到49个虚拟用户;
-Heavy Load(重负载):多于50个虚拟用户;
- 点击"Next"。
- 设置临界值。
在Set Threshold Values页面,你为check_itinerary事务定义了一个可以接受的平均事务时间。
像下图中所示来对临界值进行设定:
在此你仅仅指出了下列平均事务时间是可以接受的:
-Light Load(轻负载):小于等于5s;
-Average Load(正常负载):小于等于10s;
-Heavy Load(重负载):小于等于15s。
- 保存SLA。
先后点击"Next"和"Finish",窗口关闭。
Analysis将会把你的SLA设置应用到Summary Report(总结报告)中,之后的report将会被更新,包含所有相关的SLA信息。
我要怎样查看性能的总结?
Summary Report栏显示了关于场景运行的总体信息和统计,以及所有相关的SLA信息。例如,根据我们定义的SLAs性能最坏的事务都有哪些,在特定的时间间隔下特定的事务如何执行,以及所有的SLA状态。你要从Session Explorer中打开Summary Report。
- 什么是总体场景统计?
在Statistics Summary模块,你可以看到最多有70个虚拟用户在本次测试中运行。其余的统计诸如total/average throughput,total/average hits等信息也会被显示出来。
- 性能最差的事务有哪些?
这五个最坏事务的表单会告诉你:根据你定义的SLA,哪5个事务的性能最坏。
你可以看到在check_itinerary事务执行的时间段内,有66.4%的时间超过了SLA中所定义的临界值。在整个运行过程中超过SLA临界值程度的平均百分比为200.684%。
- 在哪些时间段内临界值被超越?
Scenario Behavior Over Time模块将会显示不同时间内事务的性能,绿色的方块显示的是事务性能在SLA所设定的临界值内的时间段,红色的方块显示的是失败的事务,灰色的方块显示的是没有相关的SLA被定义。
你可以看到对于你定义了SLA的事务,check_itinerary在多数时间段内性能超过了临界值。
- 什么是总体事务性能?
Transaction Summary模块列出了每一个事务的性能总结。
我们还可以看到check_itinerary事务失败了28次。
回顾每个事务的时间,90 Percent这一列显示了特定事务90%次运行所用的时间。你可以看到90%的check_itinerary事务在测试中执行耗时65.754秒,是它平均时间(32.826秒)的两倍,这意味着该事务在大多数情况下响应时间较慢。
注意SLA Status这一列显示了和"在SLA中定义的事务"相关的总体状态:check_itinerary的SLA Status为Failed。
我要看的到的性能!
你可以在Session Explorer栏中访问可观看的性能图。接下来你要查看并分析Average Transaction Response Time图。
- 打开Average Transaction Response Time图:
- 在Graphs下的Session Explorer中选择Average Transaction Response Time。Average Transaction Response Time图将会显示在图显区域。
- 在Legend栏点击check_itinerary事务,相应在图中的事务折线会被高亮显示。
图上的点代表了场景运行中某一时间点事务的平均响应时间。让你的鼠标停留在图中的某点上,一个黄色的方框将出现并显示该点的坐标信息。
- 分析结果:
注意到check_itinerary事务的平均事务时间波动很大,并且在场景运行到2分56秒时达到了一个75.067秒的峰值。
在一个性能良好的服务器上,事务将会有一个比较平稳的平均时间折线,在图的最下方,你可以看到logon,logoff,book_flight,以及search_flight事务都有着相对更稳定的平均事务时间。
我的服务器是否性能良好?
在课程之前的部分你看到了你的服务器性能的不稳定性。现在你将要分析70个Running Vusers(正着运行的虚拟用户)对你的系统所产生的影响。
- 研究虚拟用户的行为:
在Graphs下的Session Explorer中点击Running Vusers。Running Vusers图将显示在图显区域。
你可以看到虚拟用户逐渐的开始运行,之后经历了一个大约三分钟的长度,这段时间内70虚拟用户同时运行,再后来虚拟用户逐渐停止运行。
- 在该图中进行过滤,以使你只能看到所有的虚拟用户同时运行时的时间段。
当你在一个图中进行过滤的时候,图中的数据也会被收缩,收缩到只显示你关心的那部分。其他的部分都将被隐藏掉。
- 在图上点右键,选择Set Filter/Group By,或者你也可以点击Analysis工具栏中的Set Filter/Group By按钮。
- 在Filter Condition区域,选择Scenario Elapsed Time行Values列。
- 按照下图中进行设置:
- 点击"OK";
- 在Graph Settings对话框点击"OK"。
Running Vusers图现在只显示1:30到3:45这段时间在场景中运行着的虚拟用户。所有其他的虚拟用户将被过滤掉。
注意:要清理filter,在图上点击右键,选择Clear Filter/Group By,或者也可以点击Analysis工具栏中的Clear Filter/Group By按钮。
- 联系Running Vusers图和Average Transaction Response Time图来比较他们的数据。
你可以将这两个表拼接在一起以观察一张图中数据对另一张图中的数据所产生的影响,这种做法叫做关联两张图。
例如,你可以将Running Vusers图和Average Transaction Response Time图进行关联来查看大量的虚拟用户对平均事务时间产生的影响。
- 右键点击Running Vusers图选择"Clear Filter/Group By";
- 右键点击图,选择"Merge Graphs";
- 从Select graph to merge with列表中选择"Average Transaction Response Time";
- 在Select type of merge下选择"Correlate",并点击"OK"。
现在这两张图就合在一起显示了——Running Vusers - Average Transaction Response Time图。
- 分析相关的图:
在这张图中你可以看到随着虚拟用户数的增多,check_itinerary事务的平均时间逐渐增加。换句话说,平均响应时间随着负载增加而增加。
在66个虚拟用户的时候,平均响应时间出现了一个急剧的(sudden,sharp)增长。我们说这个测试broke the server(冲破了服务器),在多于66个虚拟用户同时运行时,平均响应时间开始减少。
保存一个模板(template)
至今你已经过滤了一张图并关联了两张图。下一次你分析场景的时候,你可能会想要看到相同的图,有相同的过滤与合并条件。你可以将你的merge and filter(合并与过滤)的设置保存到一个模板中,并将它们用于其他的分析会话中。
保存你的模板:
- 选择Tools>Templates,出现如下对话框:
- 在Templates栏点击"New" 按钮,如下对话框被打开:
- 输入一个名字并点击"OK";
- 点击"Save and close"按钮关闭Apply/Edit Template对话框。
下一次你打开一个新的分析会话并且想要用一个已存的模板时:
- 选择Tools>Templates,Apply/Edit Template对话框被打开;
- 从列表中选择你的模板,并点击"Save and close"。
我怎样精确定位问题所出自的根源?
至今为止,你已经看到了随着负载的增加,对check_itinerary事务的平均响应时间会产生一个负面的影响。
你可以更深入的研究check_itinerary事务以便发现哪些系统资源负面地影响了它的性能。
这个自动关联工具可以将所有包含可能会影响到check_itinerary事务响应时间的数据的图合并到一起并精确的定位问题发生时还有什么事情正在发生。
- 从graph树中选择Average Transaction Response Time图。
看check_itinerary这一事务,特别在过去的1到4分钟这一时间段内。平均响应时间直线上升并在3分钟左右到达峰值。
- 过滤Average Transaction Response Time图,只查看check_itinerary事务:
- 右键点击图片,选择"Set Filter/Group by";
- 在Transaction Name / Value格中选择"check_itinerary";
- 点击"OK"。
- 自动关联图:
- 右键点击图,选择"Auto Correlate";
- 在Auto Correlate对话框中确定Measurement to Correlate选择的是check_itinerary,并将时间范围设为从1:20到3:40——你可以直接在框中输入,也可以在图中ElapsedScenario Time轴上对红色和绿色的杆儿进行拖拽。
- 点击"OK"。
这个Auto Correlated Graph(自动关联图)将会显示在图显区域。Check_itinerary这一事务被高亮显示。
这个自动关联的图有个默认的名字:Auto Correlated Graph [1].
- 为该图重命名:
- 在Session Explorer中的Graphs下右键点击Auto Correlated Graph [1]并选择"Rename Item",图的名字变为可编辑状态;
- 输入Auto Correlated - check_itinerary并按回车,或者随便点旁边的什么地方都行。
- 分析自动关联图:
在Legend栏下,从Graph列为Windows Resources的项中找到Measurement为Pool Nonpaged Bytes和Private Bytes这俩Measurements。
在Measurement和Correlation Match列中,你可以看到这些内存相关的measurements(测量尺度),和check_itinerary这一事务的Correlation Match超过了70%。这意味着这些元素的性能和check_itinerary这一事务的性能在指定的时间段内紧紧相关。
我们可以准确的断定当check_itinerary这一事务的响应时间达到峰值的时候,系统的内存资源将会出现短缺。
我还可以收集到和场景运行相关的其他信息吗?
除了在分析会话开始的graph树上能看到的图外,你可以显示各种图来收集其他关于场景运行的信息。
- 点击Graph>Add New Graph:
Open A New Graph对话框被打开并列举了包含数据的并能够显示的图的种类:
- Vusers——显示虚拟用户及其状态的信息;
- Errors——显示错误统计;
- Transactions——显示事务及其响应时间的数据;
- Web Resources ——显示点击量,吞吐量,以及连接数据;
- Web Page Diagnostics——显示你脚本中监控的各个网页的数据;
- System Resources——显示系统资源使用的数据;
- 显示一个新图:
- 在Open A New Graph对话框中,点击列出的分类左侧的"+"来展开分类;
- 选择一张图并点击"Open Graph"按钮;
- 点击"Close"按钮关闭Open A New Graph对话框。
现在打开一些其他的图来对你的场景运行情况有一个更好的了解。
我怎样发布我的发现?
你可以从你的分析会话中通过HTML或微软的Word报告来发布你的发现。报告是用设计者模板创建的,并且包含了解释以及对图和数据的说明。
HTML Reports
HTML报告可以在任何浏览器被打开和查看。
创建一个HTML报告:
- 点击Reports>HTML Report;
- 为你的报告起个名儿,和你要将它保存的路径;
- 点击"Save"进行保存。
点击"Save"后Analysis会自动创建报告并将它显示在你的浏览器中。
你会注意到你的HTML报告的布局和你的分析会话非常相似。你可以点击左侧栏中的链接来查看不同的图。每张图的描述信息将会在页面底部给出。
微软Word报告
你可以将你的分析会话表现在一个微软的word报告中。Word报告比HTML报告更好理解,因为你可以选择让它包含场景的总体信息,测量尺度描述(measurement description)等等。你也可以格式化你的报告,让它包含你公司的名字和标志(logo),以及作者的详细信息。
就像任意一个Word文件一样,这个报告是可以编辑的,所以你可以在你生成的报告中添加更多的评论与发现。
创建一个微软Word报告:
- 点击Reports>New Report:
New Report对话框打开了。
- 在General栏中:
- Based on template选择Detailed report (for single run)
- 为你的Report起一个标题;
- 输入作者姓名,工作标题,公司名称。
- 在Format栏中:
默认情况下,建立的报告将会包括一个标题页面,一个包含内容的表结构,图的详细信息以及描述,以及测量尺度描述(measurement description)。你可以选择性的将脚本中的信息加到报告里,让你可以查看业务流程步骤中的缩略图。
你可以通过选择"Include company logo"找到相应的logo文件位置并加入报告中。Logo文件必须是个".bmp"格式的文件。
- 在"Content"栏中:
- 选择你要加入到你的报告中的场景运行和分析会话的部分内容。
出于本教材的目的,你要添加一个"Executive Summary"(概要)到Content Items列表中;
- 点击"Add"按钮来打开"Add Content Items"窗口,选择"Executive Summary"并点击OK:
"Executive Summary"被加到左侧的Content Items栏中。
选择"Executive Summary",在右侧编辑框中输入下列文字:
- Objectives: The objectives of the test scenario were to....
- Conclusions: The conclusions I reached are as follows:
- 在Content Items栏中,选择"Largest URLs by Average Kbytes"并点击Delete按钮。这样做将不会把该图包含在报告中。
- 改变报告中显示内容项的顺序。
- 在Content Items栏中选择Workload Characteristics。在Selected Columns列表中点击"Average Hits per Second"。
- 点击向下箭头按钮直到它移动到Total Transactions Number下面。在报告中,Average Hits per Second这一内容项将会在Total Transactions Number这一内容项后面紧接着显示。
- 点击"Generate"按钮:
之后LoadRunner将会自动收集数据并生成一个Microsoft Word文件,并用Microsoft Word打开。
除了你在分析会话时生成的图外,报告还包含了一个客观的结论,以及其他你在创建报告时选择的部分和图表。
总结
在这节课中,你学会了最基本的——定义SLA(Service Level Agreement),分析一个场景的运行,以及将你的测试结果发布到报告中。
你已经知道性能上的问题将会在你研究各种显示服务器瓶颈的图表后被发现,原因可能是由于负载过重。你已经看到了,你可以通过配置图表来显示相关联的数据,指出这些瓶颈的根源之所在。
HP LoadRunner 12.02 Tutorial T7177-88037教程独家中文版的更多相关文章
- LoadRunner 12.02 安装教程及中文语言包安装
注意事项: 安装前,把所有的杀毒软件和防火墙关闭. 若以前安装过LoadRunner,则将其卸载. 安装路径不要带中文字符. LoadRunner 12已经不再支持xp系统,仅支持win7和win8系 ...
- LoadRunner 12.02 安装以及汉化教程
LoadRunner 12.02 安装 一.下载 首先下载Loadrunner12安装包. 下载后有四个安装包: HP_LoadRunner_12.02_Community_Edition_Addit ...
- [原创]LoadRunner 12.02 录制脚本时提示无Internet访问,如何解决?
在使用LoadRunner 12.02 进行录制脚本时提示无Internet访问,如下图: 翻译中文如下: 可以尝试以下方式解决:点击弹出框中的“Yes”即可. 若还是有问题,尝试以下方式: (1)L ...
- HP Loadrunner 12.53的下载与安装
HP Loadrunner 12.53的下载与安装 HP Loadrunner 12.53的下载:http://pan.baidu.com/s/1c23axHm HP Loadrunner 12. ...
- LoadRunner 12下载和安装教程
我们利用LoadRunner可以对Web应用系统进行性能压力测试,本篇博客将和大家介绍下LoadRunner 12的下载和安装,在后续的博客中将和大家介绍其使用的方法. 1.LoadRunner 12 ...
- loadrunner 12.0.2 的下载和安装
链接: https://pan.baidu.com/s/1o2jQjPdUrRm451Pue8bbEg 提取码: gpj6 安装了loadrunner 11 打开文件可自动更新到12 第一部分:安装 ...
- 手机APP脚本录制(LoadRunner 12)
最近因项目需要,研究了下手机APP脚本录制方法,有需要的童鞋可参考使用! 方法1: 在手机网络中设置网络代理,使用LR12选择Mobile Application – HTTP/HTML协议中代理录制 ...
- [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
[原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...
- LoadRunner 12试用
LoadRunner 12试用 http://blog.csdn.net/testing_is_believing/article/details/23611845
随机推荐
- python 集合的运算
x = frozenset([, , , , ]) y = frozenset([, , , , ]) #如果x与y没有公共元素,返回true print(x.isdisjoint(y)) #返回x与 ...
- Jmeter高阶学习,运用NotePad++编写工程,随意复制多个工程到同一个工程
Jmeter创建了工程之后,保存文件后就是一个jmx后缀的文件,你有没有试过单独用文本编辑器打开文件,编辑文件? Step1: 最简单的Jmeter工程,只有一个测试计划 <?xml versi ...
- Python day10 global关键字、函数递归、匿名函数、map函数的用法详解
1.global关键字 引用全局变量,在局部全局变量改变,也会改变,global相当于指针,将地址指向全局变量的name name='littlepage' def littepage(): glob ...
- js、jq对象互转
1.js对象转jq对象: $() $('#kw') $(document.getElementById("kw")) 2.jq对象转js对象: $(this).get(0) ...
- LRU缓存淘汰算法
什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用,在有限的内容块中存储最近使用次数最多的数据,当内容块已满时,把最少使用的数据删除以便存储新的内容.
- 区间数字的按位与 Bitwise AND of Numbers Range
2018-08-13 22:50:51 问题描述: 问题求解: 首先如果m 和 n不相等,那么必然会有至少一对奇偶数,那么必然末尾是0. 之后需要将m 和 n将右移一位,直到m 和 n相等. 本质上, ...
- eclipse jsp:useBean搞死人了。
eclipse jsp:useBean搞死人了 首页,用eclipse需要经常重启tomcat服务器,这是因为你编辑了页面正浏览这个页面,而这个页面还处在之前的错误编译中... 其次,第一次用到use ...
- English trip -- VC(情景课)1 C What's your name?
Grammar focus 语法点 What's your name? What's his name? What her name? My name is Angela. His name is K ...
- sgu 116 Index of super-prime
题意:用最少的super-prime组成n; 找出所有的super-prime数,只有202个.用完全背包记录能取到n值的最少数量.再找出7要哪些元素. #include <iostream&g ...
- 52 53django
一.需要弄清楚的几个关键点: KEY: 1 Django项目无论多大,只是一个应用程序 2 地址栏发请求默认是GET请求 form表单可以发送get请求,也可以发送post请求 3 浏览器接受的响应体 ...