好好学习 天天向上!

发布新日志

  • Loadrunner关联(一)什么时候需要做关联(转来的)

    2009-03-19 13:56:39

    Loadrunner关联(一)什么时候需要做关联51Testing软件测试网)Tl?f L1}(J3i5H

    1.关联的含义

    5T }.p-n%`183368

    关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联。51Testing软件测试网'^7G F6q9`KLg)r

    其实关联也属于一同特殊的参数化,只是与一般的参数化有些不同51Testing软件测试网.E"}@0Yc M

    一般的参数化的参数来源于一个文件、一个定义的table、通过sql写的一个结果集等,但关联所获得的参数是服务器响应请求所返回的一个符合条件的、动态的值51Testing软件测试网%l9QX }W*}{E!~

    2.什么时候需要做关联

    n f i4l$Vg~183368

    要想弄清这个问题,我们首先要知道客户端与服务器端的请求与响应的过程

    &UL6p5g]:T183368

    拿一个登录的过程我们来看一下:51Testing软件测试网,N-[#V{ uTu M

    BKHSM7X'`183368

    'aW%T&m0N183368

    过程说明:

    jv/O$?7o7Y'Xj:br,zw183368

    客户端发出获得登录页面的请求51Testing软件测试网Wg mH$K3n

    服务器端得到该请求后,返回登录页面,同时动态生成一个Session Id

    $BQ __ k)B2_"j183368

    当用户输入用户名密码,请求登录时,该Session Id同时被发送到服务器端51Testing软件测试网IGJ[(h1{2X,sJ

    如果该Session Id在当前会话中有效,那么返回登录成功的页面,如果不正确则登录失败51Testing软件测试网~pH$FK({f

    在第一次录制过程中loadrunner把这个值记录了下来,写到了脚本中,但再次回放时,客户端发出同样的请求,而服务器端再一次动态的生成了Session Id,此时客户端发出的请求就是错误的,为了获得这个动态的Session Id我们这里用到了关联。51Testing软件测试网k/}4QMXP@,l+H

    所以我们得出结论:51Testing软件测试网vp\A%n\Oj8mU

    当客户端的某个请求是随着服务器端的相应而动态变化的时候,我们就需要用到关联51Testing软件测试网0~^%o?&k dt#qg8d

    当然我们在录制脚本时应该对测试的项目进行适当的了解,知道哪些请求需要用到服务器响应的动态值,如果我们不明确那些值需要做关联的话,我们也可以将脚本录制两遍,通过对比脚本的方法来查找需要关联的部分,但并不是说两次录制的所有不同点都需要关联,这个要具体情况具体分析51Testing软件测试网r aw4` V,y V

    关于自动关联和手动关联我会在下篇日志中描述51Testing软件测试网 u}0|2v:@

  • Loadrunner关联(三)手动关联

    2009-03-19 13:54:07

    Loadrunner关联(三)手动关联

    ~4Y+F K-H;Mf2p9rl183368

    原创文章,转载注明出处:http://www.51testing.com/?4197251Testing软件测试网/W)V;g*V$F iO8Q

    手动关联的过程大致如下:51Testing软件测试网c?B@;q1Y8^}YO

    第一步:录制测试脚本,录制二遍51Testing软件测试网-G;`TW(a\;B

    第二步:使用WinDiff工具找出两次脚本的不同,判断是否需要进行关联

    ~*tI%v7gC183368

    第三步:确定插入关联的位置
    vq G&L r183368
    第四步:在VIEW TREE中使用web_reg_save_param函数手动建立关联51Testing软件测试网0I_(a#bsd$E)t
    第五步:将脚本中有用到关联的数据,用参数代替

    N p j_6S/LeT183368

    第六步:验证关联的正确性51Testing软件测试网1jI:u&Y!Y:W

     51Testing软件测试网%hX"{b$\ c

    下面详细介绍:51Testing软件测试网^ mij!v(NQ A

    第一步:

    Mr,AnUv,D1sL183368

    录制测试脚本,录制二遍

    8B)n5}%m!G K183368

    这一步就不用多说了,相同的操作,录制两份,分别保存51Testing软件测试网i$ql.gfb

    第二步:

    tW~r2m183368

    使用WinDiff工具协助找出需要关联的数据51Testing软件测试网t;x.kQn%~
    1.
    在第二份脚本中,点选VuGen的【Tools>Compare with Vuser…】,并选择第一份脚本。
    51Testing软件测试网 a:p3CM%IHR
    2.
    接着WinDiff会开启,同时显示二份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字。(假如没看到红色字体,请点选【Options>View>Show Inline Differences】)。
    51Testing软件测试网8}v0k?i F&|Pz

    查看二份脚本中差异的部份,每一个差异都可能是需要做关联的地方。51Testing软件测试网-]6jSWj"U Z

    注意:lr_thik_time部分的差异可以忽略

    4~Y/x{4Q6Epx3Z183368

    找到不同的部分后,复制,然后打开Recording Log或是Generation Log,按Ctrl+F,在查找窗口中粘贴差异部分的内容,点击查找找到后,查看该部分的信息,确认是客户端的请求信息还是服务器回应的信息

    +M(z/]5oi183368

    如果出现在$$$$$$ Request Header For Transaction With Id 3 Ended $$$$$$这个部分,那证明是客户端发出的请求,这里是不需要做关联的

    &mI'i*Wt$r,C1W183368

    一般做的关联都是出现在****** Response Header For Transaction With Id 7 ************ Response Body For Transaction With Id 7 ******中的部分。51Testing软件测试网-pQqm1C p&Xd G

    在找到这个信息后,需要记录如下信息:

    B ~-X9A$fv V@183368

    a.记录这个不同数据之前的内容和之后的内容

    S1ArGr zMS183368

    b.记录这个不同数据出现的位置,是Header还是Body51Testing软件测试网8YTt2c!oZl%Q

     51Testing软件测试网%SucZ$F?C

    第三步:51Testing软件测试网|,U1p X/d

    确认插入关联的位置

    &l#~Z.xi;ON183368

    我们在日志中找到了两次脚本的不同点的位置,根据这个位置,我们再确定是在哪个请求之后产生的,也就是说要定位发生不同点的response是由哪个request产生的,找到了这个请求的函数位置,我们就知道要往哪里做关联了

    @;d$Jh!h;\tG;@[183368

    一般情况下关联函数写到发出请求的函数之前就可以了51Testing软件测试网4Z-Mz0g7U/tlq)i

     

    9p/BhL&Rbp183368

    第四步:

    l0O WI,]IwN183368

    插入关联函数

    p4W;j s!K5nd n183368

    在插入关联函数前,我们先介绍关联函数web_reg_save_param51Testing软件测试网L5j3z5?o.?:_o]

     一个web_reg_save_param函数的例子:51Testing软件测试网 H3U{.mJn{

    web_reg_save_param ("sessionid",51Testing软件测试网E(T;| ut

         "LB=Session_id:",51Testing软件测试网;|6} Z1d_ S!L

         "RB=;",51Testing软件测试网:c8d;UY8hF,j+t

         "Search=Body",

    I:m b5gE3e8N vM2X183368

         LAST);

    .`&XU-g9sC.aX,We183368

    在这里我们只介绍几个常用参数的含义

    x1q.\OjvZ183368

    语法:int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);

    :I!o3G0n(p D w6r,S7Z"W183368

    参数说明:

    7`T5sI'T+k;Y!W183368

    ParamName:存放得到的动态内容的参数名称

    ,fl*m"W'J'K183368

    list of Attributes:其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写

    )CO2RL%s(} rA#E6H183368

    LB( Left Boundary ) :返回信息的左边界字串。该属性必须有,并且区分大小写。

    S2mg$N!mOg,p183368

    RB( Right Boundary ):返回信息的右边界字串。该属性必须有,并且区分大小写。

    "d5lm.Jt$V;I K183368

    Search :返回信息的查找范围。可以是HeadersBodyNoresourceAll(缺省)。该属性质可有可无。

    &R~.jY;k\%NCJ S6mK183368

     

    .Y6nO HJTZ183368

    那么如何插入该关联函数呢?51Testing软件测试网1_aWBv$z?

    1.vugun切换到view tree模式下51Testing软件测试网5zq w[.}Z7[;T

    2.在左边的列表中,找到在上一步发出请求的函数,点击“右键”

    +^/o6^ ~TNudnx4N183368

    选择“insert before

    3h}9H,]&V+_`s [183368

    3.在弹出的“add step”对话框的“find function”中输入“web_reg_save_param”,点击“ok

    CsJ$c PII/Q @183368

    在“parameter name”中输入,关联函数的名称,这里最好有含义,“sessionid

    HIiF,q+mKR&Ny183368

    在“left boundary”中输入,刚才记录下的不同点字符串的左面的几个字符,定义左边界,Session_id:

    )U4[:n7v kF183368

    在“right boundary”中输入,刚才记录下的不同点字符串的右面的几个字符,定义右边界,;51Testing软件测试网9x1OT2Bv3cV'gl(~

    在“search in”中,选择“body

    ;Jbne#DVV)L183368

    点击“ok

    3@D;o Gn!};[#IWR183368

    4.回到脚本编辑模式下,查看该函数插入是否正确51Testing软件测试网DZzZ-Kf[y#~

    在发出请求的函数前应该看到:51Testing软件测试网,p?m}Q

    web_reg_save_param ("sessionid",51Testing软件测试网-ZEceC-|ce&M

         "LB=Session_id:",

    3D"@ r'ZG'?q"g183368

         "RB=;",51Testing软件测试网{w2LB_~+x2m

         "Search=Body",

    }[:{^)C(D4Xza183368

         LAST);

    "e zvi)m+L-O183368

     51Testing软件测试网#I2A'ETg}u{E#lk

    第五步:51Testing软件测试网#c_|i} [C

    将脚本中有用到关联的数据,用参数代替51Testing软件测试网7j,^\8Q)D"L%W

     51Testing软件测试网+|Sum7\ E3w%Hq3Z0K

    如发出请求的参数如下,那么将原来服务器返回的动态值使用{ sessionid }来替换:51Testing软件测试网[K M5qcE8t

     web_submit_form("login.php_2",

    ;F(\~Y*}.V*|7q [183368

         "Snapshot=t2.inf",51Testing软件测试网x I `,JI }4h9F

         ITEMDATA,

    n#ZR5j\BB/p183368

         "Name=login", "Value=wangjin", ENDITEM,51Testing软件测试网 t#}X/mb

         "Name=password", "Value=wangjin", ENDITEM,51Testing软件测试网5j E|7Q#WB7F"{4b/W@

           "Name=Session_id","Value={ sessionid }", ENDITEM,51Testing软件测试网 V t%|Zy

         "Name=Submit", "Value=Login", ENDITEM,

    4P/|m6`vE)LP$P183368

         EXTRARES,

    )O}Rp5ebsM183368

         "URL=/media/images/border_bg_l.gif", ENDITEM,51Testing软件测试网"l|f$bTd

         "URL=/media/images/header_bg.gif", ENDITEM,

    7w|ma&[J5j%_183368

         "URL=/media/images/th.gif", ENDITEM,

    D9~v9} T3l v183368

         LAST);

    3L]TQt|6V183368

     

    :z^^g:\Bnu183368

    第六步:51Testing软件测试网ZW x ^2n#a

    验证关联的正确性51Testing软件测试网dA3A7j elb7k

    回放脚本,验证关联的正确性51Testing软件测试网fX@f+H\o,e

     51Testing软件测试网~7V+{bM _;_j

    OK!!!51Testing软件测试网M'\2Ws;w}NX

    大功告成,累死我了51Testing软件测试网/@Y V,o*yA9M+H#vn~

  • Loadrunner关联(二)自动关联(感谢这篇文章)

    2009-03-17 15:55:47

    Loadrunner关联(二)自动关联

    "v&F5\;|P183368

    上一篇日志介绍了关联的含义及什么样的情况下需要用到关联

    qg?zZ Nw,o183368

    这次我们介绍一下loadrunner中的自动关联

    _C y)E!lh1u183368

    自动关联包含两种机制:

    /C-K-e H:ajv.J-c183368

    一种是loadrunner通过对比录制和回放时服务器响应的不同,而提示用户是否进行关联,用户可自己创建关联规则,这个功能可以方便的使我们获得需要关联的部分,但同时也存在一定的问题,如:自动关联所检测到的关联点不一定真的需要进行关联,这要我们更具实际情况进行判断;有些需要关联的动态数据自动关联无法找到,这是就需要做手动关联

    dF+NVK \183368

    另一种是loadrunner自带的自动关联规则,在录制脚本时,会根据这些规则自动创建关联

    @p(F1a D c183368

    自动关联的步骤如下:

    O(J1y2Hn183368

    1.开启自动关联选项

    ]a&G#I0I4l],ZXw3{n9@183368

    刚才提到的两种关联机制,如果用户想使用loadrunner自带的关联规则创建关联,那么需要在Recording Options>Internet Protocol>Correlation】中启用关联规则,选中“Enable correlation during recording”,当录制这些应用系统的脚本时,VuGen会在脚本中自动建立关联。也可以在【Recording Options>Internet Protocol>Correlation】中添加关联规则,达到自动关联的目的。51Testing软件测试网RcD8r\ I6L\;_'R

    如果需要在回放脚本时,loadrunner自动检测需要关联的部分,那么需要在【Tools>general options>Correlation】中选中“save correlation information during replay”和“show scan for correlations popup after replay of vuser”,当回放玩脚本后,会弹出Scan action for correlation窗口,进行关联点的搜索51Testing软件测试网9JzY|%_A

     

    "z5o(@6r3AJ^p#M4U183368

    2.录制脚本51Testing软件测试网/_iI&X"| tQIqO

    录制脚本的过程在这里就不多说了

    !j#qW5@'\!t/]s183368

     

    `ubm kt183368

    3.回放脚本

    9HL)^6w*Gj*M3hs8s183368

    如果录制的脚本存在需要做关联的部分,那么在回放脚本时会出现错误51Testing软件测试网'Ta)f&eg;Im5f

     51Testing软件测试网 N Tl`\w5C1X

    4.系统自动弹出检测关联对话框,或手动启动关联检测对话框

    Y URW~:b3YF6M$IuB183368

    如果选择了Tools>general options>Correlation】中的“save correlation information during replay”和“show scan for correlations popup after replay of vuser”,那么在回放脚本后会自动弹出“Scan action for correlation”窗口,点击“yes”进行自动查找

    ]'D+?y `#]0\183368

    如果没有选择上述设置,那么也可以按CTRL+F8启动关联自动搜索51Testing软件测试网*K-M2OYRHp

     51Testing软件测试网9xI8LShLR#v

    5.查看系统检测出的关联点进行关联设置

    6Bq I(X;SN!~3{Y183368

    如果在录制和回放中存在差异,loadrunner会在“Correlation Results”中列出需要做关联的内容,用鼠标点击一条需要做关联的内容,点击“Create Rule”,系统会显示获得当前数据的规则,点击“yes”,完成规则的创建,同时查看脚本中增加了一个web_reg_save_param函数

    Dfvzr$m)h183368

    也可以点击Correlate】按钮创建关联,一笔一笔做,或是按下【Correlate All】让VuGen一次就对所有的数据建立关联。51Testing软件测试网7RpT8?ZB3o H/O

    注意:由于Correlation Studio会找出所有有变动的数据,但是并不是所有的数据都需要做关联,所以不建议您直接用【Correlate All】。

    Ia0pM%k,A S183368

     

    | pI'mDs,f183368

    6.回放脚本检查关联的正确性

    K8IW!ca183368

    创建好关联后,回放脚本检查关联的正确性51Testing软件测试网{X5Q*SuM

  • 最全LR中性能数据翻译--转

    2008-12-02 10:55:52

    Transactions(用户事务分析)
    用户事务分析是站在用户角度进行的基础性能分析。
    1、Transation Sunmmary(事务综述)
    对事务进行综合分析是性能分析的第一步,通过分析测试时间内用户事务的成功与失败情况,可以直接判断出系统是否运行正常。
    2、Average Transaciton Response Time(事务平均响应时间)
    “事务平均响应时间”显示的是测试场景运行期间的每一秒内事务执行所用的平均时间,通过它可以分析测试场景运行期间应用系统的性能走向。
    例:随着测试时间的变化,系统处理事务的速度开始逐渐变慢,这说明应用系统随着投产时间的变化,整体性能将会有下降的趋势。
    3、Transactions per Second(每秒通过事务数/TPS)
    “每秒通过事务数/TPS”显示在场景运行的每一秒钟,每个事务通过、失败以及停止的数量,使考查系统性能的一个重要参数。通过它可以确定系统在任何给定时刻的时间事务负载。分析TPS主要是看曲线的性能走向。
    将它与平均事务响应时间进行对比,可以分析事务数目对执行时间的影响。
    例:当压力加大时,点击率/TPS曲线如果变化缓慢或者有平坦的趋势,很有可能是服务开始出现瓶颈。
    4、Total Transactions per Second(每秒通过事务总数)
    “每秒通过事务总数”显示在场景运行时,在每一秒内通过的事务总数、失败的事务总署以及停止的事务总数。
    5、Transaction Performance Sunmmary(事务性能摘要)
    “事务性能摘要”显示方案中所有事务的最小、最大和平均执行时间,可以直接判断响应时间是否符合用户的要求。
    重点关注事务的平均和最大执行时间,如果其范围不在用户可以接受的时间范围内,需要进行原因分析。
    6、Transaction Response Time Under Load(事务响应时间与负载)
    “事务响应时间与负载”是“正在运行的虚拟用户”图和“平均响应事务时间”图的组合,通过它可以看出在任一时间点事务响应时间与用户数目的关系,从而掌握系统在用户并发方面的性能数据,为扩展用户系统提供参考。此图可以查看虚拟用户负载对执行时间的总体影响,对分析具有渐变负载的测试场景比较有用。
    7、Transaction Response Time(Percentile)(事务响应时间(百分比))
    “事务响应时间(百分比)”是根据测试结果进行分析而得到的综合分析图,也就是工具通过一些统计分析方法间接得到的图表。通过它可以分析在给定事务响应时间范围内能执行的事务百分比。
    8、Transaction Response Time(Distribution)(事务响应时间(分布))
    “事务响应时间(分布)”显示在场景运行过程中,事务执行所用时间的分布,通过它可以了解测试过程中不同响应时间的事务数量。如果系统预先定义了相关事务可以接受的最小和最大事务响应时间,则可以使用此图确定服务器性能是否在可以接受的范围内。

    Web Resources(Web资源分析)
    Web资源分析是从服务器入手对Web服务器的性能分析。
    1、Hits per Second(每秒点击次数)
    “每秒点击次数”,即使运行场景过程中虚拟用户每秒向Web服务器提交的HTTP请求数。
    通过它可以评估虚拟用户产生的负载量,如将其和“平均事务响应时间”图比较,可以查看点击次数对事务性能产生的影响。通过对查看“每秒点击次数”,可以判断系统是否稳定。系统点击率下降通常表明服务器的响应速度在变慢,需进一步分析,发现系统瓶颈所在。
    2、Throughput(吞吐率)
    “吞吐率”显示的是场景运行过程中服务器的每秒的吞吐量。其度量单位是字节,表示虚拟用在任何给定的每一秒从服务器获得的数据量。
    可以依据服务器的吞吐量来评估虚拟用户产生的负载量,以及看出服务器在流量方面的处理能力以及是否存在瓶颈。
    “吞吐率”图和“点击率”图的区别:
    “吞吐率”图,是每秒服务器处理的HTTP申请数。
    “点击率”图,是客户端每秒从服务器获得的总数据量。
    3、HTTP Status Code Summary(HTTP状态代码概要)
    “HTTP状态代码概要”显示场景或会话步骤过程中从Web服务器返回的HTTP状态代码数,该图按照代码分组。HTTP状态代码表示HTTP请求的状态。
    4、HTTP Responses per Second(每秒HTTP响应数)
    “每秒HTTP响应数”是显示运行场景过程中每秒从Web服务器返回的不同HTTP状态代码的数量,还能返回
    其它各类状态码的信息,通过分析状态码,可以判断服务器在压力下的运行情况,也可以通过对图中显示的结果进行分组,进而定位生成错误的代码脚本。
    5、Pages Downloader per Second(每秒下载页面数)
    “每秒下载页面数”显示场景或会话步骤运行的每一秒内从服务器下载的网页数。使用此图可依据下载的页数来计算Vuser生成的负载量。
    和吞吐量图一样,每秒下载页面数图标是Vuser在给定的任一秒内从服务器接收到的数据量。但是吞吐量考虑的各个资源极其大小(例,每个GIF文件的大小、每个网页的大小)。而每秒下载页面数只考虑页面数。
    注:要查看每秒下载页数图,必须在R-T-S那里设置“每秒页面数(仅HTML模式)”。
    6、Retries per Second(每秒重试次数)
    “每秒重试次数”显示场景或会话步骤运行的每一秒内服务器尝试的连接次数。
    在下列情况将重试服务器连接:
    A、初始连接未经授权
    B、要求代理服务器身份验证
    C、服务器关闭了初始连接
    D、初始连接无法连接到服务器
    E、服务器最初无法解析负载生成器的IP地址
    7、Retries Summary(重试次数概要)
    “重试次数概要”显示场景或会话步骤运行过程中服务器尝试的连接次数,它按照重试原因分组。将此图与每秒重试次数图一起使用可以确定场景或会话步骤运行过程中服务器在哪个时间点进行了重试。
    8、Connections(连接数)
    “连接数”显示场景或会话步骤运行过程中每个时间点打开的TCP/IP连接数。
    借助此图,可以知道何时需要添加
    其他连接。
    例:当连接数到达稳定状态而事务响应时间迅速增大时,添加连接可以使性能得到极大提高(事务响应时间将降低)。
    9、Connections Per Second(每秒连接数)
    “每秒连接数”显示方案在运行过程中每秒建立的TCP/IP连接数。
    理想情况下,很多HTTP请求都应该使用同一连接,而不是每个请求都新打开一个连接。通过每秒连接数图可以看出服务器的处理情况,就表明服务器的性能在逐渐下降。
    10、SSLs Per Second(每秒SSL连接数)
    “每秒SSL连接数”显示场景或会话步骤运行的每一秒内打开的新的以及重新使用的SSL连接数。当对安全服务器打开TCP/IP连接后,浏览器将打开SSL连接。

    Web Page Breakdown(网页元素细分)
    “网页元素细分”主要用来评估页面内容是否影响事务的响应时间,通过它可以深入地分析网站上那些下载很慢的图形或中断的连接等有问题的
    元素。
    1、Web Page Breakdown(页面分解总图)
    “页面分解”显示某一具体事务在测试过程的响应情况,进而分析相关的事务运行是否正常。
    “页面分解”图可以按下面四种方式进行进一步细分:
    1)、Download Time Breaddown(下载时间细分)
    “下载时间细分”图显示网页中不同元素的下载时间,同时还可按照下载过程把时间进行分解,用不同的颜色来显示DNS解析时间、建立连接时间、第一次缓冲时间等各自所占比例。
    2)、Component Breakdown(Over Time)(组件细分(随时间变化))
    “组件细分”图显示选定网页的页面组件随时间变化的细分图。通过该图可以很容易的看出哪些元素在测试过程中下载时间不稳定。该图特别适用于需要在客户端下载控件较多的页面,通过分析控件的响应时间,很容易就能发现那些控件不稳定或者比较耗时。
    3)、Download Time Breakdown(Over Time)(下载时间细分(随时间变化))
    “下载时间细分(随时间变化)” 图显示选定网页的页面元素下载时间细分(随时间变化)情况,它非常清晰地显示了页面各个元素在压力测试过程中的下载情况。
    “下载时间细分”图显示的是整个测试过程页面元素响应的时间统计分析结果,“下载时间细分(随时间变化)”显示的事场景运行过程中每一秒内页面元素响应时间的统计结果,两者分别从宏观和微观角度来分析页面元素的下载时间。
    4)、Time to First Buffer Breakdown(Over Time)(第一次缓冲时间细分(随时间变化))
    “第一次缓冲时间细分(随时间变化)”图显示成功收到从Web服务器返回的第一次缓冲之前的这段时间,场景或会话步骤运行的每一秒中每个网页组件的服务器时间和网络时间(以秒为单位)。可以使用该图确定场景或会话步骤运行期间服务器或网络出现问题的时间。
    First Buffer Time:是指客户端与服务器端建立连接后,从服务器发送第一个数据包开始计时,数据经过网络传送到客户端,到浏览器接收到第一个缓冲所用的时间。
    2、Page Component Breakdown(页面组件细分)
    “页面组件细分”图显示每个网页及其组件的平均下载时间(以秒为单位)。可以根据下载组件所用的平均秒数对图列进行排序,通过它有助于隔离有问题的组件。
    3、Page Component Breakdown(Over Time)(页面组件分解(随时间变化))
    “页面组件分解(随时间变化)”图显示在方案运行期间的每一秒内每个网页及其组件的平均响应时间 (以秒为单位)。
    4、Page Download Time Breakdown(页面下载时间细分)
    “页面下载时间细分”图显示每个页面组件下载时间的细分,可以根据它确定在网页下载期间事务响应时间缓慢是由网络错误引起还是由服务器错误引起。
    “页面下载时间细分”图根据DNS解析时间、连接时间、第一次缓冲时间、SSL握手时间、接收时间、FTP验证时间、客户端时间和错误时间来对每个组件的下载过程进行细分。
    5、Page Download Time Breakdown(Over Time)(页面下载时间细分(随时间变化))
    “页面下载时间细分(随时间变化)”图显示方案运行期间,每一秒内每个页面组件下载时间的细分。使用此图可以确定网络或服务器在方案执行期间哪一时间点发生了问题。
    “页面组件细分(随时间变化)”图和“页面下载时间细分(随时间变化)”图通常结合起来进行分析:首先确定有问题的组件,然后分析它们的下载过程,进而定位原因在哪里。
    6、Time to First Buffer Breakdown(第一次缓冲时间细分)
    “第一次缓冲时间细分”图显示成功收到从Web服务器返回的第一次缓冲之前的这一段时间内的每个页面组件的相关服务器/网路时间。如果组件的下载时间很长,则可以使用此图确定产生的问题与服务器有关还是与网络有关。
    网络时间:定义为第一个HTTP请求那一刻开始,直到确认为止所经过的平均时间。
    服务器时间:定义为从收到初始HTTP请求确认开始,直到成功收到来自Web服务器的一次缓冲为止所经过的平均时间。
    7、Time to First Buffer Breakdown(Over Time)(第一次缓冲时间细分(随时间变化))
    “第一次缓冲时间细分(随时间变化)”图显示成功收到从Web服务器返回的第一个缓冲之前的这段时间内,场景运行的每一秒中每个网页组件的服务器时间和网络时间。可以使用此图确定场景运行期间服务器或网络出现问题的时间点。
    8、Downloader Component Size(KB)(已下载组件大小)
    “已下载组件大小”图显示每个已经下载的网页组建的大小。通过它可以直接看出哪些组件比较大并需要进一步进行优化以提高性能。
  • 转载:性能测试结果分析

    2008-11-26 14:53:23

    分析原则:

    • 具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)

    • 查找瓶颈时按以下顺序,由易到难。

        服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)

    注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。

    • 分段排除法 很有效

    分析的信息来源:

    1 根据场景运行过程中的错误提示信息

    2 根据测试结果收集到的监控指标数据

    一.错误提示分析

    分析实例:

    1 Error: Failed to connect to server payment.baihe.com: [10060] Connection

    Error: timed out Error: Server user.baihe.com has shut down the connection prematurely

    分析:

    A、应用服务死掉。

    (小用户时:程序上的问题。程序上处理数据库的问题)

    B、应用服务没有死

    (应用服务参数设置问题)

        例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25

    C、数据库的连接

    (1、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关))

    2 Error: Page download timeout (120 seconds) has expired

    分析:可能是以下原因造成

    A、应用服务参数设置太大导致服务器的瓶颈

    B、页面中图片太多

    C、在程序处理表的时候检查字段太大多

    二.监控指标数据分析

    1.最大并发用户数:

    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。

        在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。

        如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。

    2.业务操作响应时间:

        • 分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图,可以确定在方案执行期间响应时间过长的事务。

    • 细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?

    • 如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用“网络监视器”图确定导致性能瓶颈的网络问题

    2-5-10原则:简单说,就是当用户能够在2秒以内得到响应时,会感觉系统的响应很快;当用户在2-5秒之间得到响应时,会感觉系统的响应速度还可以;当用户在5-10秒以内得到响应时,会感觉系统的响应速度很慢,但是还可以接受;而当用户在超过10秒后仍然无法得到响应时,会感觉系统糟透了,或者认为系统已经失去响应,而选择离开这个Web站点,或者发起第二次请求

    3.服务器资源监控指标:

    内存:

    1 UNIX资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。

    2 Windows资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。

    内存资源成为系统性能的瓶颈的征兆:

    很高的换页率(high pageout rate);

    进程进入不活动状态;

    交换区所有磁盘的活动次数可高;

    可高的全局系统CPU利用率

    内存不够出错(out of memory errors)

    处理器:

    1 UNIX资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是80-85% 

    合理使用的范围在60%70%

    2 Windows资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。

    CPU资源成为系统性能的瓶颈的征兆

    很慢的响应时间(slow response time) 

    CPU空闲时间为零(zero percent idle CPU) 

    过高的用户占用CPU时间(high percent user CPU) 

    过高的系统占用CPU时间(high percent system CPU) 

    长时间的有很长的运行进程队列(large run queue size sustained over time)

    磁盘I/O

    1 UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。

    2 Windows资源监控中,如果 Disk TimeAvg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。

    I/O资源成为系统性能的瓶颈的征兆 :

    过高的磁盘利用率(high disk utilization) 

    太长的磁盘等待队列(large disk queue length) 

    等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O) 

    太高的物理I/O速率:large physical I/O rate(not sufficient in itself) 

    过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself)) 

    太长的运行进程队列,但CPU却空闲(large run queue with idle CPU)

    4.数据库服务器:

    SQL Server数据库:

    1 SQLServer资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。

    2 如果Full Scans/sec(全表扫描/秒)计数器显示的值比12高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。 

    3 Number of Deadlocks/sec(死锁的数量/):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0

    4 Lock Requests/sec(锁请求/),通过优化查询来减少读取次数,可以减少该计数器的值。

    Oracle数据库:

    1 如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。

    2 如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。

    3 如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。

    4 如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序 。

    本文转载http://redforce.blog.com.cn/archives/2007/2482462.shtml

  • Loadrunner中的Browser Emulation选项分析

    2008-11-17 14:28:08

     

    首先说一下,各个选项的含义:
    Check for newer versions of stored pages every visit to the page选项
    该设置将指示浏览器检查指定 URL 的较新(与存储在缓存中的 URL 相比)版本。启用该选项时,VuGen 将向 HTTP 标头中添加“If-modified-since”属性。此选项将打开页面的最新版本,但将在场景或会话执行期间生成更大的流量。默认情况下,浏览器不检查较新的资源,因此禁用该选项。配置该选项以匹配要模拟的浏览器中的设置。
    Download non-HTML resources选项
    该选项指示 Vuser 在回放期间访问网页时加载图形图像。其中包括同页面一起录制的图形图像,还包括未明确同页面一起录制的图形图像。当实际用户访问网页时,需要等待图像加载。因此,如果尝试测试整个系统(包括终端用户时间),请启用该选项(默认情况下启用)。要提高性能并且不模拟实际用户,请禁用该选项。
    注意:如果在图像检查中遇到了差异,请禁用该选项,因为每次访问网页时,一些图像会随之改变(例如,广告横幅)。
    Simulate a new user on each iteration选项
    指示 VuGen 将各个迭代之间的所有 HTTP 上下文重置为 init 部分结束时相应的状态。使用该设置,Vuser 可以更准确地模拟开始浏览会话的新用户。它将删除所有 Cookie,关闭所有 TCP 连接(包括 Keep-Alive 连接),清除模拟浏览器的缓存,重置 HTML 帧层次结构(帧编号将从 1 开始)并清除用户名和密码。默认情况下启用该选项。
    Clear cache on each iteration选项
    每次迭代时清除浏览器缓存,以模拟第一次访问网页的用户。清除该复选框可以禁用此选项并允许 Vuser 使用浏览器缓存中存储的信息,模拟近期访问过该网页的用户。

    再来说说,我的想法:

    性能测试是一门综合性的技术,它对测试人员要求很高,不仅仅需要了解性能测试工具的应用,而且还需要你了解操作系统、数据库、应用软件等多方面的知识。从这里我们也可以看到针对lr的不同参数的设置,而引起了测试数据的不同。lr的设置对应着IE的一些相关设置。这里就表现出了我们不仅仅要熟悉lr,还要深入了解lr和IE的对应关系。相信如果我们了解并应用好这些设置以后,我们在用户现场、产品入围等多种情况下,一定会取得您意想不到的惊喜!


    我们可以看到不同的选项对服务器所产生的问题负载是不同的,负载主要产生在连接数和下载数据包的大小的不同。我们已经明确了解到了不同的选择对服务器可能导致的影响,那么我们怎样将它运用到实际的性能测试场景中去呢,我对此也经常感觉迷惑!从我这边来往往有几种组合策略来处理:
    第一:最轻松的策略:下载所有的资源、去产生最大可能的连接数去和服务器交互。
    (我尝试过,我们心中总有这么一个概念:系统如果最大的负载都能承受下去了,那么现实过程中有着缓存的机制,那么这个性能肯定能过关说句实在话,如果这样做多了,良心会不安的!呵呵!开发知道了会对我们大声指责的!
    第二:模拟。实际性能测试本身就是在模拟过程,模拟的过程越精确,那么我们的性能测试结果越准确。在性能测试中一共有三类模拟的过程,而这个我把它归在“操作行为的模拟”这一类上。我们在回头看LoadRunner的这几个设置选项,这些选项我把它分了两类的模拟设置:IE行为的模拟以及程序行为模拟。
    IE行为的模拟(对应tacy里面介绍的ABCD):IE可以设置不同的策略来进行cache资源或者数据,那么我们回到实际用户操作中来,用户会按照什么策略来设置IE这些选项呢?聪明的用户肯定会利用浏览器的cache来加快运行速度,但是从我们实际调研过程中呢,感觉大多数用户基本上都会采用浏览器的本身的设置,不会做过得的变动。除非开发程序自动对这个进行限制或者提醒。所以这个选项我大多采用浏览器的默认设置或者程序操作说明书的要求去设定它!但是也会考虑新用户以及老用户的比例来做不同的设置策略.
    程序行为的模拟:有些程序在javascrīpt中设置把cache清除,要求每次操作必须重新建立连接,我们将采取这种策略去模拟它,所以这个行为的模拟我们往往会看程序设定的情况来设置
    在这个设置中,我感觉LR有一个不太好的地方,如果我设置新用户(以及文件保留过期的用户)的操作以及老用户的设置这些选项时,我不得不把同样的脚本在controller放两个,然后设置不同的run time setting选项来模拟现实情况,这一点Webload好像就比它强一点!

  • Loadrunner中参数的设置

    2008-11-05 14:33:39

    做负载或者压力测试时,很多人选择使用了Loadrunner测试工具。该工具的基本流程是先将用户的实际操作录制成脚本,然后产生数千个虚拟用户运行脚本(虚拟用户可以分布在局域网中不同的PC机上),最后生成相关的报告以及分析图。但是在录制脚本的过程中会遇到很多实际的问题,比如不同的用户有不同的使用数据,这就牵涉到参数的设置问题。本文就Loadrunner中参数的设置进行说明,希望对大家有所帮助。
    在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本。如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询、提交等等),那么你必须用参数值取代录制的数值。这个过程称为参数化脚本。
    本文主要包括如下内容:理解参数的局限性、建立参数、定义参数的属性、理解参数的类型、为局部数据类型设置参数的属性、为数据文件设置参数的属性、从已经存在的数据库中引入数据。
    除了GUI,以下的内容适合于各种类型的用户脚本。

    一、关于参数的定义
    在你录制程序运行的过程中,脚本生成器自动生成由函数组成的用户脚本。函数中参数的值就是在录制过程中输入的实际值。
    例如,你录制了一个Web应用程序的脚本。脚本生成器生成了一个声明,该声明搜索名称为“UNIX”的图书的数据库。当你用多个虚拟用户和迭代回放脚本时,也许你不想重复使用相同的值“UNIX”。那么,你就可以用参数来取代这个常量。结果就是你可以用指定的数据源的数值来取代参数值。数据源可以是一个文件,也可以是内部产生的变量。
    用参数表示用户的脚本有两个优点:① 可以使脚本的长度变短。② 可以使用不同的数值来测试你的脚本。例如,如果你企图搜索不同名称的图书,你仅仅需要写提交函数一次。在回放的过程中,你可以使用不同的参数值,而不只搜索一个特定名称的值。
    参数化包含以下两项任务:① 在脚本中用参数取代常量值。② 设置参数的属性以及数据源。
    参数化仅可以用于一个函数中的参量。你不能用参数表示非函数参数的字符串。另外,不是所有的函数都可以参数化的。

    二、参数的创建
    可以指定名称和类型来创建参数。不存在对脚本中参数个数的限制。在Web程序的用户脚本中,你可以使用如下过程在基于文本的脚本视图中创建参数。或者,也可以在基于图标的树形视图中创建参数。
    在基于文本的脚本视图中创建一个参数:
    1、 将光标定位在要参数化的字符上,点击右键。打开弹出菜单。
    2、 在弹出菜单中,选择“Replace with a Parameter”。选择或者创建参数的对话框弹出。
    3、 在“Parameter name”中输入参数的名称,或者选择一个在参数列表中已经存在的参数。
    4、 在“Parameter type”下拉列表中选择参数类型。
    5、 点击“OK”,关闭该对话框。脚本生成器便会用参数中的值来取代脚本中被参数化的字符,参数用一对“{}”括住。
    注意:在参数化CORBA或者General-Java 用户脚本的时候,必须参数化整个字符串,而不是其中的部分。另外注意:除了Web或者WAP,缺省的参数括号对于任何脚本都是 “{}”。你可以在“General Options”对话框中的“Parameterization”标签(Tools>General Options)中定义参数括号种类。
    6、 用同样的参数替换字符的其余情况,选中参数,点击右键,弹出菜单。从弹出的菜单中,选择“Replace More Occurrences”。搜索和替换对话框弹出。“Find What”中显示了你企图替换的值。“Replace With”中显示了括号中参数的名称。选择适当的检验框来匹配整个字符或者大小写。如果要搜索规则的表达式(.,!,?等等),选中“Regular Expression”检验框,然后点击“Replace”或者“Replace All”。
    注意:小心使用“Replace All”,尤其替换数字字符串的时候。脚本生成器将会替换字符出现的所有情况。
    7、 如果想用以前定义过的参数来替换常量字符串的话,选中该字符串,点击右键,然后选择“Use Existing Parameter”,子菜单“Use Existing Parameters”弹出。从子菜单“Use Existing Parameters”选择参数,或者用“Select from Parameter List”来打开参数列表对话框。
    注意:如果用以前定义过的参数来替换常量字符串的话,那么,使用“Parameter List”非常方便。同时,还可以查看和修改该参数的属性。
    8、 对于已经用参数替换过的地方,如果想取回原来的值,那么,就在参数上点击右键,然后选择“Restore Original value”。
    在Web用户脚本的树形视图中创建参数:
    1、将光标定位在企图参数化的地方,点击右键,从弹出的菜单中选择“Properties”。则相关的属性对话框打开。
    2、点击在要参数化的参量的旁边的“ABC”形状的图标。“Select or Create Parameter”对话框打开。
    3、在“Parameter name”中输入参数的名称,或者从列表中选择一个已经存在的参数。
    4、在“Parameter type”中输入参数的类型。
    5、点击“OK”关闭该对话框。用户脚本生成器会用参数来替换最初的字符串常量,并用一个表格形状的图标替换“ABC”形状的图标。
    6、要恢复参数化以前的值,点击图标,然后从弹出的菜单中选择“Undo Parameter”,则以前的值便会重现。

    三、定义参数的属性
    创建参数完成后,就可以定义其属性了。参数的属性定义就是定义在脚本执行过程中,参数使用的数据源。在Web用户脚本中,你既可以在基于文本的脚本视图中定义参数属性,也可以在基于图标的树形视图中定义参数属性。下面的过程将教你如何在基于本文的脚本视图中定义参数属性。
    在基于文本的脚本视图中定义参数属性步骤:
    1、 在参数上点击右键,有菜单弹出。
    2、 在弹出的菜单中,选择“Parameter Properties”。参数属性对话框打开,显示和当前参数类型相关的属性。
    3、 输入参数的属性值。
    4、 点击“Close”关闭参数属性对话框。
    在Web用户脚本的树形视图中定义参数的属性:
    1、 将关标定位在参数上,然后点击右键,选择“Properties”。属性对话框打开。
    2、 点击要定义属性的参数旁边的表格形状按钮,点击右键,选择“Parameter Properties”。参数属性对话框打开,和参数类型相关的属性显示出来。
    3、 输入参数的属性。
    4、 点击“Close”关闭参数属性对话框。
    使用参数列表:  使用参数列表可以在任意时刻查看所有的参数,创建新的参数、删除参数,或者修改已经存在参数的属性。
    1、 点击参数列表按钮或者用“Vuser>Parameter List”。参数列表对话框打开。
    2、 要创建新的参数,点击“New”按钮。新的参数则被添加在参数树中,该参数有一个临时的名字,你可以给它重新命名,然后回车。设置参数的类型和属性,点击“OK”,关闭参数列表对话框。
    注意:不要将一个参数命名为“unique”,因为这个名称是用户脚本生成器本身的。用户脚本生成器创建新的参数,但是不会自动用该参数在脚本中替换任意选中的字符串。
    3、 要删除已有的参数,那么,要先从参数树中选择该参数,点击“Delete”,然后确认你的行为即可。
    4、 要修改已有参数,那么,要先从参数树中选择该参数,然后编辑参数的类型和属性。

     

    四、理解参数的类型  在你定义参数属性的时候,要指定参数值的数据源。你可以指定下列数据源类型的任何一种:
    Internal Data―― 虚拟用户内部产生的数据。
    Data Files ――存在于文件中的数据。可能是已存在的文件或者是用脚本生成器新创建的。
    User-Defined Functions―― 调用外部DLL函数生成的数据  Internal Data包括以下几种:
    1、 Date/Time  Date/Time用当前的日期/时间替换参数。要指定一个Date/Time格式,你可以从菜单列表中选择格式,或者指定你自己的格式。这个格式应该和你脚本中录制的Date/Time格式保持一致。
    2、 Group Name  Group Name 用虚拟用户组名称替换参数。在创建scenario的时候,你可以指定虚拟用户组的名称。当从用户脚本生成器运行脚本的时候,虚拟用户组名称总是None。
    3、 Load Generator Name  Load Generator Name用脚本负载生成器的名称替换参数。负载生成器是虚拟用户在运行的计算机。
    4. Iteration Number  Iteration Number用当前的迭代数目替换参数。
    5、 Random Number  Random Number用一个随机数替换参数。通过指定最大值和最小值来设置随机数的范围。
    6、 Unique Number  Unique Number用一个唯一的数字来替换参数。你可以指定一个起始数字和一个块的大小。
    7、 Vuser ID  Vuser ID用分配给虚拟用户的ID替换参数,ID是由Loadrunner的控制器在scenario运行时生成的。如果你从脚本生成器运行脚本的话,虚拟用户的ID总是-1。

    五、数据文件  数据文件包含着脚本执行过程中虚拟用户访问的数据。局部和全局文件中都可以存储数据。可以指定现有的ASCII文件、用脚本生成器创建一个新的文件或者引入一个数据库。在参数有很多已知值的时候数据文件非常有用。数据文件中的数据是以表的形式存储的。一个文件中可以包含很多参数值。每一列包含一个参数的数据。列之间用分隔符隔开,比如说,用逗号。  对数据文件设置参数属性  如果使用文件作为参数的数据源,必须指定以下内容:文件的名称和位置、包含数据的列、文件格式,包括列的分隔符、更新方法。  如果参数的类型是“File”,打开参数属性(Parameter Properties)对话框,设置文件属性如下:
    1、 在“File path”中输入文件的位置,或者点击“Browse”指定一个已有文件的位置。缺省情况下,所有新的数据文件名都是“parameter_name.dat”,注意,已有的数据文件的后缀必须是.dat。


    2、 点击“Edit”。记事本打开,里面第一行是参数的名称,第二行是参数的初始值。使用诸如逗号之类的分隔符将列隔开。对于每一新的表行开始一行新的数据。  注意:在没有启动记事本的情况下如果想添加列,就在参数属性对话框中点击“Add Col”,那么“Add new column”对话框就会弹出。输入新列的名称,点击“OK”。脚本生成器就会添加该列到表中,并显示该列的初始值。


    3、 在“Select Column”部分,指明包含当前参数数据的列。你可以指定列名或者列号。列号是包含你所需要数据的列的索引。列名显示在每列的第一行(row 0)。


    4、 在“Column delimiter”中输入列分隔符,你可以指定逗号、空格符等等。


    5、 在“First data line”中,在脚本执行的时候选择第一行数据使用。列标题是第0行。若从列标题后面的第一行开始的话,那就在“First data line”中输入1。如果没有列标题,就输入0。


    6、 在“Select next row”中输入更新方法,以说明虚拟用户在脚本执行的过程中如何选择表中的数据。方法可以是:连续的、随机的、唯一的、或者与其它参数表的相同行。
    6.1、 顺序(Sequential):该方法顺序地给虚拟用户分配参数值。如果正在运行的虚拟用户访问数据表的时候,它会取到下一行中可用的数据。
    6.2、 随机(Random):该方法在每次迭代的时候会从数据表中取随机数
    6.3、 使用种子取随机顺序(Use Random Sequence with Seed):如果从Loadrunner的控制器来运行scenario,你可以指定一个种子数值用于随机顺序。每一个种子数值在测试执行的时候代表了一个随机数的顺序。无论你何时使用这个种子数值,在scenario中同样的数据顺序就被分配给虚拟用户。如果在测试执行的时候发现了一个问题并且企图使用同样的随机数序列来重复测试,那么,你就可以启动这个功能(可选项)。
    6.4、 唯一(Unique):Unique方法分配一个唯一的有顺序的值给每个虚拟用户的参数。
    6.5 、与以前定义的参数取同一行(Same Line As ):该方法从和以前定义过的参数中的同样的一行分配数据。你必须指定包含有该数据的列。在下拉列表中会出现定义过的所有参数列表。注意:至少其中的一个参数必须是Sequential、Random或者Unique。
    如果数据表中有三列,三个参数定义在列表中:id1,name1和title1,如下:。
    ID Name Title
    132 Kim Manager
    187 Cassie Engineer
    189 Jane VP
    对于参数id1,你可以指示虚拟用户使用Random方法,而为参数name1和title1就可以指定方法“Same Line as id1”。所以,一旦ID“132”被使用,那么,姓名(Name)“Kim”和职位(Title)“Manager”同时被使用。


    7、Updta value on数据的更新方法
    7.1、Each iteration――每次反复都要取新值。
    7.2、Each occurrence――只要发现该参数就要重新取值。
    7.3、Once――在所有的反复中都使用同一个值


    8、When out of values超出范围:(选择数据为unique时才可用到)
    8.1、Abort Vuser――中止
    8.2、Continue in a cyclic manner――继续循环取值
    8.3、Continue with last value――取最后一个值


    9、Allocate Vuser values in the Controller在控制器中分配值:(选择数据为unique时才可用到)

  • LR性能分析图解释--转

    2008-10-17 14:47:32

    Transactions(用户事务分析)
    用户事务分析是站在用户角度进行的基础性能分析。

    1、Transation Sunmmary(事务综述)
    对事务进行综合分析是性能分析的第一步,通过分析
    测试时间内用户事务的成功与失败情况,可以直接判断出系统是否运行正常。

    2、Average Transaciton Response Time(事务平均响应时间)
    “事务平均响应时间”显示的是测试场景运行期间的每一秒内事务执行所用的平均时间,通过它可以分析测试场景运行期间应用系统的性能走向。
    例:随着测试时间的变化,系统处理事务的速度开始逐渐变慢,这说明应用系统随着投产时间的变化,整体性能将会有下降的趋势。

    3、Transactions per Second(每秒通过事务数/TPS)
    “每秒通过事务数/TPS”显示在场景运行的每一秒钟,每个事务通过、失败以及停止的数量,使考查系统性能的一个重要参数。通过它可以确定系统在任何给定时刻的时间事务负载。分析TPS主要是看曲线的性能走向。
    将它与平均事务响应时间进行对比,可以分析事务数目对执行时间的影响。
    例:当压力加大时,点击率/TPS曲线如果变化缓慢或者有平坦的趋势,很有可能是服务器开始出现瓶颈。

    4、Total Transactions per Second(每秒通过事务总数)
    “每秒通过事务总数”显示在场景运行时,在每一秒内通过的事务总数、失败的事务总署以及停止的事务总数。

    5、Transaction Performance Sunmmary(事务性能摘要)
    “事务性能摘要”显示方案中所有事务的最小、最大和平均执行时间,可以直接判断响应时间是否符合用户的要求。
    重点关注事务的平均和最大执行时间,如果其范围不在用户可以接受的时间范围内,需要进行原因分析。

    6、Transaction Response Time Under Load(事务响应时间与负载)
    “事务响应时间与负载”是“正在运行的虚拟用户”图和“平均响应事务时间”图的组合,通过它可以看出在任一时间点事务响应时间与用户数目的关系,从而掌握系统在用户并发方面的性能数据,为扩展用户系统提供参考。此图可以查看虚拟用户负载对执行时间的总体影响,对分析具有渐变负载的测试场景比较有用。

    7、Transaction Response Time(Percentile)(事务响应时间(百分比))
    “事务响应时间(百分比)”是根据测试结果进行分析而得到的综合分析图,也就是工具通过一些统计分析方法间接得到的图表。通过它可以分析在给定事务响应时间范围内能执行的事务百分比。

    8、Transaction Response Time(Distribution)(事务响应时间(分布))
    “事务响应时间(分布)”显示在场景运行过程中,事务执行所用时间的分布,通过它可以了解测试过程中不同响应时间的事务数量。如果系统预先定义了相关事务可以接受的最小和最大事务响应时间,则可以使用此图确定服务器性能是否在可以接受的范围内。

     

    Web Resources(Web资源分析)
    Web资源分析是从服务器入手对Web服务器的性能分析。

    1、Hits per Second(每秒点击次数)
    “每秒点击次数”,即使运行场景过程中虚拟用户每秒向Web服务器提交的HTTP请求数。
    通过它可以评估虚拟用户产生的负载量,如将其和“平均事务响应时间”图比较,可以查看点击次数对事务性能产生的影响。通过对查看“每秒点击次数”,可以判断系统是否稳定。系统点击率下降通常表明服务器的响应速度在变慢,需进一步分析,发现系统瓶颈所在。

    2、Throughput(吞吐率)
    “吞吐率”显示的是场景运行过程中服务器的每秒的吞吐量。其度量单位是字节,表示虚拟用在任何给定的每一秒从服务器获得的数据量。
    可以依据服务器的吞吐量来评估虚拟用户产生的负载量,以及看出服务器在流量方面的处理能力以及是否存在瓶颈。
    “吞吐率”图和“点击率”图的区别:
    “吞吐率”图,是每秒服务器处理的HTTP申请数。
    “点击率”图,是客户端每秒从服务器获得的总数据量。

    3、HTTP Status Code Summary(HTTP状态代码概要)
    “HTTP状态代码概要”显示场景或会话步骤过程中从Web服务器返回的HTTP状态代码数,该图按照代码分组。HTTP状态代码表示HTTP请求的状态。

    4、HTTP Responses per Second(每秒HTTP响应数)
    “每秒HTTP响应数”是显示运行场景过程中每秒从Web服务器返回的不同HTTP状态代码的数量,还能返回
    其它各类状态码的信息,通过分析状态码,可以判断服务器在压力下的运行情况,也可以通过对图中显示的结果进行分组,进而定位生成错误的代码脚本。

    5、Pages Downloader per Second(每秒下载页面数)
    “每秒下载页面数”显示场景或会话步骤运行的每一秒内从服务器下载的网页数。使用此图可依据下载的页数来计算Vuser生成的负载量。
    和吞吐量图一样,每秒下载页面数图标是Vuser在给定的任一秒内从服务器接收到的数据量。但是吞吐量考虑的各个资源极其大小(例,每个GIF文件的大小、每个网页的大小)。而每秒下载页面数只考虑页面数。
    注:要查看每秒下载页数图,必须在R-T-S那里设置“每秒页面数(仅HTML模式)”。

    6、Retries per Second(每秒重试次数)
    “每秒重试次数”显示场景或会话步骤运行的每一秒内服务器尝试的连接次数。
    在下列情况将重试服务器连接:
    A、初始连接未经授权
    B、要求代理服务器身份验证
    C、服务器关闭了初始连接
    D、初始连接无法连接到服务器
    E、服务器最初无法解析负载生成器的IP地址

    7、Retries Summary(重试次数概要)
    “重试次数概要”显示场景或会话步骤运行过程中服务器尝试的连接次数,它按照重试原因分组。将此图与每秒重试次数图一起使用可以确定场景或会话步骤运行过程中服务器在哪个时间点进行了重试。

    8、Connections(连接数)
    “连接数”显示场景或会话步骤运行过程中每个时间点打开的TCP/IP连接数。
    借助此图,可以知道何时需要添加
    其他连接。
    例:当连接数到达稳定状态而事务响应时间迅速增大时,添加连接可以使性能得到极大提高(事务响应时间将降低)。

    9、Connections Per Second(每秒连接数)
    “每秒连接数”显示方案在运行过程中每秒建立的TCP/IP连接数。
    理想情况下,很多HTTP请求都应该使用同一连接,而不是每个请求都新打开一个连接。通过每秒连接数图可以看出服务器的处理情况,就表明服务器的性能在逐渐下降。

    10、SSLs Per Second(每秒SSL连接数)
    “每秒SSL连接数”显示场景或会话步骤运行的每一秒内打开的新的以及重新使用的SSL连接数。当对安全服务器打开TCP/IP连接后,浏览器将打开SSL连接。


    Web Page Breakdown(网页元素细分)
    “网页元素细分”主要用来评估页面内容是否影响事务的响应时间,通过它可以深入地分析网站上那些下载很慢的图形或中断的连接等有问题的
    元素。

    1、Web Page Breakdown(页面分解总图)
    “页面分解”显示某一具体事务在测试过程的响应情况,进而分析相关的事务运行是否正常。
    “页面分解”图可以按下面四种方式进行进一步细分:
    1)、Download Time Breaddown(下载时间细分)
    “下载时间细分”图显示网页中不同元素的下载时间,同时还可按照下载过程把时间进行分解,用不同的颜色来显示DNS解析时间、建立连接时间、第一次缓冲时间等各自所占比例。
    2)、Component Breakdown(Over Time)(组件细分(随时间变化))
    “组件细分”图显示选定网页的页面组件随时间变化的细分图。通过该图可以很容易的看出哪些元素在测试过程中下载时间不稳定。该图特别适用于需要在客户端下载控件较多的页面,通过分析控件的响应时间,很容易就能发现那些控件不稳定或者比较耗时。
    3)、Download Time Breakdown(Over Time)(下载时间细分(随时间变化))
    “下载时间细分(随时间变化)” 图显示选定网页的页面元素下载时间细分(随时间变化)情况,它非常清晰地显示了页面各个元素在压力测试过程中的下载情况。
    “下载时间细分”图显示的是整个测试过程页面元素响应的时间统计分析结果,“下载时间细分(随时间变化)”显示的事场景运行过程中每一秒内页面元素响应时间的统计结果,两者分别从宏观和微观角度来分析页面元素的下载时间。
    4)、Time to First Buffer Breakdown(Over Time)(第一次缓冲时间细分(随时间变化))
    “第一次缓冲时间细分(随时间变化)”图显示成功收到从Web服务器返回的第一次缓冲之前的这段时间,场景或会话步骤运行的每一秒中每个网页组件的服务器时间和网络时间(以秒为单位)。可以使用该图确定场景或会话步骤运行期间服务器或网络出现问题的时间。
    First Buffer Time:是指客户端与服务器端建立连接后,从服务器发送第一个数据包开始计时,数据经过网络传送到客户端,到浏览器接收到第一个缓冲所用的时间。

    2、Page Component Breakdown(页面组件细分)
    “页面组件细分”图显示每个网页及其组件的平均下载时间(以秒为单位)。可以根据下载组件所用的平均秒数对图列进行排序,通过它有助于隔离有问题的组件。

    3、Page Component Breakdown(Over Time)(页面组件分解(随时间变化))
    “页面组件分解(随时间变化)”图显示在方案运行期间的每一秒内每个网页及其组件的平均响应时间 (以秒为单位)。

    4、Page Download Time Breakdown(页面下载时间细分)
    “页面下载时间细分”图显示每个页面组件下载时间的细分,可以根据它确定在网页下载期间事务响应时间缓慢是由网络错误引起还是由服务器错误引起。
    “页面下载时间细分”图根据DNS解析时间、连接时间、第一次缓冲时间、SSL握手时间、接收时间、FTP验证时间、客户端时间和错误时间来对每个组件的下载过程进行细分。

    5、Page Download Time Breakdown(Over Time)(页面下载时间细分(随时间变化))
    “页面下载时间细分(随时间变化)”图显示方案运行期间,每一秒内每个页面组件下载时间的细分。使用此图可以确定网络或服务器在方案执行期间哪一时间点发生了问题。
    “页面组件细分(随时间变化)”图和“页面下载时间细分(随时间变化)”图通常结合起来进行分析:首先确定有问题的组件,然后分析它们的下载过程,进而定位原因在哪里。

    6、Time to First Buffer Breakdown(第一次缓冲时间细分)
    “第一次缓冲时间细分”图显示成功收到从Web服务器返回的第一次缓冲之前的这一段时间内的每个页面组件的相关服务器/网路时间。如果组件的下载时间很长,则可以使用此图确定产生的问题与服务器有关还是与网络有关。
    网络时间:定义为第一个HTTP请求那一刻开始,直到确认为止所经过的平均时间。
    服务器时间:定义为从收到初始HTTP请求确认开始,直到成功收到来自Web服务器的一次缓冲为止所经过的平均时间。

    7、Time to First Buffer Breakdown(Over Time)(第一次缓冲时间细分(随时间变化))
    “第一次缓冲时间细分(随时间变化)”图显示成功收到从Web服务器返回的第一个缓冲之前的这段时间内,场景运行的每一秒中每个网页组件的服务器时间和网络时间。可以使用此图确定场景运行期间服务器或网络出现问题的时间点。

    8、Downloader Component Size(KB)(已下载组件大小)
    “已下载组件大小”图显示每个已经下载的网页组建的大小。通过它可以直接看出哪些组件比较大并需要进一步进行优化以提高性能。

  • (一)性能测试从零开始——LoadRunner入门—转载

    2008-10-15 16:55:47

    第1章 软件性能测试

            当今,计算机和软件工程发展越来越快,新的概念名词和技术手段层出不穷,可谓日新月异。在软件性能测试范畴内就有很多,诸如并发测试、压力测试、基准测试、测试场景等概念和名词,这让刚接触性能测试的新手眼花缭乱,目不暇接。但我们如果能深入软件性能测试的本质,从哲学的角度看问题,找出其内在联系,比如因果关系、形式内容关系,甚至重叠关系等,理清思路之后,那么做软件性能测试就会如庖丁解牛,游刃有余。

    1.1  什么是软件的性能

    1.1.1  软件

            计算机软件作为人类逻辑智慧的结晶,它可以模拟并替代人类的一些活动,替人“发号施令”。在计算机软件发展的短短几十年内,计算机软件以非常快的速度渗透到了人类社会的各个角落,比如现在我们在家上网,出门坐公交车刷卡,在工作中发电子邮件等,这些生活的背后都有大量的软件系统运行支持。

            同时,有关软件的概念和名词也呈爆炸性增长,从google中搜索“软件”关键词,就有135 000 000条记录;软件的方向和领域也在不断细化,比如软件架构和平台、软件工程、软件应用,还有软件开发测试等,因此我们可以判断软件的发展趋势是系统化、复杂化,这个趋势使软件能够提供越来越强大的功能,但同时也为我们理解和把握软件带来困难。

            但我们做事的原则应该是要把复杂的事情变简单,而不是更复杂,更难理解。当我们试图理解和分析一个复杂的事物的时候,最常用的方法是分而治之,就是要用一个或多个简单的概念去解释或描述这个复杂的事物,这符合我们人类的认知规律,人们对简单的概念能够理解,那么对简单进行综合和归纳,就形成了对复杂的认知。比如,我们想要让一个没有上过网的人明白什么是“电子邮件”,那就可以告诉他“通过网络发送的邮件”,当然他很有可能对“网络”也一头雾水,那么你可以继续向他解释“打鱼的网”。但在软件领域中,我们却经常搞不明白这个道理,一个刚入门有志于软件性能测试的菜鸟小心翼翼地向一个前辈高人请教什么是性能测试,前辈首先以威严的口气告诉他“性能测试是很复杂的”,然后徐徐道来“性能测试分为负载测试、压力测试、容量测试等”。到这里,我相信可怜的菜同学对性能测试已经更加糊涂了,他在请教问题之前,恐怕还能知道性能测试是测试软件性能的,在得到高手回答之后,他开始勤奋地请教google,没想到google回答他的是更多的名词概念(网上文章都是前辈仙人写的)。随着时间推移,菜同学升级成牛同学,他对性能测试名词概念烂熟于心(google功底深厚),并且牛同学又牢牢坚持与时俱进的思想,独立创新了N个性能测试概念,并开始向一群小菜粉丝们讲经布道,于是上一幕的画面和对白又开始回放,只是演员变了……这只是一个假想的故事,故事的结局就是通过“学习”,性能测试不仅没有简单,反而越来越复杂了。我们要真正掌握性能测试,那就要避免这样的事情发生,从本质上认识软件性能和软件性能测试。

            辩证唯物主义哲学认为,时间和空间是运动着的世间万物的存在形式。大到社会形态,小到个人的活动,都是在一定的空间和时间内进行的。


            因此,我们在试图把一件事情表述清楚时,通常要抓住事情的几个关键要素:时间、空间(地点)、人物(主体)、事件。比如“旅行者的一次长途旅行在两个月内从北京到西藏”,这句话中包含了关键要素,其时间是两个月,空间是北京到西藏,人物是旅行者,发生的事件是旅行者在两个月时间范围内发生空间中的转移;又如“一场足球赛”,这个名词看起来简单,但仍清楚地隐含了三个要素,即:时间,通常是90分钟(如果没有加时赛和伤停补时);空间,足球场内;人物,足球运动员,事件就是在足球规则下可能发生的事情,如进球等。

            计算机的出现是人类历史上一次伟大的革命,在哲学“物质”这个名词的外延中又多了一个新型事物——计算机软件。如果我们认识到计算机软件也是万物之一,分析其作为“物质”的性质也逃脱不了自然法则的“紧箍咒”,那么我们同样可以把软件作如下简单的理解:

            主体:程序,是人类逻辑思维的物化,表现形式为一系列指令代码。

            时间:即使计算机速度再快,任何软件程序每一段代码的运行都是需要时间的,例如从用户的感受来讲,就是程序将运行结果响应给用户的速度。

            空间:软件运行的环境,以资源的方式存在,通常是软件以间接或直接的方式占用并使用硬件资源和其他软件资源。
            硬件资源主要指运行该软件的硬件平台,有CPU、内存和存储系统等,如果软件是基于网络架构的,那么硬件还有网络硬件,如交换机、路由器等。

            软件资源包括操作系统、开发平台、中间件和数据库等,它们以库文件和API的方式提供给应用软件使用。

            事件:软件按照用户的要求运行,运行的同时必然要占用时间资源和空间资源。

            由于软件代码是人的逻辑思想的表现,所以软件在设计思想和实现方法上也有很大差异。另外,随着软件的发展,产生了各种应用领域的软件,它们之间存在着千丝万缕的关系。从层次上看,有系统软件,应用软件和介于两者之间的中间件。因此一个软件的运行牵涉的因素很多,需要从各个方面分析。

    1.1.2  软件性能的产生


            用户能够看到的是软件越来越通用,功能越来越庞大,从哲学角度上看待软件本身,其发展是一个从简单到复杂,从低级到高级,从无序到有序的过程。

            在计算机发展的初期,计算机软件对硬件有很强的依赖性,而且还没有广泛的通用性,只有少数的个人或机构才使用软件这个“奢侈品”,当时用户也没有软件性能的概念,通常为了实现软件的功能而不计一切代价。比如,1946年2月15日,世界上第一台通用电子数字计算机“埃尼阿克”(ENIAC)在美国研制成功。它当时由1.8万个电子管组成,是一台又大又笨重的机器,体重达30多吨,占地有两三间教室般大。它当时的运算速度仅为每秒5000次加法运算,在现在看来,它占用如此多的资源,又运行得如此慢,在当时却是相当了不起的成就,因为它已经实现了功能——能够做加法运算。可见初期的软件是简单的,当时用户的要求用现在的眼光来看真有点可怜巴巴,对软件的要求不高,只要能工作就OK了。

            软件诞生后,短短几十年,软件业奇迹般的高速发展,逐渐走下了高高在上的神坛,广泛应用到人类社会的各个领域,用户也不再把软件看做神秘的玩意,而是普通的商品,开始从经济学的角度来考虑软件产品,这是一个意味深长的变化。讲经济就是要运用投入产出的关系分析和指导软件工程的各种活动和环节,软件运行不能以硬件不计成本为假设,要尽可能地少占用各种硬件资源,同时,软件运行的速度也要尽可能地快,每秒5000次加法运算是根本不可想象的,也是不可能被用户接受的。这些其实就是用户的最原始的性能需求。

  • loadrunner的一些小应用整理

    2008-10-10 16:26:36

    测试过程一些问题的解决

    由于我们使用的工具是loadrunner,loadrunner自带来比较完整的帮助文档,遇到问题的时候一定要多看

    1、  用到的一些函数

    1)  Strlen:求字符串长度,一般可以用于比较获得的字符串的长度是否和所需要判断的是否一致。(这个函数中测试中模拟进度条时用到,判断是否获得到动态数据)

    例子:

        if (strlen (lr_eval_string("{wscdiff2}"))-4==0)

           {

              i=0;

            }

         else    

            {  i=i+1;   

     

            }  

     

    2)  lr_output_message:在调试窗口输出信息

    在调试的时候,可以在适当的位置可以将监控的参数值打印到调试窗口,便于调试(建议调试时候多用)。

    例子:

       lr_output_message("循环次数 is  %d",Count); 

       lr_output_message("循环体中lr_think_time的时间为:  %d",Count*5);

       lr_output_message("i 的值 is  %d",i);

     

    java脚本中的写法:lr.output_message("usercode:="+usercode);

    3)   lr_think_time:思考时间

        在操作中适当添加lr_think_time,有时候会解决一些非常头疼的问题。

    例子:

    lr_think_time(5);

     

    4)  web_reg_save_param:保存动态数据到参数。一般web脚本要看同步显示的窗口的显示结果可以获得动态数据左右边界的值是多少,这样才能准确获得动态数据。

    例子:

    web_reg_save_param("wscdiff1","LB=taskId\":\"","RB=\"",LAST);

     

    web_submit_data("getResult.action",

                  "Action=http://10.0.30.192/billing/bilcommon/getResult.action",

                  "Method=POST",

                  "RecContentType=application/json",

                  "Referer=http://10.0.30.192/billing/bilmonreport/landmass.action",

                  "Snapshot=t116.inf",

                  "Mode=HTTP",

                  ITEMDATA,

                  "Name=taskId", "Value={wscdiff1}", ENDITEM,

                  LAST);

    可以根据web_submit_data所显示的信息去确定LB=?(左边界)和RB=?(右边界)从而得到参数的动态值(注意“\”等符合的表示方法,我还没有仔细研究过 )。

     

    经验总结:

    1)  如果有一批的用户而且几个脚本同时要用到,则最好这些脚本不要用同一组用户。

    2)  要检查在脚本中,哪些操作是比较耗时的,对所要监控的操作是否有影响,如果影响则需要分离出来(如果某页面非常耗时,而只使用一次,则尽量要放到vuser_init中)。

    3)  不要屏蔽掉脚本中的图片和样式。

    4)  Java脚本有时在场景中运行时会报错,这时候要检查场景的Run-time Setting是否有多余的东西。

    5)  中java脚本中的public int init()中,一定要用

    Try{

    。。。

    }catch(Exception ex){

                 throw new RuntimeException(ex);

          }

    否则编译将不会通过。

  • 微软测试工程师面试题—转

    2008-09-28 14:46:33

    1. 你如何在pocket pc 上TEST 你的程序. 你考虑了哪些方面.

    2. 如果将你的程序的语言扩展到非英语,例如中文, 你如何
    测试.

    3. 给你一个COCAN, 你如何测试(解释说就是罐装的可口可乐).

    4. 当你的程序遇到
    BUG的时候,你选择怎样处理.

    5. 你如何isolation 你程序里的BUG.

    6. 给你一个产品有10个functionality,如果时间紧迫, 只能测其中的5个, 你如何选择.



    其它相关:

    如果别人问我这些题目,我想我会大致这样回答,各位从事
    软件测试的同志们帮我看看回答的怎么样。

    01. 为什么要在一个团队中开展软件测试
    工作

    答:软件测试在整个一个团队中占有非常重要的地位,具体来说就是测试是一个发现软件错误的过程,执行软件测试会以最少的人力和时间,系统的找到软件存在的缺陷和错误,建立起开发人员和使用者对软件的信心。

    02. 您是否了解以往所工作的企业的软件测试过程?如果了解,请试述在这个过程中都有哪些工作要做?分别由哪些不同的角色来完成这些工作?

    答:软件测试部门配合系统分析人员软件需求分析讨论,并根据需求说明书制定《项目测试计划》,编写测试用例,建立测试环境。
    软件测试人员负责软件开发部门的新产品测试及原有产品的升级测试,负责软件问题解决过程跟踪,负责软件开发文档开发工作的规范化及管理开发部门的产品文档,制作用户手册及操作手册,负责产品的上线测试,监督软件开发过程的执行,提高产品质量。

    03. 您是否了解以往所工作的企业的软件开发过程?如果了解,请试述一个完整的开发过程需要完成哪些工作?分别由哪些不同的角色来完成这些工作?(对于软件测试部分,可以简述)
    答:需求人员连同系统分析人员&测试人员开会讨论需求。系统分析人员写出需求分析说明,并连同系统分析人员&测试人员&需求人员开会讨论可行性。系统分析人员写出详细设计说明书,程式人员编码,给出系统流程图。交与测试人员,测试人员给出Bug统计表。

    04. 您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?
    答:从事过write test plan,creation of test case,进行
    功能测试性能测试,编写测试工具,文档的管理等,比较擅长与写测试用例和进行功能测试。

    05. 您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)
    答:有功能测试,性能测试,可靠性测试,安全性测试,负载测试,压力测试,安装/卸载测试,启动/停止测试,兼容性测试,互连测试,文档测试,恢复测试,回归测试,可使用性测试,容量测试。
    功能测试只对软件的功能是否满足用户需求来做测试。性能测试需要和压力和负载测试联合起来。

    06. 请试着比较一下
    黑盒测试白盒测试单元测试、集成测试、系统测试、验收测试的区别与联系。

    黑盒测试:把测试对象当成一个黑盒子,测试人员完全不考虑逻辑结构和内部特性,只依据程式的需求说明书来检查程式的功能是否满足它的功能说明。
    白盒测试:把测试对象当成一个透明的盒子,允许测试人员利用程序内部逻辑结构及相关信息,设计或选择测试用例,对程式所有逻辑路径进行测试。
    单元测试:白盒测试的一种,对软件设计中的单元模块进行测试。
    集成测试:在单元测试的基础上,对单元模块之间的连接和组装进行测试。
    系统测试:在所有都考虑的情况下,对系统进行测试。
    验收测试:第三方进行的确认软件满足需求的测试。

    07. 测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?
    答:测试计划工作是对测试工作内容的一个有效的组织和规划,能保证测试工作有效的展开。测试计划工作包括测试目标,测试范围的定义,测试方法的选择,测试进度里程碑,测试资源的有效配置和管理。
    测试计划工作也称为测试策略,主要描述测试工程的总体方法和目标,描述目前在进行那一阶段的测试(单元测试,集成测试,系统测试)以及每一阶段内进行的测试种类(功能测试,性能测试等)确定测试范围,生成测试数据等。
    其中软件计划中的测试目标最重要,他的软件测试的所需要达成的最终结果。

    08. 您认为做好测试计划工作的关键是什么?
    答:1. 明确测试的目标,增强测试计划的实用性
    2. 坚持“5W”规则,明确内容与过程,'what''why''when''where''how'
    3. 采用评审和更新机制,保证测试计划满足实际需求
    4. 分别创建测试计划与测试详细规格、测试用例

    09. 您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。
    答:有黑盒和白盒两种测试种类,黑盒有等价类划分法,边界分析法,因果图法和错误猜测法。白盒有逻辑覆盖法,循环测试路径选择,基本路径测试。
    例子:在一次输入多个条件的完整性查询中。利用等价类划分法则和边界分析法则,首先利用等价类划分法,可以一个或多个结果是OK的测试用例,然后确认多个NG的测试用例,然后利用边界值分析法,可以对结果分别是OK和NG的测试用例进行扩展和补充。

    10. 您认为做好测试用例设计工作的关键是什么?

    答:测试用例设计工作的关键是对可行的和不可行的都要考虑。
    1,输入 2,详细的操作步骤 3,预期输出 4,实际输出。

    11. 请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。

    12. 您以往的工作中是否曾开展过测试用例的评审工作?如果有,请描述测试用例评审的过程和评审的内容。

    13. 您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。

    14. 您在从事性能测试工作时,是否使用过一些测试工具?如果有,请试述该工具的工作原理,并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。
    答:有使用过
    LoadRunner,该工具能够录制测试人员的操作步骤,然后对这个操作步骤模拟出多个用户来播放出来。
    1。Visural User Genertor创建脚本,选择协议,录制操作,编辑操作。
    2。中央控制器(Controller)调度虚拟用户。创建场景,选择脚本,建立虚拟用户,设计shedual,设置ip spoofer。
    3。运行脚本。分析shedual。
    4。分析测试结果。

    15. 您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?
    答:性能测试工作的目的是检查系统是否满足在需求说明书中规定的性能,性能测试常常需要和强度测试结合起来,并常常要求同时进行软件和硬件的检测。
    性能测试主要的关注对象是响应时间,吞吐量,占用内存大小(辅助存储区),处理精度等。

    16. 在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    答:检测时间,系统环境,硬体环境,严重程度,程式版本,确认人,功能模块,问题描述,详细操作步骤,是否会重现。
    问题描述和详细操作步骤要尽可能的详细。Bug应该尽量用书面语,对与严重程度比较高的缺陷要在相同环境下在测试一遍。

    在C/S模式下,如果条件满足可以使用替换法来确认是client端的问题还是server端的问题。

  • C/S与B/S架构的区别是什么?

    2008-09-28 11:27:26

    C/S又称Client/Server或客户/服务器模式。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或   SQL   Server。客户端需要安装专用的客户端软件。  
       
      B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape   Navigator或Internet   Explorer,服务器安装Oracle、Sybase、Informix或   SQL   Server等数据库。浏览器通过Web   Server   同数据库进行数据交互。  
       
      C/S的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。缺点主要有以下几个:  
       
      只适用于局域网。而随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性。这种方式远程访问需要专门的
    技术,同时要对系统进行专门的设计来处理分布式的数据。  
       
      客户端需要安装专用的客户端软件。首先涉及到安装的工作量,其次任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护。特别是有很多分部或专卖店的情况,不是工作量的问题,而是路程的问题。还有,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。  
       
      对客户端的
    操作系统一般也会有限制。可能适应于Win98,   但不能用于win2000或Windows   XP。或者不适用于微软新的操作系统等等,更不用说Linux、Unix等。  
       
      B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。只要有一台能上网的电脑就能使用,客户端零维护。系统的扩展非常容易,只要能上网,再由系统管理员分配一个用户名和密码,就可以使用了。甚至可以在线申请,通过公司内部的安全认证(如CA证书)后,不需要人的参与,系统可以自动分配给用户一个账号进入系统

     两者的比较:

     1、执行效率:如果实时性的要求不是很高,差别可以忽略不记。  
      2、维护的难度:B/S要容易维护的多!  
      3、在lan内与在internet上跑有何影响:两个都要受到网络传输速度的影响,

    而B/S更适合在internet上运行。  
      4、安全性:C/S稍好。  
      5、所用技术的难易程度:B/S相对更简单一些。  
      6、对硬件和网络的要求:B/S的要求低。  
      7、开发周期:相当。

  • LoadRunner脚本编写(6)— 数据类型转换和字符串操作

    2008-09-25 17:25:24

    一,数据类型转换

    没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难。下面介绍这方面的知识。

    1.  相似函数的输出在不同的位置

    象很多C函数一样,使用atoi函数的结果即为返回值

    intResult = atoi( charY );

    而:itoa的返回结果为第二个参数。

    itoa( intX, charY, 10);

       第一个参数是需要转换的数字,第二个参数是转换后存储的字符数组,需要注意的是数组必须定义为固定的长度,如:char chary[20]

    数组的最大长度为3206432K),否则会出现“too many variables”编译错误。

    如果定义为变长的字符串如char *charY,则程序会出错。

       第三个参数不是数组的长度,而是数字的基数,10进制是最常用的,其他还有二进制,八进制,十六进制。

    2.  有一些函数实现了同样的功能

    itoa不是一个标准的ANSI C函数但是是Cstdlib.h中的一个函数。所以它不被包括在unix机器上的LibC中。我们可以使用标准的sprintf函数来代替:

    sprintfcharY,“%d”,intX);

    3.  是用%X来转换一个十六进制数

    int intNum

    sscanf(“ffff”,“%X”,&Num;

    lr_output_message(“%d”,intNum);  // 打印65535 ,ffff的整数值

    4.  从文本中提取数字的规则

    如果第一个字符不是数字或者为空,atoi返回0,即“e24”会返回0

    atoi 转换一个非数字的字符会返回组成这个字符的数字,如“-3.2返回-3.0。“123XXX345”返回123

    5.  LoadRunner脚本中的参数必须转换成C字符串。有两种方式来转化LR的参数为C语言的数字。

      i = atoi( lr_eval_string("{pX}") );

    sprintf( intX, "%d", lr_eval_string("{pX}") );

    6.  参数的算术运算

    LoadRunner没有提供对参数的算术运算的函数。所以LR的参数必须:

    1)  转换成C的整数

    2)  使用C的函数来运算最后返回一个C的字符串

    3)  把返回的字符串保存成参数

    char cBuf[10];

    int i;

    // 1. Evaluate parameter into a C integer:

    i = atoi( lr_eval_string("{pNum_in}") );

    // 2. Do the math and output the result to a C string:

    sprintf( cBuf, "%d", i+1);

    // 3. Save the string as a parameter to be passed on:

    lr_save_string( cBuf, "pNum_out");

    //Print out the parameter value after incrementing it.

    lr_message("**** Parameter from %s to %s",

         lr_eval_string("{pNum_in}"));

         lr_eval_string("{pNum_out}"));

    zibeike注:除了对于数字类型的参数的运算之外,对于文本形式的参数的操作,可以参考我的另一篇文章的内容:http://www.51testing.com/?34866/action_viewspace_itemid_75592.html

    二.字符串操作

    C语言中,字符串是固定长度的,因为他们本身由独立的字符组成的字符数组。数组是只读的。任何修改字符串长度的函数调用都会报错:

    Error: "C interpreter runtime error - memory violation error during replay.

    LoadRunneras_web.h库中的字符串函数可以使用“prototyping”声明的方式读写内存:

    char *strtok(char *, char *); // tokenizer prototype
    char *strstr(char *, char *); // substring prototype
    char *strdup(char *); // String duplication prototype
    float atof(); // alpha to return float datatype
    #include "as_web.h"
    char *strtok(char *, char *); // prototype function call.
     
    ActionX()
    {
       char aBuffer[256]; // input string to be parsed.
        char *cToken; // individual token from strtok.
       char cSeparator[] = " "; // blank separator.
       int i; // incrementer
       char val[3][20]; // output array of strings.
       char modified_val[20]; 
        
       // Create a parameter named pDate:
       lr_save_string("January 2, 2001", "pDate");
     
       // Put parameter into a string buffer:
       strcpy( aBuffer,lr_eval_string("{pDate}"));
     
       // Show the buffer for debugging:
       lr_output_message("%s\n",aBuffer);
     
       // get first word (to the first blank):
        cToken = strtok( aBuffer,cSeparator); 
       i = 1;
     
       if(!token) { // first token was not found:
               lr_output_message("No tokens found in string!");
               return( -1 );
       } else {
               while( cToken != NULL) { // tokens are not NULL:
                       lr_output_message("Token=%s", cToken);
     
                       // Stuff in another array:
                       strcpy( val[i], cToken ); 
     
                       // Get next token:
                       cToken = strtok( NULL, cSeparator); 
                       i++; // increment 
               }
               lr_output_message("Val #1 is: %s", val[1]);
               lr_output_message("Val #2 is: %s", val[2]);
               lr_output_message("Val #2 is: %s", val[3]);
     
               strncpy( modified_val, val[2], 1 );
               modified_val[2] = '\0';
               while (modified_val[2] != NULL) {
                       lr_output_message("===>%s", modified_val);
                       modified_val[2] = strtok(NULL, " ");
               }
       }
       return 0;
    }

    strcat 连接两个字符串

    strchr 返回指向第一个要查找的字符出现的位置的指针

    strcmp 比较两个字符

    strcpy 复制字符串到另一个

    stricmp 执行一个大小写敏感的比较

    其他还有strdupstrncatstrncpystrnicmpstrrchrstrsetstrspnstrstr等字符串操作的函数。

    zibeike注:关于更多字符串操作的脚本编写,可以参考我的另一篇文章:

    http://www.51testing.com/?34866/action_viewspace_itemid_75428.html

    zibeike翻译自:http://www.wilsonmar.com/1lrscrīpt.htm


  • LoadRunner脚本编写(5)-- 检查点,关联等函数

    2008-09-25 17:24:22

    本文接着前面脚本编写4 http://www.51testing.com/?34866/action_viewspace_itemid_70224.html来继续翻译wilsonmar的文章。其中在翻译过程中,都以zibeike注的方式添加了自己对相关知识点的一些经验和理解。转载请注明作者zibeike和出处,谢谢。

    1.  错误预防和恢复

    参数默认是用{}括起来的,但也可以指定用<>

    NTLM或用户登录验证

    web_set_user("X\\Y", "Z", "A.com:80");

    在域与X上的用户名为Y的用户,使用密码Z来登录到A.com:80。在windows基本验证的时候这个脚本被默认录制下来,但如果web服务器需要更安全的NTLM或更深层次的验证,需要手动的添加这个函数到脚本中。对于NTML验证,用户名必须在域名之后,并且以\分割。使用\等符号,需要使用\\,前面的\用来做转义用,否则会出现警告提示。

     

    zibeike注:在论坛中也看到了一些朋友讨论windows弹出登录框的操作LR无法录制到,导致回放出错,一般出错信息多为“Error -26547: Authentication required, please use web_set_user, e.g. web_set_user("domain\\user", "password", "host:port");   [MsgId: MERR-26547]”,其实这种情况错误信息已经很明显的给你提示了,需要往脚本中添加web_set_user函数即可。

     

    2.  IP欺骗(略)

    3.  验证检查点

    通常脚本录制完后需要手动添加些脚本来来确保预期的操作确实进行了正确的响应(如在操作之后后验证显示的一段文本或者图片)。这些检查可以使用正则表达式。

    Web虚拟用户脚本中不会录制到检查点,需要手动添加或者使用VuGen的用户接口来添加函数代码。

    最常用的检查点函数是web_reg_find。这个注册函数会查找脚本中下一个操作如web_url后产生的一段文本。它是从返回的缓冲区扫描而不是在接收的页面中查找。这是比web_find更高效的一个函数。

    可以使用下面的代码来验证文本出现的次数:

    • web_reg_find("Text=ABC", "SaveCount=abc_count", LAST);
      E5U+V't7e4`(Z6H H#G183368web_url("Step", "URL=...", LAST);
      ~2r{2m-Q+z183368if (strcmp(lr_eval_string("{abc_count}"), "0") == 0)

    lr_output_message("not found");

    else

    lr_output_message("{abc_count} found");

    如果想保存并且显示找到的文本,可以使用web_reg_save_param界定左右边界把找到的信息保存到参数中。如下:

    • char *str1,*str2;51Testing软件测试网L;Ky]2sw%{
      str1="desired text";51Testing软件测试网 C5]8ldY d2r
      // Register the left and right beacons sought:51Testing软件测试网KlC2WYw
      web_reg_save_param("param","LB/ic=xxx","RB=xxx");
      7F#X3zQ)WY2D`'_,~183368// Do the monitored deed:51Testing软件测试网 gz ?!Bj5W(ZoyC
      web_url("some url","URL=www.xxx.com",LAST);
      9\$n!Jlzky183368// Compare:51Testing软件测试网5Y~-ixn*CY R/r7F
      str2=lr_eval_string("{param}");
      2M t%cLlM%un d183368if(strcmp(str1,str2)==0) {

    lr_output_message("param found");

    }else{

    lr_output_message("Value found is %s",str2);

    }

    zibeike注:1)这里想跟大家说下注册函数,在web/http协议的脚本中,注册函数均以web_reg为前缀,这种注册型的函数都是从缓冲区扫描或者获得数据,因此需要提前声明即需要在能获得该查找信息的函数之前添加这些注册函数。例如,web_url()请求了一个页面,我需要验证该页面中是否有某个特定的文本,那需要在web_url()函数之前加上web_reg_find,类似的还有关联的函数web_reg_save_para是一样的,需要放到能获得想要的数据的请求的函数之前。但如果想查看这些函数最终保存的结果,如想打印关联函数web_reg_save_para中保存的参数内容,打印的操作就需要放到请求的函数之后了。

    2web_findweb_reg_find的区别:前面的是查找页面显示的数据,因此需要放在请求页面的函数之后,而且查找的信息是显示的web页面上的信息。后者是注册型函数,需要放到请求的页面之前,而且查找的内容是服务器返回的缓冲数据中查找,所以查找内容应该看html源代码的内容。

    基于HTML录制方式的代码,可以使用web_image_checkHTML页面中包含的图片进行验证。并且需要注意的是只有在Runtime Settings > Internet Protocol Preferences 选择了"Enable Image and text check" 检查点才有效。

  • LoadRunner学习---脚本编写(4)(比较重要)

    2008-09-25 17:22:42

    Web用户Action

        在VuGen中,脚本产生的默认模式是基于HTML的--“描述用户的动作的脚本”直接与用户的动作是对应的:

        * web_url是浏览器地址栏的URL.

        * web_link是点击在<a href= ...>和<a>之间的文本超链接。

        * web_image是点击HTML的<img href= link.

        * web_submit_form 是在前面操作的上下文中的GET或PUT表单上点“提交”--可能前面的操作被VuGen在基于HTML模式下录制下来了。

        * web_submit_data 是在GET或PUT表单上点“提交”,而没有带前面操作的上下文--可能是在基于URL模式下录制,或者是基于HTML模式,并且选择了“A scrīpt containing explicit URLs only”选项。

         不用HTML产生的资源是.gif和.jpg图片。资源属性的列表只能当对这些资源的路直选项设置成“Record within the current scrīpt step”时被插入。这也是默认的设置。

          如果你在“Tools > Internet Procotol > Recording”中选择“a scrīpt containing explicit URLs only”,这将会产生URL-based的脚本录制,只使用web_url和web_submit_data函数,将不会使用 web_link 和 web_image函数,或包含在 applets, XML, ActiveX或javascrīpt中的非HTML元素。

    Idea在进行下一页录制之前(如点击链接或者图标),暂停录制,把该页屏幕的标题拷贝下来粘贴到注释中。录制完成之后,这将会在后面的给事务命名上用到。

    Idea在每一个页面显示之后,暂停录制,把决定是否是期望页的文本拷贝下来,粘贴到注释中。录制完成之后,这将会用到文本验证检查点的脚本编写中。

         录制中产生的各种信息都保存在RecordingLog.txt文件中,删除它不会对脚本的回放产生影响。

    额外录制的Action脚本

        录制脚本的时候,当浏览器没有安装SSL根证书的时候,会捕获的下面这些代码行。这个信息意思是“这个证书不能被信任证书验证”。

       web_url("authrootseq.txt",

      "URL=http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootseq.txt", 51Testing软件测试网/X HUtdu5yO7w
      "Resource=1", 51Testing软件测试网0wJ(J5pNuU
      "RecContentType=text/plain",
      /leG ~3M183368"Referer=", 51Testing软件测试网P f.s0y3S!A+~4G)jx3n2n
      LAST);
      q7Z*}f"]8n sb183368

    web_url("authrootstl.cab",

      "URL=http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab",
      7u!P(Q8[ FLH183368"Resource=1", 51Testing软件测试网TV.J*M bs,y/S(i
      "RecContentType=application/octet-stream", 51Testing软件测试网EU y!Rz:I4]
      "Referer=", 51Testing软件测试网\PFE4U6^b*T5c:?
      LAST);
       录制脚本的时候,但浏览器遇到Macromedia flash组件的时候,会产生下面的代码行:
      web_url("version_en_win_ax.xml",
        "URL=http://fpdownload.macromedia.com/pub/flashplayer/update/current/xml/version_en_win_ax.xml",
        :EmWsd*DZ't183368"Resource=0",
        _%GUxOH0Q+e183368"RecContentType=text/html",
        0O Q4_/Zt!wj P?183368"Referer=", 51Testing软件测试网/`Z6T4CO^"F
        "Snapshot=t8.inf", 51Testing软件测试网`|(WQO
        "Mode=HTML",
        4xeEP;m183368LAST);
            如果你安装有Google Toolbar,即使你没有访问Google,也会录制上发到Google的请求。
      脚本语言规则:
       在LoadRunner中,大小写是敏感的,甚至在被检验的值中。所以上面的脚本会因为大写字母的原因,不会识别“Welcome”的。所以Steve Cheney 建议使用“ic”忽略大小写的文字标志:
       web_reg_find("Text/ic=Welcome",LAST);
       括号里的参数包含了LAST 是为了指定最后的一个参数。这样做是很方便的,因为上面的例子漏掉了一个指定期望是“found”还是“notfound”的属性。默认是“found”,所有我经常忽略它。
        另一个文本标志是“/BIN”用来指定是二进制的字符集。例如,查找“Adams”:
      web_reg_find("Text/BIN=\\x00A\\x00d\\x00a\\x00m\\x00s",LAST);
      注意两个反斜杠,一个是转义字符,代表是使用了一个符号。如果错误的只使用一个反斜杠,LR会认为它是一个空的终止。
            下面的例子脚本是在UTF8服务器上支持获得newquoteuid为UTF-16编码。因为LoadRunner中,UTF16编码的“Red”用ASCII是 R\x00e\x00d\x00 这样的,所以需要把它保存到buffer中。
      lr_eval_string_ext("{newquoteuid_temp}", 51Testing软件测试网;x*gU(Bh5Z2o)\;M
      strlen("{newquoteuid_temp}") + 2,
      ~ _3G%CI)C8J+R183368 &Buf, &BufLen, 0, 0, -1);
       对字符数组变量NewBuf使用lr_save_var函数来去掉额外的填充(x00):
      for (i=0; i if (Buf[i]!=0) NewBuf[NewBufLen++]=Buf[i];
      +A-j%r-{Xb183368 lr_save_var(NewBuf, NewBufLen-1, 0, "newquoteuid");
       注:lr_save_var 需要四个参数(不需要使用LAST)
       1.param_value 参数值
       2 value_len 参数的长度。
       3 options 参数的选项,一般为0
       4。param_name 参数名称
       LoadRunner 7.8不支持正则表达式,但是有他自己的通配符:
       为了使任何[0-9] 的数字在指定的数字位置,使用/DIG做标志:
       web_reg_save_param("pSer","LB/DIG=Serial XXX-###-ZZZZ","RB=\r\n", LAST );
       有三种使用^做通配符的方法:
       * 忽略大小写,并且允许在指定的字符位置使用任意字符:
         web_reg_find("Text/ALNUMIC=^ercury", LAST);
       * 允许任何小写字符[a-z] 在指定位置:
         web_reg_find("Text/ALNUMLC=^ercury", LAST);
       * 允许任何大写字符[A-Z]在指定的字符位置:
         web_reg_find("Text/ALNUMUC=^ercury", LAST);
       把一个字符串变成大写:strupr()
      错误信息:
       请添加一些其他的错误信息来帮助其他人:

      Could not resolve address of host ... [MsgId: MERR-27798]

      如果网络不能用或者域没有注册的话,显示一个404的DNS错误

      Contents unexpectedly not in cache. [MsgId: MERR-26549]

      当一个文件为空时会显示该错误。在空文件中添加空格来满足LoadRunner的错误检查。BTW,因为当创建的iframe没有文件时,IE会产生一个错误,这样就指定了一个空文件。

      事务时间脚本编写:

      Idea我更喜欢给一个action命名事务,而不是一个结果页面。

        lr_start_transaction("00.1 Invoke URL"); 51Testing软件测试网:PF3~~_6sA
        ... 51Testing软件测试网{3[2P9G,UsDL&r
        lr_end_transaction("00.1 Invoke URL",LR_AUTO);
        9Wy4u8sO2fNz x'?{183368... 51Testing软件测试网+M`it&OLc
        lr_start_transaction("01.2 Top menu"); 51Testing软件测试网 OI#RG+R E BG%`
        ... 51Testing软件测试网"|f#cTv\p v
        lr_end_transaction("01.2 Top menu",LR_AUTO); 51Testing软件测试网2j!`rO5Te
        51Testing软件测试网G/N+E'z1Z x
        lr_start_transaction("02.0 Updating");

          8yuqL3}183368lr_start_sub_transaction("02.1 Update menu","02.0 Updating"); 51Testing软件测试网Z'z(Wz'P7]
          web_url( ... 51Testing软件测试网VS9s ?M4U
          lr_end_sub_transaction("02.1 Update menu",LR_AUTO); 51Testing软件测试网d.u8e+@zL1r7{y
          lr_start_sub_transaction("02.2 Update submit","02.0 Updating"); 51Testing软件测试网:yjy8O!dsLow0f!K
          web_submit_form( ... 51Testing软件测试网KdxlN?d#_
          lr_end_sub_transaction("02.2 Update submit",LR_AUTO); 51Testing软件测试网8[aJP u*u~m
          lr_start_sub_transaction("02.3 Update OK","02.0 Updating");
          vJ[w_n'\k183368web_url( ... 51Testing软件测试网$e&V ?j+w]3a
          lr_end_sub_transaction("02.3 Update OK",LR_AUTO);

        #ZU5lNq'Z1_)q183368
        U%VZ3M{*y N`183368lr_end_transaction("02.0 Updating",LR_AUTO);

      Idea我喜欢在一个层次结构中使用0填充的事务名称,这样来确保控制器能够正确的给事务排序。

      Idea我对不同类型的action上的事务名称上加不同的关键字
    • Contact Link = Click "Contact" link on Menu
    • Contact Icon = Click "Contact" Icon
    • Regis. Sub = Page Submit
    • OK = Pop-up dismiss with OK

        事务名可以是变量,但是它只能被VuGen作为字符串来编译,不能在控制器的接口中显示。无论如何,他们会显示在分析结果文件中。

         对于web脚本,LR自动创建和决定事务的的持续时间,但是C语言脚本可以使用这些函数:

         使用lr_start_transaction_instance函数来显式获得指定事务实例的句柄,事务名称在函数lr_user_data_point_instance或lr_user_data_point_instance_ex中使用。

          使用 lr_start_sub_transaction在一个事务中来操作思考时间和消耗的时间。

  • loadrunner学习系列---脚本编写(2)

    2008-09-25 17:19:08

    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;
    $tUeW;r:xQj$S)u&[J183368vuser_init() 51Testing软件测试网w)T ^{dZ;E
    {
      LPCSTR strUsertype; // Define *str.
      YFeW$t,~183368strUsertype = lr_get_attrib_string("usertype");
      51Testing软件测试网 ~9P5P:L'r;dg*[ F
      if (strUsertype==NULL){
        lr_output_message("### Run-time Settings Additional Attribute usertype not specified. Cannot continue."); 51Testing软件测试网A[$@ s ]s5W
        lr_abort();
      }else{51Testing软件测试网'h G VL:M Fk;s
        lr_message("### Run-time Settings Additional Attribute usertype=\"%s\"", strUsertype );
        ` WUzT@UK183368if( strcmp( strUsertype,"advanced") == 0 ){ thinktime1=2; }51Testing软件测试网dU;tc;l
        else51Testing软件测试网0x3|6vOu)G9l*h]
        if( strcmp( strUsertype,"intermediate") == 0 ){ thinktime1=4; }
        j5ENt4Dr&P:pKvt6W^P183368else
        51Testing软件测试网 [ C'c'R.a*j rnv
        if( strcmp( strUsertype,"basic") == 0 ){ thinktime1=8; }
        cG,m9M7Z183368else{51Testing软件测试网:dV0O0F8S
          lr_error_message("### ERROR: Value not recognized. Aborting run." ); 51Testing软件测试网w/d2] VYt
          lr_abort();
        }
        }51Testing软件测试网rF3[!fH!b3I,`(V;k {
        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 的名称和行数51Testing软件测试网`{5^ ^%WO v
      lr_output_message("an output message");

      例子:

      • Actions.c (4): an output message

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

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

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

      // 往输出日志上发送不带action名称和行数的信息51Testing软件测试网q![Le(Kh)n+I{ n
      lr_log_message("number\t"+ numvar +"\t");

       

      // 只给控制器上的虚拟用户状态区域发送信息(当在VuGen中运行时,只是简单的显示): 51Testing软件测试网7~J0t%Q@G
      lr_vuser_status_message("a vuser status message");

       

      // 给LoadRunner控制器或者Tuning模块的控制台输出窗口显示一个红色高亮度显示的-17999 信息。51Testing软件测试网bH:g2],A:m
      lr_error_message("an error message");

       

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

      2008-09-25 17:16:39

      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] 51Testing软件测试网Q qB7oO M}
         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: 51Testing软件测试网 d"q3lWBejOv
        SET LR80=C:\Program Files\Mercury Interactive\Mercury LoadRunner\bin 51Testing软件测试网 [1z;H2W2b0I,Un{
        cd %LR80%
        .ye8{ t,^@6BnX183368wlrun.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的函数。
      ?lJ3m~y183368  #include "globals.h"  LoadRunner'的模版文件夹的其中一个。

        #include "vuser_init.c"
      ;z6B5T7Z] jE$c183368  #include "Action.c" 51Testing软件测试网"jP X&sKJU2O[,I
        #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语法:略

    • LoadRunner 试题 你能打多少分 题目第二部分

      2008-09-19 10:48:07

      49.  What conclusion can you draw for File Data Operations? (1 point)

       

         Processor queue and file data operations correlate and show that the system is backlogged.

         Rising CPU and file data operations indicate the system is backlogged.

         Processor queue and file data operations are in contrast and the system is not backlogged.

         Rising CPU and file data operations correlate to show the system is well tuned for I/O operations.

      48.  To determine if the network had issues with increasing traffic (or number of Vusers) during the load test, what merging graphs will you use to make this determination? Choose Two. (2 points)

       

         Running Vusers with Transaction Response Time

         Running Vusers with Hits per Second

         Running Vusers with Throughput

         Running Vusers with Transaction Peformance Summary

       

      47.  What do the readings for processor queue length indicate? (1 point)

       

         Processor queue length is average; the system is processing on acceptable levels.

         Processor queue length is above normal and indicates system congestion.

         Processor queue length is below normal and indicates too little hardware is utilized by the system.

       

      46.  What was the average CPU utilization (in percentage)? (2 points)

       

      Note: Your answer should be in whole integers only. Decimals are not allowed.        

       

      45.  If you want to show the correlated values (for automatic correlations) only for the current step in your scrīpt, what feature will you use? 

       

         Scan scrīpt for correlations

         Show Differences In

         Show only differences that appear in scrīpt

         Show Scan for correlations popup after replay

       

      44.  Which utility do you use to identify dynamic values in a recorded scrīpt by comparing two scrīpts of similar recorded steps and data for correlation? 

       

         Automatic correlation

         Correlation by recording

         Compare with Vuser

         Scan

       

      43.  Which of the following functions adds a checkpoint in your scrīpt? Choose TWO. (2 points)

       

         web_reg_find ( );

         web_reg_save_param ( );

         web_reg_add_cookie ( );

         win_get_text ( );

         obj_get_text ( );

       

      42.  What is the correct syntax to initialize a variable in VuGen?

       

         int var1,

         int var1;

         int var1=2;

         int var1==2;

       

      40.  If the load test objectives were to evaluate transaction response times and monitor server resources, which types of monitors would best meet these objectives? Choose TWO. (2 points)

       

         Running Vusers

         Transaction Response Time

         Total Trans/Sec

         Hits per Second

         Throughput

         Windows Resources

         Apache

       

      39.  What setting will you use so that all Vusers are initialized before starting the scenario? (1 point)

       

         Reset

         Run/Stop Vusers

         Initialize Vusers before run

         Load all Vusers simultaneously

       

      38.  An application has an actual peak load value of 150 users. If you are creating an Overload scenario that comprises 120% of the actual peak load value, how many Vusers will you run? (3 points)          

       

      37.  Which feature allows you to configure the ramp up, ramp down, and duration options during a load test? (1 point)

       

         Schedule builder

         Design tab

         Edit Schedule

         Run tab

       

      36.  What setting will you configure to add the machines whose resources you want to monitor?

       

         Under Tools > Options

         Under ‘Add Measurements…’

         Under ‘Freeze’

         Under ‘Configure…’

       

      35.  Thinktimes are included in the Vuser scrīpt you are debugging. Since this is not yet a load test, you want to reduce the thinktime values to only a portion of the original recorded values. Which thinktime settings can you use to meet this requirement? Choose TWO. (2 points)

       

         As recorded

         Multiply thinktime by

         Use random percentage of recorded thinktime

         Limit thinktime to x number of seconds (where x is 1)

       

       

      34.  Dynamic data that you may need to correlate can best be investigated using which logging feature? (1 point)

       

         Send messages only when an error occurs

         Standard log

         Parameter substitution

         Data returned by the server

         Advanced trace

       

      33.  One of the requirements for a Vuser scrīpt is to include dynamic values in the execution log. What LoadRunner feature will you use to include dynamic values in the execution log without modifying the scrīpt? (1 point)

       

         lr_output_message

         Extended log

         Web_reg_find

         Advanced log

       

      32.  Match the scenario type with the action being described. (4 points) 选ABCD

       

        This scenario run shows the responsiveness of a site under low stress and helps you validate business process functions for concurrent usage with data being used in the test. ()

      This scenario applies the entire load through slow ramp up. The scenario is repeated until any bottlenecks found are investigated and corrected for optimum system performance. ()

      This scenario allows you to see the final limits of the system and helps determine a safety factor for your system.()

      ABCD This scenario is run to help you isolate the slowest transactions and helps you identify any system bottlenecks on major problem areas. ()

       A. Debug

      B. TopTime

      C. Full Load

      D. Scalability

       

      30.  What setting would you configure to view the execution log that includes parameter substitution, data returned by the server, and advanced trace? (1 point)

       

         Send messages only on error

         Advanced automatic log

         Standard log

         Extended log

       

      29.  To control the time between iterations in a Vuser, you will need to configure which run-time feature? 

       

         Run Logic

         Pacing

         Think Time

         Network Speed

       

      28.  Which TWO statements represent best practice when selecting monitor measurements during an initial load test? (2 points)

       

         Add specific monitors to allow backend experts to confirm their diagnosis of the system under test.

         Add default monitors to get a broad spectrum of how the system is behaving under load.

         Add specific monitors to help you target suspected problems in specific servers or components.

         Add default monitors to help you isolate potential bottlenecks during the load test.

       

      27.  Which Run-Time Setting ensures that when a scrīpt is played back, there is caching in the browser, and each iteration simulates a new user? (1 point)

       

         Additional attributes

         Browser emulation

         Miscellaneous

         Preferences

         Advanced options

       

       

      26.  What setting do you use to meet the requirement that the recording option for the scrīpt type be set to “A scrīpt describing user actions.” (1 point)

       

         URL-based scrīpt

         URL advanced

         HTML-based scrīpt

         HTML advanced

       

      25.  You want a Vuser scrīpt to capture a screenshot in case an error occurs during playback. Which setting will you configure to capture these errors? (1 point)

       

         Continue on error

      查看(587) 评论(0) 收藏 分享 管理

    • LoadRunner 试题 你能打多少分 题目第一部分

      2008-09-19 10:46:14

      22.  Standard monitors do not require any separate licenses. Select the three standard monitors available in LoadRunner. Choose THREE. (3 points)

       

         Apache

         Netscape

         IIS

         Oracle

         Unix

         SNMP

         Windows Resources

       

      21.  Which of the following measurements are monitored by LoadRunner’s Web server monitors?

       

         Throughput

         CPU usage

         Cache hits

         Page faults

       

      20.  A LoadRunner ______________________ measures the performance of the server by measuring the time it takes for the server to respond to specified Vuser requests. (1 point)

       

         Checkpoint

         Thinktime

         Transaction

         Server monitor

       

      19.  For which of the following requirements would you select a Goal-Oriented Scenario? Choose TWO. (2 points)

       

         Be able to change the number of Vusers during the load test.

         Run the load test with the objective of validating response time.

         The Controller schedules and runs Vusers on its own.

         The load test expert has the ability to control how many Vusers run.

       

      18.  A scenario can contain several sets of Vusers to represent different user profiles and emulate real users interacting with the application. These sets of Vusers are called the ______________________________. (1 point)

       

         Vuser group

         Test set

         Scenario set

         Test run group

       

      17.  Which of the following statements is TRUE for the web_submit_form statement? (1 point)

       

         Playback minimizes hardware resource demands because parts of an HTTP request are cached.

         Action tag and values are not hard-coded; they are retrieved from memory.

         You can easily use WDiff to compare captured dynamic values to debug the scrīpt.

       

      16.  You can add Vuser scrīpts and load generators from: (1 point)

       

         The Controller

         The Remote Agent

         The Virtual User Generator

         Analysis

         The Tuning Console

       

      15.  Complete the statement:

      To validate that the hardware to be used for the test environment is sufficient to meet the performance tests, a ____________________ is performed using a small number of business processes and users. (1 point)

       

       

         production run

         benchmark run

         aggregation run

         run for tuning

       

      12.  The Controller is installed on which platform? (1 point)

       

         UNIX

         Windows

         Apache

         JBoss

       

      11.  While setting up the test environment, you are running into problems connecting a load generator to the Controller which indicates the status of the agent as ‘Down’. What are THREE ways to check the connection between the Controller and the load generator? (3 points)

       

         Ping the load generator.

         Run the command line: Kill -9.

         Confirm agentservice is active and listed.

         Uninstall and re-install the load generator.

         Check firewall access.

         Turn the service agent to process.

       

       

      8.  One of your customer’s requirements is that their web site can handle 25,000 users at any time, logged in and performing different transactions. Part of your information gathering is to determine concurrency. What level of concurrency represents the customer’s requirement? (1 point)

       

         Application

         Business

         Transaction

       

      7.  Which of the following statements reflect best practice on managing the test environment? (1 point)

       

         A test environment is a subfolder under the production environment.

         A test environment is rebooted during test runs without affecting the production environment.

         A test environment uses live data from the production environment.

         A test environment is a controlled environment that should not mirror the production environment.

       

       

      6.  What information about a web site under test is important to collect if you are planning to consider network latency and packet loss in your load test? (1 point)

       

         Task distribution diagram C

         Peak load

         Transactional concurrency

         Customer geography

       

      5.  What type of information will you need to gather to determine how business processes affect different components in the system architecture? This is especially useful during the load test; it can help isolate the source of bottlenecks. (1 point)

       

         Task Distribution Diagram

         System Monitoring

         Transcontinental Remote Users

         Business Process Mapping

       

      2.  Select the three criteria by which you will identify the business processes (BPs) to use for a performance test. (3 points)

       

         Passed unit testing

         Mission-critical BPs

         Uses unique data

         Returns dynamic data

         Heavy throughput

         Include all BPs

         Affects legacy systems

       

      1.  Which of the following statements is considered best practice for setting up the test environment? (1 point)

       

         The test environment uses the production database but not the production system.

         The test environment selects functional components of the application under test.

         The test environment undergoes benchmark testing.

         The test environment can be a folder within the production environment.

    • Cookies的问题

      2008-09-18 17:01:04

      Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息。Cookies的工作原理是,第一次由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端进行判断,然后再产生HTML代码返回给客户端,这是一个很重要的原理。关于服务器端和客户端的概念,请点击我写的这篇:什么是服务器端和客户端,举了2个实例。

      Cookies在ASP中的最常用的方法,

      1.如何写入Cookies?
      Response.Cookies("字段名")=变量或字符串,例如:
      Response.Cookies("name2")="Dingdang"

      2.如何设置Cookies时间?
      Response.Cookies("字段名").expires=时间函数+N,例如:
      Response.Cookies("name2").expires=date+1,表示Cookies保存1天,再比如:
      Response.Cookies("name2").expires=Hour+8,表示Cookies保存8小时。

      3.在以往的ASP教程中,很少有介绍Cookies退出的方法。在“退出”这个ASP页中可以这样写:
      Response.Cookies("字段名")=""
      之后,在客户端的浏览器就清除了Cookies,并且Cookies文件会消失。注意有多少个字段,就要写多少句来清除。

      4.如何读取Cookies?
      变量名=Request.Cookies("字段名"),例如:
      name2=Request.Cookies("name2")
      如果网页中写入这句,则会显示“Dingdang”。
      也可以这样直接读取Cookies,

      Cookies是属于Session对象的一种。但有不同,Cookies不会占服务器资源;而“Session”则会占用服务器资源。所以,尽量不要使用Session,而使用Cookies。
    411/3123>
    Open Toolbar