Fellow Travellers

loadrunner 并发测试

张永朋
字数统计: 1.5k阅读时长: 6 min
2019/08/15 Share

一、实验测试:

1.1 LoadRunner

Mercury Interaction 公司开发一款成熟的性能测试工具,LoadRunner 作为

性能测试的实现者,涉及性能测试流程、性能测试技术和软件体系架构等众多方面的知识点 。

性能测试的基准大体有以下几方面:

  • 响应时间

    从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间。合

理的响应时间取决于实际的用户需求。

  • 并发用户数

    一般是指同一时间段内访问系统的用户数量。

  • 吞吐量

    指单位时间内系统处理的客户请求数量。

  • 性能计数器

    描述服务器或操作系统性能的一些数据指标,比如Windows 系统资源管理器。

1.2 LoadRunner 12 脚本录制

LoadRunner11有破解版,但限制于操作系统win7,浏览器ie 9。本文拟采用LoadRunner12进行测试限制最大虚拟用户为50。

  • 使用 LR 自带的 Web Tours Server (飞机订票系统)来进行模拟测试。

    1562145051907

  • 启动 Virtual User Generator

1562145745411

1562146269180

  • 创建 script

1562146496693

  • 分析业务流程,创建action
  • 开始录制脚本

1562147368920

  • 脚本回放

1562168558652

  • 查看测试结果

1562168767724

1562168862272

  • 问题反馈,存在服务器session值得问题

使用函数:web_reg_save_param()

1562170655182

  • 根据源码确定取值:

1562170760828

脚本修改:

web_reg_save_param("session","LB=userSession\" value=\"","RB=\"/>", LAST);

  • 验证

1562172523563

  • 模拟并发,参数化设置,动态设置用户名和密码

1562172656865

  • 编辑参数

1562172750688

  • 导出到excel,拼接字符串

1562172810309

  • 编辑用户

1562173122475

  • 测试 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;
> > }
> >
  • 迭代一次耗时:

1562202149518

  • 并发测试(ip欺骗),使用 IP wizard 创建

1562204266193

1562204281767

1562204329219

1562204398889

  • 打开controller,将录制的脚本加载到创建的场景中

1562202963074

  • scenario>Load Generator 测试连接,测试失败选择addnamelocalhost
  • scenario>enable ip spoofer
  • tools>Export mode
  • tools>option>General>IP address allocation per thread
  • 注:本地测试中出现问题,将127.0.0.1替换成MSI本机主机名,前者无法使用指定域名,原因暂不详

1562205286270

1562205346480

1562206027462

  • 开始场景

1562205460913

  • 场景运行中操作

1562205564558

1562205597960

  • 查看用户访问状态

1562206942127

  • 查看VUSER 分配ip

1562207239633

1562207335396

  • 监控指标选择

1562207424787

1562207506454

  • 测试完成,分析报告

1562207741821

1562207781925

  • 生成报告:

1562207818349

1562207862250

  • 基于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

1562229479867

从响应头脚本实现:

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
2
3
登录支持10min 300个用户登录,并发数不少于20,响应时间不超过5s,业务员成功率100%,服务器cpu内存资源使用率不超过80%
分两个业务测试类型:并发测试、业务量测试
业务量测试:10 min 300 个用户,系统至少300个可用账户,需测试出单词登录消耗时间,从而计算出所需的user数量。

测试步骤:

1
2
3
一、测试单次登录所需时间,单次事务消耗时间
计算出一个vuser模拟登录模块所需时间
二、如果模拟真是用户行为,用户名设置为参数化,则参数化类型使用file类型或者unique类型
CATALOG
  1. 1. 一、实验测试:
    1. 1.1. 1.1 LoadRunner
    2. 1.2. 1.2 LoadRunner 12 脚本录制
  2. 2. 二、其他资源监测
  3. 3. 三、业务场景: