一、实验测试:
1.1 LoadRunner
Mercury Interaction 公司开发一款成熟的性能测试工具,LoadRunner 作为
性能测试的实现者,涉及性能测试流程、性能测试技术和软件体系架构等众多方面的知识点 。
性能测试的基准大体有以下几方面:
响应时间
从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间。合
理的响应时间取决于实际的用户需求。
并发用户数
一般是指同一时间段内访问系统的用户数量。
吞吐量
指单位时间内系统处理的客户请求数量。
性能计数器
描述服务器或操作系统性能的一些数据指标,比如Windows 系统资源管理器。
1.2 LoadRunner 12 脚本录制
LoadRunner11有破解版,但限制于操作系统win7,浏览器ie 9。本文拟采用LoadRunner12进行测试限制最大虚拟用户为50。
使用 LR 自带的 Web Tours Server (飞机订票系统)来进行模拟测试。
启动 Virtual User Generator
- 创建 script
- 分析业务流程,创建action
- 开始录制脚本
- 脚本回放
- 查看测试结果
- 问题反馈,存在服务器session值得问题
使用函数:web_reg_save_param()
- 根据源码确定取值:
脚本修改:
web_reg_save_param("session","LB=userSession\" value=\"","RB=\"/>", LAST);
- 验证
- 模拟并发,参数化设置,动态设置用户名和密码
- 编辑参数
- 导出到excel,拼接字符串
- 编辑用户
- 测试 each iterator and each occurrence
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 > > Action()
> > {
> > int count, j;
> >
> > lr_output_message("--------------count: %d", count++);
> >
> > lr_start_transaction("test");
> > //int i = 3;
> > for(j=0 ; j < 10; j++)
> > {
> > lr_output_message("test count : %d", j);
> > }
> >
> > lr_think_time(5);
> > // 第一次
> > lr_output_message("登录成功,用户名是:%s, 手机号为:%s", lr_eval_string("{username}"), lr_eval_string("{phonenumber}"));
> > // 第二次
> > lr_output_message("登录成功,用户名是:%s, 手机号为:%s", lr_eval_string("{username}"), lr_eval_string("{phonenumber}"));
> > // 第三次
> > lr_output_message("登录成功,用户名是:%s, 手机号为:%s", lr_eval_string("{username}"), lr_eval_string("{phonenumber}"));
> >
> > lr_end_transaction("test", LR_AUTO);
> >
> > return 0;
> > }
> >
- 迭代一次耗时:
- 并发测试(ip欺骗),使用 IP wizard 创建
- 打开controller,将录制的脚本加载到创建的场景中
scenario
>Load Generator
测试连接,测试失败选择add
,name
为localhost
scenario
>enable ip spoofer
tools
>Export mode
tools
>option
>General
>IP address allocation per thread
- 注:本地测试中出现问题,将127.0.0.1替换成MSI本机主机名,前者无法使用指定域名,原因暂不详
- 开始场景
- 场景运行中操作
- 查看用户访问状态
- 查看VUSER 分配ip
- 监控指标选择
- 测试完成,分析报告
- 生成报告:
- 基于dasc 登录脚本的录制,杭州为例
录制脚本,action 替换 ST:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 > > web_reg_save_param("serviceticket","LB=\"lt\" value=\"","RB=\" />", LAST);
> > web_url("toAuthenticate",
> > "URL=http://192.168.1.172:8086/dgpHZ-server-web/s/toAuthenticate",
> > "Resource=0",
> > "RecContentType=text/html",
> > "Referer=http://192.168.1.172:8086/hzviewer/",
> > "Snapshot=t7.inf",
> > "Mode=HTML",
> > EXTRARES,
> > "Url=http://192.168.5.13:8089/sso/images/login/shape-4.png", "Referer=http://192.168.5.13:8089/sso/login?service=http://192.168.1.172:8086/dgpHZ-server-web/shirocas", ENDITEM,
> > "Url=http://192.168.5.13:8089/sso/images/dl00100.jpg", "Referer=http://192.168.5.13:8089/sso/login?service=http://192.168.1.172:8086/dgpHZ-server-web/shirocas", ENDITEM,
> > "Url=http://192.168.5.13:8089/sso/images/login/shape-5.png", "Referer=http://192.168.5.13:8089/sso/login?service=http://192.168.1.172:8086/dgpHZ-server-web/shirocas", ENDITEM,
> > LAST);
> >
> >
> >
> > web_submit_data("login;jsessionid=C15F1F91B23FF64544539EF37F72ABC3",
> > "Action=http://192.168.5.13:8089/sso/login;jsessionid=C15F1F91B23FF64544539EF37F72ABC3?service=http://192.168.1.172:8086/dgpHZ-server-web/shirocas",
> > "Method=POST",
> > "RecContentType=text/html",
> > "Referer=http://192.168.5.13:8089/sso/login?service=http://192.168.1.172:8086/dgpHZ-server-web/shirocas",
> > "Snapshot=t8.inf",
> > "Mode=HTML",
> > ITEMDATA,
> > "Name=username", "Value={username}", ENDITEM,
> > "Name=password", "Value={password}", ENDITEM,
> > "Name=lt", "Value={serviceticket}", ENDITEM,
> > "Name=execution", "Value=e1s1", ENDITEM,
> > "Name=_eventId", "Value=submit", ENDITEM,
> > "Name=submit", "Value=鐧诲綍", ENDITEM,
> > LAST);
> > lr_output_message("username: %s", lr_eval_string("{username}"));
> > lr_output_message("password: %s", lr_eval_string("{password}"));
> > lr_output_message("serviceticket: %s", lr_eval_string("{serviceticket}"));
> >
- 替换 sessionid
从响应头脚本实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 > > //实现字符串截取
> > void web_reg_save_param_custom(char *sourceStr, char* outpuStr, char *leftBdry, char *rightBdry){
> > char *st1, *st2;
> > int result, i = 0;
> > i=strlen(leftBdry);
> > st1 = (char*) strstr(sourceStr, leftBdry);
> > if (st1 != NULL){
> > st1 += i;
> > st2 = (char*) strstr(st1, rightBdry);
> > if (st2 != NULL){
> > result = st2 - st1;
> > *(st1 + result) = '\0';
> > }
> > }
> > if ((st1 == NULL) || (st2 == NULL))
> > lr_error_message("Error: No substring found for the specified boundary");
> > else
> > lr_save_string(lr_eval_string(st1), outpuStr);
> > }
> >
> > web_save_header(RESPONSE, "ResponseHeader");
> >
> > lr_output_message("response is : [%s]", lr_eval_string("{ResponseHeader}"));
> >
> > web_reg_save_param_custom(lr_eval_string("{ResponseHeader}"), "jsessionid", "JSESSIONID=","; Path=/sso");
> >
> > lr_output_message("jessionid is : [%s]", lr_eval_string("{jsessionid}"));
> >
> >
二、其他资源监测
- oracle 性能监测:导出awr 报告
- windows 服务器性能监控
三、业务场景:
需求一:
1 | 登录支持10min 300个用户登录,并发数不少于20,响应时间不超过5s,业务员成功率100%,服务器cpu内存资源使用率不超过80% |
测试步骤:
1 | 一、测试单次登录所需时间,单次事务消耗时间 |