环境:loadrunner11,win7家庭版32位
最近遇到一个性能测试,需要模拟很多手机客户端调用后台接口,上传图片到服务器。
接口是http get和http post的,http get比较容易对付,loadrunner新建HTTP协议的脚本,录制IE,启动url输入httpget 的url就行了。但是上传文件这招肯定不行了。直接编写loadrunner的post,我没那本事,那个web_custom_request中的BodyBinary我写不出来。所以只能找工具来录制。
想了几招,先是尝试用loadrunner使用HTTP协议录制android的模拟器AVD Manager.exe,结果半天没动静;后来在百度的云调试上启动一个模拟器,用loadrunner录制HTTP协议,不出意外的录制了一大堆脚本出来,除了我想要的没有录到以外,啥都有。
参考:http://mtc.baidu.com/mtc/home.php
题外话:如果图省事,百度的这个手机云调试还是不错的,虽然用15分钟就要续一下。
印象中firefox有httppost插件,懒得搞了,上网搜搜相关工具吧。于是搜到了:
Author: zyl910的一个httppost工具,C#写的:
http://www.cnblogs.com/zyl910/archive/2012/09/19/TestHttpPost.html
拿来看了看:
002.jpg
没有图片文件,只有postdata,我要是知道postdata怎么填写,我就不用满世界搜工具了。这个界面中的文件名称是我修改了添加上去的。没法子,只好改造了这个工具,添加了一段代码。
//BEING:这一段的内容是我新加的
System.IO.FileInfo f = new FileInfo(textBox1.Text); int flen = (Int32)f.Length; byte[] bufPost = new byte[flen];
FileStream sFile = new FileStream(textBox1.Text, FileMode.Open); sFile.Read(bufPost, 0, flen);
f = null; sFile = null;
//byte[] bufPost = myEncoding.GetBytes(sPostData);
//END:这一段的内容是我新加的 |
一看就明白了,就是将要post的数据从文件中读出,而不是从界面上得到。好像写的不是特别严谨,编码都没管。代码跑了一下,发现上传文件失败了,找开发核对了一下HEADER部分,发现是:Content-Type必须要写成"application/octet-stream",再试试,嘿,运气不错,成功了。
于是loadrunner使用HTTP协议录制编译出来的exe文件,录制下来,回放脚本,OK搞定了。
做到这里,任务就算完成了。继续想想,这样每次上传的文件都是相同的,能否不同呢。那就需要每次在loadrunner中打开一个图片文件,然后转换为web_custom_request的BodyBinary需要的那一大堆ASC串。于是就试了试,结果:
Action.c(19): start time:2012-10-25 15:13:10.944 Action.c(35): 8000 bytes read Action.c(35): 8000 bytes read Action.c(35): 8000 bytes read Action.c(35): 8000 bytes read Action.c(35): 8000 bytes read Action.c(35): 8000 bytes read Action.c(35): 6049 bytes read Action.c(60): Total number of bytes read = 54049 Action.c(69): end time:2012-10-25 15:24:36.924 |
图片:54049字节,也就是53k
生成的结果ASC串:264k
一共运行:2012-10-25 15:24:36.924-2012-10-25 15:13:10.944=11分26秒
这个还没有做参数替换上传动作。
反思:想想也是,上传的时候需要asc串,先从文件二进制读出,转换为asc串替换,将来真的执行,还得搞成二进制串才能上传,这个也太作孽了,没法子快的起来。
打开文件转码再上传,这个方案比较傻,还是在代码执行之前就得到BodyBinary会更快一些,但是有点不服气,有没有搞错loadrunner这个脚本是c写的,而且是编译执行的,居然这么慢,不爽,改写一个vbs的试试。
花了点时间,写了一个vbs的脚本,对图片进行转换,faint,居然不到一秒就搞定了。Vbs真是爱死你了,毕竟在wins下面混,vbs还是非常给力的,只需要一个编辑器就行了。
以后可以图省事,不用录制了,直接徒手写这个HTTP POST了,不过一张53k的图片,需要生成264k的字符串,loadrunner的脚本写出来估计满眼都是这堆字符串了,要是图片上兆的话,不可想象,非得把那堆asc串写入文件中,临到要用再读出来了。
文中相关工具下载:
1. loadrunner读图片文件转换为post内容
http://download.csdn.net/detail/testingba/4686466
这是一个loadrunner脚本,示例如何读出一个图片文件,转换生成一个文本文件,文件的内容是loadrunner httppost上传文件的BodyBinary内容
2. httppost相关工具
http://download.csdn.net/detail/testingba/4686488
这个压缩包中包括:
1. testhttppost.exe:http post上传文件工具;
2. TestHttpPost: 源码;
以上内容改编自:Author: zyl910
http://www.cnblogs.com/zyl910/archive/2012/09/19/TestHttpPost.html
3.lr_post.txt: 录制的loadrunnerhttp post上传文件到服务器的示例;
4. getjpg.vbs: 读出一个图片文件,将其内容转换为loadrunner httppost的BodyBinary内容,这是用来比较loadrunner脚本速度的: