疝气手术补片图片用补片后三年口不欲合算医疗事故吗

微信号:callme_hr
扫码加一览职业生涯导师微信好友
深圳市一览网络股份有限公司(股票代码:833680)
版权所有 &您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
LoadRunner+BS压力测试新手必看详解.ppt41页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:350 &&
你可能关注的文档:
··········
··········
* * * * * * * * * * * * * * * * * * * * 解决方案 参数设置 选择下一行:
sequential:按照顺序一行行的读取。每一个虚拟用户都会按照相同的顺序读取。
random:每一个vuer都随机在参数列表选择一个参数。
unique:每一个vuer使用的参数都是唯一的(即均不相同的) 参数设置 更新值的时间:
Each iteration:在每一次迭代后更新
Each occurrence:每次出现时该参数时更新一个新的值。
Once:不管迭代多少次该参数的值一直保持不变。 问题来了5
在测试中涉及的一系列操作中,很多时候我们都只会关心特定关键性操作的性能问题。
loadrunner为解决这个问题提出事务的概念。
知识背景 事务:
在loadrunner中,把用户一系列的操作集合成为事务。
利用事务可以监听指定操作的一些性能问题。 解决方案 解决方案 解决方案 解决方案 知识的回顾 1)b/s压力测试使用的协议 2)录制脚本 3)模拟场景 4)迭代规则 5)集合点 6)参数 7)事务 谢谢听讲 * * * * * * * * * * * * * * * * * * * * * Loadrunner 11 B/S压力测试 LoadRunner是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。 简介 LoadRunner生成虚拟用户,以虚拟用户的方式模拟真实用户的业务操作行为。它先记录下业务流程 如下订单或机票预定 ,然后将其转化为测试脚本。 功能 界面 Vista和win7需要使用管理员身份开启 load runner 录制脚本 Vuer_init action Vuer_end 录制脚本 Vuer_init action Vuer_end Vuer_init action Vuer_end Vuer_init action Vuer_end Vuer_init action Vuer_end Vuer_init action Vuer_end 实操时间1 规则:
启动vuer:同时,20个
持续时间:10秒
停止vuer:同时 问题来了1 问题:
无法定量控
正在加载中,请稍后...使用loadrunner进行压力测试——post请求 - tg50的个人空间 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园
使用loadrunner进行压力测试——post请求
& 16:29:25
/ 个人分类:
注意,在某些破解版的软件中如果更改了runtime_setting可能导致响应时间曲线无法绘制,原因不详1. 发送post请求时使用web_submit_data&如:& & web_submit_data("create",//事务名&&&&&&&&&& "Action=/diy/", //请求域名&&&&&&&&& "Method=POST", //请求类型为post&&&&&&&&& "RecContentType=application/json", //返回格式为json&&&&&&&&& "Referer=/diy?wp_id=8743",&&&&&&&&& "Snapshot=t4.inf",&&&&&&&&& "Mode=HTML",&&&&&&&&& ITEMDATA, //下面编辑post请求的数据&&&&&&&&& "Name=img", "Value=http://dl./images//8743.jpg", ENDITEM, //数据的name、value及结束符&&&&&&&&& "Name=left", "Value=60", ENDITEM,&//第二条数据的name、value及结束符&&&&&&&&& "Name=top", "Value=30", ENDITEM,&&&&&&&&& "Name=width", "Value=720", ENDITEM,&&&&&&&&& "Name=height", "Value=450", ENDITEM,&&&&&&&&& "Name=model", "Value=5/5s", ENDITEM,&&&&&&&&& "Name=x", "Value=1", ENDITEM,&&&&&&&&& "Name=y", "Value=1", ENDITEM,&&&&&&&&& "Name=ofc", "Value=1", ENDITEM,&&&&&&&&& "Name=wp_id", "Value=8743", ENDITEM,&&&&&&&&& "Name=mat", "Value=ms", ENDITEM,&&&&&&&&& "Name=curMode", "Value=normal", ENDITEM,&&&&&&&&& LAST);2. 如果要发送的请求的数据值需要变化,那么需要将请求中的值参数化,,如果是根据上一条请求的返回值来确定请求中的数据值,那么需要对上一条请求的返回值进行解析如:&web_submit_data("create",&&&&&&&&& "Action=/diy/",&&&&&&&&& "Method=POST",&&&&&&&&& "RecContentType=application/json",&&&&&&&&& "Referer=/diy?wp_id=8743",&&&&&&&&& "Snapshot=t4.inf",&&&&&&&&& "Mode=HTML",&&&&&&&&& ITEMDATA,&&&&&&&&& "Name=img", "Value=http://dl./images//8743.jpg", ENDITEM,&&&&&&&&& "Name=left", "Value=60", ENDITEM,&&&&&&&&& "Name=top", "Value=30", ENDITEM,&&&&&&&&& "Name=width", "Value=720", ENDITEM,&&&&&&&&& "Name=height", "Value=450", ENDITEM,&&&&&&&&& "Name=model", "Value=5/5s", ENDITEM,&&&&&&&&& "Name=x", "Value=1", ENDITEM,&&&&&&&&& "Name=y", "Value=1", ENDITEM,&&&&&&&&& "Name=ofc", "Value=1", ENDITEM,&&&&&&&&& "Name=wp_id", "Value=8743", ENDITEM,&&&&&&&&& "Name=mat", "Value=ms", ENDITEM,&&&&&&&&& "Name=curMode", "Value=normal", ENDITEM,&&&&&&&&& LAST);//请求1&&&& lr_set_debug_message( 16 | 2,0 );&&&& lr_save_string((char*)strtok(lr_eval_string("{Output}"),","),"temp");//获得请求1的返回数据&&&& //lr_output_message("bian:%s",lr_eval_string("{temp}"));&&&& lr_save_string((char*)strtok(NULL,","),"diyid_temp");//解析返回数据&&&& //lr_output_message("bian2:%s",lr_eval_string("{diyid_temp}"));&&&& lr_save_string((char*)strtok(lr_eval_string("{diyid_temp}"),":"),"temp");//解析返回数据&&&& //lr_output_message("bian:%s",lr_eval_string("{temp}"));&&&& lr_save_string((char*)strtok(NULL,":"),"diyid_temp");//解析返回数据&&&& //lr_output_message("bian2:%s",lr_eval_string("{diyid_temp}"));&&&& diyid_str=(char*)strtok(lr_eval_string("{diyid_temp}"),"}");&&&& lr_save_string((char*)strtok(lr_eval_string("{diyid_temp}"),"}"),"diyid");//解析返回数据&&&& //lr_output_message("bian:%s",lr_eval_string("{diyid}"));&&&& strcat(, diyid_str);&&&& //lr_output_message("%s",test);&&&& lr_save_string(CMd5(test),"md5");//计算md5&&&& //lr_output_message("bianmd5:%s",lr_eval_string("{md5}"));&&&& web_submit_data("postname",&&&&&&&&&&&&&&& "Action=/orderpay/",&&&&&&&&&&&&&&& "Method=POST",&&&&&&&&&&&&&&& "RecContentType=textml",&&&&&&&&&&&&&&& "Mode=HTML",&&&&&&&&&&&&&&& ITEMDATA,&&&&&&&&&&&&&&& "Name=goods_action","Value=goods_detail",ENDITEM,&&&&&&&&&&&&&&&&&&& "Name=goods_addr","Value=656",ENDITEM,&&&&&&&&&&&&&&&&&&& "Name=md5str","Value={md5}",ENDITEM,//根据参数构造请求&&&&&&&&&&&&&&&&&&& "Name=diy_id","Value={diyid}",ENDITEM,//根据参数构造请求&&&&&&&&&&&&&&&&&&& "Name=goods_info","Value=448_1",ENDITEM,&&&&&&&&&&&&&&&&&&& "Name=from","Value=diy",ENDITEM,&&&&&&&&&&&&&&&&&&& "Name=Accept","Value=text/plain",ENDITEM,&&&&&&&&&&&&&&& LAST);&3. &另附,计算md5,需要添加md5的头文件,并别忘了在gloab.h中include md5.h#ifndef MD5_H#define MD5_H#ifdef __alphatypedef unsigned int uint32;#elsetypedef unsigned long uint32;#endifstruct MD5Context {&&&&&&& uint32 buf[4];&&&&&&& uint32 bits[2];&&&&&&& unsigned char in[64];};extern void MD5Init();extern void MD5Update();extern void MD5Final();extern void MD5Transform();typedef struct MD5Context MD5_CTX;#endif#ifdef sgi#define HIGHFIRST#endif#ifdef sun#define HIGHFIRST#endif#ifndef HIGHFIRST#define byteReverse(buf, len)&&& /* Nothing */#elsevoid byteReverse(buf, longs)unsigned char *{&&& uint32&&& do {&&& t = (uint32) ((unsigned) buf[3] && 8 | buf[2]) && 16 |((unsigned) buf[1] && 8 | buf[0]);&&& *(uint32 *) buf =&&& buf += 4;&&& } while (--longs);}#endifvoid MD5Init(ctx)struct MD5Context *{&&& ctx-&buf[0] = 0x;&&& ctx-&buf[1] = 0xefcdab89;&&& ctx-&buf[2] = 0x98&&& ctx-&buf[3] = 0x;&&& ctx-&bits[0] = 0;&&& ctx-&bits[1] = 0;}void MD5Update(ctx, buf, len) struct MD5Context * unsigned char *{&&& uint32&&& t = ctx-&bits[0];&&& if ((ctx-&bits[0] = t + ((uint32) len && 3)) & t)&&& ctx-&bits[1]++;&&& ctx-&bits[1] += len && 29;&&& t = (t && 3) & 0x3f;&&& if (t) {&&& unsigned char *p = (unsigned char *) ctx-&in +&&& t = 64 -&&& if (len & t) {&&&&&&& memcpy(p, buf, len);&&&&&&&&&& }&&& memcpy(p, buf, t);&&& byteReverse(ctx-&in, 16);&&& MD5Transform(ctx-&buf, (uint32 *) ctx-&in);&&& buf +=&&& len -=&&& }&&& while (len &= 64) {&&& memcpy(ctx-&in, buf, 64);&&& byteReverse(ctx-&in, 16);&&& MD5Transform(ctx-&buf, (uint32 *) ctx-&in);&&& buf += 64;&&& len -= 64;&&& }&&& memcpy(ctx-&in, buf, len);}void MD5Final(digest, ctx)&&& unsigned char digest[16]; struct MD5Context *{&&&&&& unsigned char *p;&&& count = (ctx-&bits[0] && 3) & 0x3F;&&& p = ctx-&in +&&& *p++ = 0x80;&&& count = 64 - 1 -&&& if (count & 8) {&&& memset(p, 0, count);&&& byteReverse(ctx-&in, 16);&&& MD5Transform(ctx-&buf, (uint32 *) ctx-&in);&&& memset(ctx-&in, 0, 56);&&& } else {&&& memset(p, 0, count - 8);&&& }&&& byteReverse(ctx-&in, 14);&&& ((uint32 *) ctx-&in)[14] = ctx-&bits[0];&&& ((uint32 *) ctx-&in)[15] = ctx-&bits[1];&&& MD5Transform(ctx-&buf, (uint32 *) ctx-&in);&&& byteReverse((unsigned char *) ctx-&buf, 4);&&& memcpy(digest, ctx-&buf, 16);&&& memset(ctx, 0, sizeof(ctx));}#define F1(x, y, z) (z ^ (x & (y ^ z)))#define F2(x, y, z) F1(z, x, y)#define F3(x, y, z) (x ^ y ^ z)#define F4(x, y, z) (y ^ (x | ~z))#define MD5STEP(f, w, x, y, z, data, s) ( w += f(x, y, z) + data,& w = w&&s | w&&(32-s),& w += x )void MD5Transform(buf, in)&&& uint32 buf[4]; uint32 in[16];{&&& register uint32 a, b, c,&&& a = buf[0];&&& b = buf[1];&&& c = buf[2];&&& d = buf[3];&&& MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);&&& MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);&&& MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);&&& MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);&&& MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);&&& MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);&&& MD5STEP(F1, c, d, a, b, in[6] + 0xa);&&& MD5STEP(F1, b, c, d, a, in[7] + 0xfd);&&& MD5STEP(F1, a, b, c, d, in[8] + 0x, 7);&&& MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);&&& MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);&&& MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);&&& MD5STEP(F1, a, b, c, d, in[12] + 0x6b);&&& MD5STEP(F1, d, a, b, c, in[13] + 0xfd);&&& MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);&&& MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);&&& MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);&&& MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);&&& MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);&&& MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);&&& MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);&&& MD5STEP(F2, d, a, b, c, in[10] + 0x);&&& MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);&&& MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);&&& MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);&&& MD5STEP(F2, d, a, b, c, in[14] + 0xc);&&& MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);&&& MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);&&& MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);&&& MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);&&& MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);&&& MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);&&& MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);&&& MD5STEP(F3, d, a, b, c, in[8] + 0x);&&& MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);&&& MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);&&& MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);&&& MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);&&& MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);&&& MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);&&& MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);&&& MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);&&& MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);&&& MD5STEP(F3, b, c, d, a, in[6] + 0x);&&& MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);&&& MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);&&& MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);&&& MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);&&& MD5STEP(F4, a, b, c, d, in[0] + 0xf);&&& MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);&&& MD5STEP(F4, c, d, a, b, in[14] + 0xab);&&& MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);&&& MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);&&& MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);&&& MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);&&& MD5STEP(F4, b, c, d, a, in[1] + 0x8);&&& MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);&&& MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);&&& MD5STEP(F4, c, d, a, b, in[6] + 0xa);&&& MD5STEP(F4, b, c, d, a, in[13] + 0x4e);&&& MD5STEP(F4, a, b, c, d, in[4] + 0xf);&&& MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);&&& MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);&&& MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);&&& buf[0] +=&&& buf[1] +=&&& buf[2] +=&&& buf[3] +=}char* CMd5(const char* s){&&&& struct MD5Context md5c;&&&& unsigned char ss[16];&&&& char subStr[3],resStr[33];&&&&&&&& MD5Init( &md5c );&&&& MD5Update( &md5c, s, strlen(s) );&&&& MD5Final( ss, &md5c );&&&& strcpy(resStr,"");&&&& for( i=0; i&16; i++ )&&&& {&&&&&&&& sprintf(subStr, "%02x", ss[i] );&&&&&&&& itoa(ss[i],subStr,16);&&&&&&&& if (strlen(subStr)==1) {&&&&&&&&&&&& strcat(resStr,"0");&&&&&&&& }&&&&&&&& strcat(resStr,subStr);&&&& }&&&& strcat(resStr,"\0");&&&& return resS}4. 如果一个action中有两个请求,那么压测是看到的响应时间曲线是两个请求综合的响应时间,如果要区分每个请求的响应时间,可加入请求开始/结束标记lr_start_transaction(“create”);lr_end_transaction(“create”,&LR_AUTO);博客访问: 347511
博文数量: 217
注册时间:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
  那些通过网络来进行日常交易的业务需要为客户提供尽可能好的用户使用体验,这样才能确保业务的成功。然而,这些业务往往会因为他们的网站无法处理峰值时期的网络流量而失去许多客户。
  本文就“维护网络应用性能是战胜这些电子商务挑战并创造更多收入的关键”这一观点进行了阐述,讨论了维护网络应用对于保证客户满意度的重要性,以及负载测试对于网站成功启动和管理具有重要意义的原因。另外,本文还调查了不同类型的负载测试,详细讨论了负载测试流程和可靠测试工具所应具有的特性。最后,本文对全球BTO领导者美科利(Mercury)公司的负载测试解决方案——美科利LoadRunner作了总体介绍。
  电子商务发展迅速
  在过去几年中,电子商务的发展速度令人震惊。分析家估计,现在有8亿人使用网络——并且没有任何放慢速度的迹象。事实上,国际数据公司(IDC,International Data Corporation)预测,网络用户的数量将在未来几年中超过10亿。
  电子商务成为流行商业媒介的原因有2个:其一,它使业务能够分享全世界的信息和资源;其二,它为广告、市场推广和销售提供了一个有效渠道。网络有助于提高销售量、扩大市场推广范围、提高客户服务质量,并能在企业内外高效完成业务。
  随着网络客户数量的增长,销售商之间的竞争变得日益激烈,人们正在意识到这样一个事实:为客户提供良好的最终用户体验,这是非常重要的,也非常具有挑战性,但同时也将是高回报的。
  保证最优的最终用户体验——一个复杂问题
  电子商务的运行是非常复杂的。根据不同的商务交易类型,商业网站可以被划分为四大类:出版/订户网站、在线购物网站、客户自助网站和贸易拍卖网站。
  无论是哪种交易类型,网站必须能够让客户及时完成业务。因此,拥有一个可扩展的架构是必须的。
  然而,一个良好的网络环境包含着一个非常复杂的多层次系统,如果要端到端地扩展这个基础架构,就必须管理每一层中的每个组件的性能和容量。图1说明了这些组件的复杂性。
  这一复杂性引起了关于网站完整性和性能容量方面的许多问题,例如用户所经历的响应时间是否小于2秒?该网站是否能支撑一定数量的用户?当系统中的所有组件被连接到一起时,是否能协同共存?应用服务器和数据库服务器间的信息传送速度是否足够快?每一层上是否有足够的硬件来处理高访问量?客户是否在广域网获得了最优的质量体验?
  为了解决这些性能问题,业务必须实施一种方法,这种方法能在部署前预测到web应用在生产环境中的行为。
  上线前的应用负载测试
  为了适应网站的发展,web开发人员们往往会优化软件或者在每个系统组件上增加硬件。然而,这种随意改进性能的方法并不理想,往往会导致无节制的硬件购买,成功也没有一点保障。为了真正确保最优性能,必须在上线前对所有系统组成部分进行负载测试。
  应用负载测试就是对整个网络应用能力进行衡量,使其能支持众多并发用户和交易,并保证适当的响应时间。由于此类测试涉及面广,因此负载测试是唯一一种能够在上线前精确测试网站端到端性能的方法。
  应用负载测试能帮助开发人员隔离任何基础架构组件的瓶颈问题。通常,实施这一流程有两种方法:手动测试和自动化测试。手动测试面临几个内在挑战,例如决定如何来模拟应用中相互作用的成千上万个用户的行为和负载,如何协调用户操作,如何衡量响应时间,如何保持重复测试方法的一致性以及如何比较测试结果等。
  由于负载测试具有不断反复的特性,用户必须识别性能问题,调整系统,然后重复测试,这样才能确保该调整所产生的影响是有利的。由于需要不断重复测试,手动测试显然不是一个实用的选择。
  有了自动化测试工具后,重复进行测试就变得轻而易举,测量结果也能自动得到。与手动测试相比,这种方法所采用的自动测试工具能提供一个更具有成本效率的有效解决方案,并且它还降低了测试过程中产生人为错误的风险。
  现在,自动负载测试是网络应用负载测试的首选。包括美科利LoadRunner在内的自动化工具通常采用三大组件来执行一个测试,它们包括:负责组织、驱动并管理负载的控制面板;流程中用来模拟真实用户在客户端应用上执行业务流程行为的虚拟用户;用于运行虚拟用户的负载服务器。
  有了这些组件后,自动负载测试工具就能用自动化虚拟客户来替代手动测试人员,在单个负载生成器上同时运行多个虚拟用户,自动衡量交易响应时间,便捷地重复负载场景,验证性能设计的变更内容,这一先进的功能将帮您节省时间和昂贵的资源。
  最近,Newport Group的一份报告证明了诸如美科利LoadRunner等自动化测试工具的价值。该报告显示,一半以上的网络业务无法达到它们预想的扩展目标。这其中的大多数未使用任何类型的自动负载测试工具。相反,那些能够达到扩展预期效果的业务几乎都使用了自动负载测试工具。
  自动化负载测试工具面临的挑战
  随着技术的不断发展,自动化负载测试工具也面临着诸多挑战。这些挑战主要包括:精确性、可扩展性以及隔离性能问题的能力。为了隔离性能问题,负载测试工具要监控主要系统水平组件,并在运行负载测试时识别出瓶颈问题。精确性被定义为一个自动化工具模拟真实用户行为的程度;可扩展性则与产品使用最少资源产生最大负载相关。使用美科利LoadRunner工具,可以很好的解决精确性与可扩展性问题。
  自动化负载测试的流程
  采用严格的方法进行负载测试,用户可以实现资源的优化;更好地预测到硬件、软件和网络需求;建立性能预期目标来满足最终用户服务水平协议(SLAs)。而为了验证变化是否已经生效,就必须重复进行测试。
  在下一篇文章中,我们将以美科利LoadRunner工具为例,详细介绍使用先进测试工具进行自动化负载测试的主要步骤和流程。
  美科利LoadRunner
  美科利LoadRunner是业界最为先进的负载测试工具之一,它能预测系统行为和性能。通过模拟任意数量的用户(从一个到上万个),它能测试整个企业基础架构,识别并隔离问题。由于能够支持多种环境,美科利LoadRunner能测试整个企业基础架构和应用,其中包括电子商务、ERP、CRM和定制客户/服务器应用,帮助IT和网络群组优化应用性能。通过模拟真实用户行为,美科利LoadRunner能测试如HTTP(s), COM, CORBA, oracle Applications等各种协议的应用传送。同时,美科利LoadRunner能与Mercury Business Availability Center(美科利业务可用性中心)完美整合。
  因此,应用部署完毕后,测试中创建的测试能被重新用来监控应用。美科利LoadRunner改进了负载测试流程中的每一步骤,确保用户取得最大的投资回报。
  总之,对于网络业务和实体业务来说,电子商务这种业务模式被证明是可行。网络用户数量正以几何倍数级的速度增长,因此,这些业务必须做好准备,保证他们的系统能够支持高用户数量。现在,业务可采用负载测试方案和工具来保证他们的网络应用性能满足最终用户的需求。
  美科利LoadRunner是预测电子商务应用的可扩展性、可靠性和性能问题的领先工具,能够识别系统瓶颈问题,并显示测试结果。美科利LoadRunner可以产生不同数量的用户来模拟各种交易。对于规划业务成长,降低业务风险,了解应用极限,这是非常必要的。美科利LoadRunner也能实时测试系统行为,并把这一数据转换成使用方便但数据详细的图表和报告。有了这些信息,问题就能被更快更有效地解决,从而保证了良好的最终用户体验,创造了增加收入的机会。在下篇文章中,我们将进一步讨论美科利LoadRunner是如何为负载测试流程中的每个阶段提供支持的。
  使用美科利(Mercury)LoadRunner自动化负载测试工具,我们能采用严格的方法进行负载测试,实现资源的优化;能更好地预测到硬件、软件和网络需求;能够建立性能预期目标来满足最终用户服务水平协议(SLAs)。
  通过自动化工具实现负载测试自动化一般有以下七个步骤:
  第一步:系统分析
  系统分析对于诠释用户的测试需求来说是至关重要的。可以此来判断系统是否将按照预期目标扩展和运行。
  使用美科利LoadRunner可进行同样的系统分析。模拟测试环境时,识别所有测试条件,其中包括系统架构组件、测试流程以及测试的虚拟用户总量。一个良好的系统分析能够帮助客户把他们的目标和要求转换成一个成功的自动测试场景。
  第二步:创建虚拟用户脚本
  首先,用户要记录业务流程,创建测试脚本。脚本记录可由美科利LoadRunner的虚拟用户产生器(Virtual User Generator (VUGen))来完成。VUGen是运行在客户桌面上的一个组件,它能捕获真实客户的应用与服务器之间的信息传送。通过发送各种电子商务协议请求,VUGen能模拟真实浏览者的确切行为。VUGen也能记录使用Netscape或Internet Explorer浏览器的用户,或者任何能够指定代理服务器地址的规定客户。完成记录流程后,测试脚本也就产生了。
  然后,用户就能在脚本中增加逻辑关系,使之变得更加符合现实。用户还可以在脚本中加入智能,这样,它们在执行交易时就能模拟虚拟用户进行推理论证。在这个阶段的执行过程中,美科利LoadRunner使用到了交易、检验和参数化三项特性。
  ·交易:交易是指一系列需要在一定负载条件下测试的操作。
  ·检验:VUGen允许插入内容检查(Content Check)复核点进行检验,通过对返回HTML网页的分析,检验应用功能。如果检验失败,美科利LoadRunner会记录错误并提示失败的原因,例如连接断线、图片丢失、错误文本等。
  ·参数化:为了精确模拟真实用户行为,美科利LoadRunner的虚拟用户在负载测试中使用不同的数据,把脚本中的常量替代为变量或参数。虚拟用户可以从文本文件、随机数字发生器、时钟等数据源取得的值来替代参数。
  第三步:定义用户行为
  美科利LoadRunner提供综合运行时间设定值来配置那些模拟真实用户的脚本,运行时间设定值包括:
  ·思考时间:控制虚拟用户作用系统的速度,其中包括测试期间的思考暂停时间。通过不同的用户思考时间,美科利LoadRunner 能够模仿从新手到熟练用户不同用户的行为。
  ·拨号速度:模拟用户使用调制解调器或LAN/WAN连接到系统。这有助于控制用户行为,精确模拟每个请求的响应时间。调制解调器的速度从14.4 Kbps到56.6 Kbps不等。
  ·模拟高速缓存:模拟具有一定高速缓存用户的浏览。也可根据服务器要求关闭高速缓存。
  ·浏览器模拟:帮您确定虚拟用户所模拟的浏览器。美科利LoadRunner 同时支持Netscape、Internet Explorer以及任何定制型的浏览器。
  ·连接数量:像真实浏览器一样,可以让虚拟用户在下载网页内容时控制连接到服务器的连接数量。
  ·IP地址分配:在同一个物理机器上分配虚拟用户的IP地址,测试IP相关组件的性能影响。
  ·迭代测试:命令重复运行虚拟用户脚本,协调虚拟用户,通知间隔间的等待时间。根据使用不同数据执行流程的次数,迭代测试定义了用户的工作量。
  ·错误处理:规定虚拟用户在执行脚本时的错误处理方法。当虚拟用户在重新执行过程中碰到错误时,美科利LoadRunner 能激活Continue on Error。
  ·日志文件:储存虚拟用户服务器传送信息。标准日志能图示所有交易、集结和输出信息,扩展日志记录也会跟踪警报和其他信息。
  第四步:创建负载测试场景
  用户可以使用美科利LoadRunner的控制器来创建场景。作为一个控制中心,它提供了完整的测试和虚拟用户信息。
  控制器可让您实现以下操作,使负载测试场景的创建变得更加容易:
  ·向各个群组分配脚本。
  ·定义运行测试所需的虚拟用户数量。
  ·定义运行虚拟用户的主机。
  另外,美科利LoadRunner为测试人员提供了ScenarioWizard、调度器(Scheduler)和TurboLoad。美科利LoadRunner的Scenario Wizard能帮助测试人员迅速创建多用户负载测试方案。
  Scenario Wizard:通过五个步骤,Scenario Wizard帮用户选择运行虚拟用户和测试脚本的工作站。通过这一流程,也可以创建虚拟用户的模拟群组。
  调度器(Scheduler): 美科利LoadRunner 的调度器用于改变准备状态和运行状态下的虚拟用户数量。该调度器也能管理时间计划,并带有一个自动化流程,可以在用户离开时运行脚本。
  CPU消耗最小化:这一技术能提供最大的扩展性。 美科利LoadRunner能最小化每个虚拟用户的CPU消耗,因此可以让每一台负载生成器上运行更多的用户。最新客户基准中使用了10个Windows负载服务器,LoadRunner每天在网络系统上产生三十多亿次点击(或每台机器3,700次点击/每秒),而负载生成器的运行只占用不到40%的CPU。
  第五步:创建网络影响测试
  美科利LoadRunner能够进行WAN模拟,因此,前几步中使用到的虚拟用户脚本还可用于网络影响测试,并为运行在同一个测试中的并存虚拟用户群组改进诸如连接速度、等待时间和错误率等网络特性。然后,用户就能精确确定不同群组的响应时间所产生的网络影响,以及应用对网络的敏感性。此外,它还可以记录预期响应时间数据和网络要求,在应用部署完毕后,系统会用到这些信息。
  第六步:运行负载测试方案,监控性能
  脚本一旦创建完成,用户就可以运行测试了。LoadRunner的控制器提供了一整套的性能监控器,能在负载测试期间监控多层次系统中的每个组件。通过捕捉整个系统的性能数据,用户就能把这一信息与最终用户负载和响应时间相关联起来,找到瓶颈问题所在。LoadRunner能监控网络、网络装置、大多数的普通web服务器、应用服务器和数据服务器的性能,该性能监控是在非插入的方式下进行的,这样对性能的影响就能降到最低。另外,所有监控器都独立于硬件和操作系统,无需在远程监控服务器上安装代理。
  LoadRunner可支持多种环境,提供精确的在线监控,包括:
  ·运行时间图表:显示虚拟用户状态、用户规定数据点。
  ·交易图表:显示响应时间,交易(成功/失败)。
  ·web服务器资源图表:显示每秒点击数、生产量、Apache MS IIS, Netscape等信息。
  ·系统资源图表:显示服务器资源,SNMP Tuxedo信息。
  ·Web应用服务器图表:显示BroadVision、ColdFusion、MS Active Server Pages、 SilverStream、 Web-Logic的运行状态。
  ·数据库服务器资源图表: SQL 服务器, oracle
  第七步:分析测试结果
  评估测试结果是负载测试流程中最重要的一步。在网络上进行多个流程时,用户已经能够精确记录和执行真实用户的行为,并且性能监控能在运行脚本时准确找到瓶颈问题。用户可以采取以下步骤来修复这些问题:首先,由一个网络专家(DBA, 顾问)对系统做必要调整;其次,用户需要重新运行脚本,验证这些改变确实已经发生;最后,进行前后比较,测试得出系统的改进结果。
  美科利LoadRunner的分析组件提供了一个整合环境,能够收集整个测试周期中产生的数据。这个工具非常强大,易于使用,用户能用它来建立各种方案之间的图表比较,从而丰富数据分析流程。
阅读(1972) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 疝气补片手术 的文章

 

随机推荐