概述

在《性能测试工具选择策略--仿真度对比测评分析报告》一文详细分析了使用相同的web页面,分别使用LoadRunner,Jmeter,kylinTOP工具进行录制脚本并执行得出在静态请求页面下,Loadrunner12与kylinTOP的仿真能力都非常的高,接近真实场景。这次我们进一步分析,对于对态请求界面,两者的差异性(这次我们改用kylinPET与LoadRunner12.60进行对比分析)。

被对象分析

被测试对象URL:http://59.110.158.28/Example/  ,这是一个简单的登录和内容加载页面。

首面登录界面

页面登录成功后的内容:

登录过程过程中,按下F12按钮,可以看到页面加载过程所有请求。getNews共有6个动态的并发请求。

LoadRunner12.60录制脚本并运行:

  • 脚本录制

使用LoadRunner12.60自带的录制功能,使用Chrome浏览器进行脚本录制(注意:录制过程需要安装一个fiddler,在录制脚本前,启动fiddler),录制完成后要进行自动关联和手动关联两个动作,

自动关联ticket和手动关联:validateCode,否则脚本无法运行。以下是关联后,action部分内容展示,脚本中手工增加了一个页面加载事务(从提交登录至脚本请求结尾)

  1 Action()
2 {
3
4 web_add_auto_header("Upgrade-Insecure-Requests","1");
5
6 web_reg_save_param_ex("ParamName=validateCode", "LB=validateCode\">","RB=<\/span>",LAST);
7
8 web_url("Example",
9 "URL=http://59.110.158.28/Example/",
10 "Resource=0",
11 "RecContentType=text/html",
12 "Referer=",
13 "Snapshot=t45.inf",
14 "Mode=HTML",
15 EXTRARES,
16 "Url=images/button/btn_login.png", "Referer=http://59.110.158.28/Example/css/login.css", ENDITEM,
17 LAST);
18
19 web_add_auto_header("Origin",
20 "http://59.110.158.28");
21
22 /*相关性注释 - 切勿更改! Original value='ST-1610868492644' Name ='ticket' Type ='ResponseBased'*/
23 web_reg_save_param_regexp(
24 "ParamName=ticket",
25 "RegExp=ticket=(.*?)\\\r\\\n",
26 SEARCH_FILTERS,
27 "Scope=Headers",
28 "IgnoreRedirections=No",
29 "RequestUrl=*/login*",
30 LAST);
31
32 lr_start_transaction("页面加载");
33
34 web_submit_form("login",
35 "Snapshot=t46.inf",
36 ITEMDATA,
37 "Name=name", "Value=admin", ENDITEM,
38 "Name=password", "Value=admin", ENDITEM,
39 "Name=validate", "Value={validateCode}", ENDITEM,
40 LAST);
41
42 web_revert_auto_header("Upgrade-Insecure-Requests");
43
44 web_add_auto_header("X-Requested-With",
45 "XMLHttpRequest");
46
47
48 web_submit_data("getNews",
49 "Action=http://59.110.158.28/Example/getNews",
50 "Method=POST",
51 "RecContentType=text/plain",
52 "Referer=http://59.110.158.28/Example/index.jsp?ticket={ticket}",
53 "Snapshot=t47.inf",
54 "Mode=HTML",
55 ITEMDATA,
56 "Name=times", "Value=6", ENDITEM,
57 LAST);
58
59 web_submit_data("getNews_2",
60 "Action=http://59.110.158.28/Example/getNews",
61 "Method=POST",
62 "RecContentType=text/plain",
63 "Referer=http://59.110.158.28/Example/index.jsp?ticket={ticket}",
64 "Snapshot=t48.inf",
65 "Mode=HTML",
66 ITEMDATA,
67 "Name=times", "Value=1", ENDITEM,
68 LAST);
69
70 web_submit_data("getNews_3",
71 "Action=http://59.110.158.28/Example/getNews",
72 "Method=POST",
73 "RecContentType=text/plain",
74 "Referer=http://59.110.158.28/Example/index.jsp?ticket={ticket}",
75 "Snapshot=t49.inf",
76 "Mode=HTML",
77 ITEMDATA,
78 "Name=times", "Value=4", ENDITEM,
79 LAST);
80
81 web_submit_data("getNews_4",
82 "Action=http://59.110.158.28/Example/getNews",
83 "Method=POST",
84 "RecContentType=text/plain",
85 "Referer=http://59.110.158.28/Example/index.jsp?ticket={ticket}",
86 "Snapshot=t50.inf",
87 "Mode=HTML",
88 ITEMDATA,
89 "Name=times", "Value=5", ENDITEM,
90 LAST);
91
92 web_submit_data("getNews_5",
93 "Action=http://59.110.158.28/Example/getNews",
94 "Method=POST",
95 "RecContentType=text/plain",
96 "Referer=http://59.110.158.28/Example/index.jsp?ticket={ticket}",
97 "Snapshot=t51.inf",
98 "Mode=HTML",
99 ITEMDATA,
100 "Name=times", "Value=2", ENDITEM,
101 LAST);
102
103 web_submit_data("getNews_6",
104 "Action=http://59.110.158.28/Example/getNews",
105 "Method=POST",
106 "RecContentType=text/plain",
107 "Referer=http://59.110.158.28/Example/index.jsp?ticket={ticket}",
108 "Snapshot=t52.inf",
109 "Mode=HTML",
110 ITEMDATA,
111 "Name=times", "Value=3", ENDITEM,
112 LAST);
113 lr_end_transaction("页面加载",LR_AUTO);
114 return 0;
115 }

录制完成,设置LoadRunner的运行代理功能,主要是方便Fiddler工具抓取HTTP请求(Fiddler只能通过代理方式抓取请求,不支持网卡抓取)。

脚本执行:

使用录制好的脚本,新建测试场景,这里不要建的过于复杂,只要能让脚本运行一次即可。运行成功后,从Fiddler上抓取的HTTP请求瀑布图看,6个并发的动态请求,全部变为串行执行,页面的加载时间由原来最大的请求时间决定,现变为6个请求时间之和(11.7秒),相同网络下,真实结果为:1-4秒不等。

kylinPET脚本录制并运行

录制完成后,设置proxy代理,方便fiddler抓取HTTP请求

脚本执行

从执行结果看,页面加载事务时间是2.8秒,Fiddler的抓包图看,最后6个动态请求是并发请求。

总结

对于页面的动态请求,LoadRunner 12.60版本(笔者采用发稿时最新版本),是串行请求,导致测试结果的页面加时间变长,而kylinPET是并发请求(与真实浏览器情况相同),测试结果更接近于浏览器的真实结果 。

也就是说LoadRunner 12版本,对于静态请求的测试结果与真实情况比较接近,而如果是动态的请求,变得非常不可信。这也是为什么论坛中有人说,测试结果与真实结果差距大的原因。

Loadrunner与kylinPET的能力对比测试--web动态请求的更多相关文章

  1. Heatmap.js v2.0 – 最强大的 Web 动态热图

    Heatmap 是用来呈现一定区域内的统计度量,最常见的网站访问热力图就是以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示.Heatmap.js 这个 JavaScript 库可以实现 ...

  2. [置顶] java web 动态服务器

    写了一个java web 动态服务器,主要通过内部类来实现,动态类使用了外部类,采用了 classforname 实例化,动态类的构造方法不能带参数, 效果都出来了,分享给有需要的 朋友.判断做的不够 ...

  3. 通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。

    通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML. JavaScript 能够改变页面中的所有 HTML 元素 JavaScript 能够改变页面中的所有 HTML ...

  4. C1 能力认证——Web进阶

    C1 能力认证--Web进阶 DOM节点操作-上 名称 描述 getElementById() 获取带有指定id的节点 getElementsByTagName() 获取带有指定标签名的节点集合 qu ...

  5. 深入web的请求过程

    一.深入web的请求过程 1.1.B/S网络架构概述 · 从前端到后端,都基于应用层协议HTTP来交互数据.一个请求就对应了一个操作,完成操作之后就断开了连接.基于这样的特点可以用来满足海量的用户的操 ...

  6. 简单说明CGI和动态请求是什么

    1. CGI是什么 CGI是common gateway interface的缩写,大家都译作通用网关接口,但很不幸,我们无法见名知意. 我们知道,web服务器所处理的内容都是静态的,要想处理动态内容 ...

  7. IIS 7 反向代理 URL重写 转发动态请求

    一.反向代理是什么 有一篇文章说的挺好的 Nginx 反向代理.负载均衡.页面缓存.URL重写及读写分离详解 http://www.server110.com/nginx/201402/5534.ht ...

  8. 传统Web应用请求和响应特点【显示当前时间】

    (1)请求:浏览器以HTTP协议的方式提交请求到服务器 (2)响应:服务器以HTTP协议的方式响应内容到浏览器 注意:HTTP是WEB大众化非安全协议 HTTPS是WEB安全协议,是基于HTTP协议的 ...

  9. unity+android权限--打开应用不弹权限,动态请求权限

    因为笔者之前的游戏需要分享图片,会请求外部储存,第一次打开游戏就会出现弹窗: 很多人对这个很敏感,怕你访问到他们的照片隐私,看到这个权限就拒绝,甚至卸载,实际上我们只是想截屏游戏内容分享给其他玩家,但 ...

随机推荐

  1. linux的Umask 为022 和027 都是什么意思?

    用全部权限777去减这个数值 一.022表示默认创建新文件权限为755 也就是 rxwr-xr-x(所有者全部权限,属组读写,其它人读写)  二.027表示默认创建新文件权限为750 也就是rxwr- ...

  2. rsync 参数说明及使用参数笔记

    第1章 rsync 命令简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据镜像同步备份的优秀工具. 1.1.1 语法格式 三种模式: 1)本地模式 rsync [选项] ...

  3. 如何用Python 制作词云-对1000首古诗做词云分析

    公号:码农充电站pro 主页:https://codeshellme.github.io 今天来介绍一下如何使用 Python 制作词云. 词云又叫文字云,它可以统计文本中频率较高的词,并将这些词可视 ...

  4. Navicat Primium连接数据库报ORA-28547错误

    这个问题主要是Navicat Primium与orecal中的oci.dll版本不一致造成的,无论是本地数据库或者网络数据库. 解决方法:在数据库orecal安装目录中搜索oci.dll文件,找到后将 ...

  5. mysqldump备份数据

    create database test; use test; create table test(id int,name char(8)); insert into test values(1,'p ...

  6. Bootstrap留言板界面练习

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 【Python 1-8】Python手把手教程之——管理列表List

    遍历列表 在日常开发中,我们经常需要遍历列表的所有元素,对每个元素执行相同的操作.例如,在管理商场的蔬菜时候,需要给所有的蔬菜商品都打7折,并重新生成价格.当我们需要对列表中的每个元素都执行相同的操作 ...

  8. Redis入门指导

    前言 本文提供全网最完整的Redis入门指导教程,下面我们从下载Redis安装包开始,一步一步的学习使用. 下载Redis 官网提供的Redis安装包是服务于Linux的,而我们需要在Window下使 ...

  9. ML.net重新训练模型需要注意的事项。

    ml.net是微软机器学习的东西,如果你的需求是需要一个固定的模型来进行操作的话那就按着官网的教程来就可以,但是大部分的模型可能不满足现有的需求,那么我们需要对模型进行重新训练. 重新训练模型有限制条 ...

  10. Hive Hooks介绍

    Hive作为SQL on Hadoop最稳定.应用最广泛的查询引擎被大家所熟知.但是由于基于MapReduce,查询执行速度太慢而逐步引入其他的近实时查询引擎如Presto等.值得关注的是Hive目前 ...