转:jmeter性能测试---登录百度进行搜索
在做web程序性能测试时,loadrunner和jmeter是两款常用的工具,两者比较起来,jmeter非常轻巧,且开源免费,上手快。这里简单介绍下jmeter的使用,以登录百度进行搜索为例。
jmeter运行需要jdk环境,这个不多做介绍。软件界面:
-
右击“测试计划”,添加一个线程组
线程组界面可以配置线程的数量,“Ramp-Up Period(in seconds):"这个参数是
配置这些线程组在多少时间内完全启动(可以把时间设置长点,这样防止一开始就对服务器造成很大压力),还可以配置循环次数,后面还有调度器配置。
-
分析一下登录百度的过程,首先访问http://www.baidu.com,百度分配给你一个baiduid的cookie;点击“登录”按钮,浏览器会带着相关参数和cookie去请求nsclick.baidu.com;之后百度为了防止csrf攻击(csrf详细解析见:http://www.yeetrack.com/?p=220),会给客户端发送一个token;其后输入username、password,浏览器将用户名、密码、token及相关参数post给passport.baidu.com进行校验,校验成功后,百度会分配给浏览器cookie,这里用的到的有SAVEUSERID和BDUSS两个,上面过程可以通过firefox的插件httpfox轻松得到(关于firefox的插件httpfox,详细见http://www.yeetrack.com/post/2012-11-22/firefox%2520httpfox%25E6%258F%2592%25E4%25BB%25B6)
-
ok,开始了,在线程组内新建一个http请求, 填写域名、端口等信息
访问百度后,服务器会立刻分配一个BAIDUID的cookie,我们需要提取这个cookie,完成后续的认证,右击这个http请求,添加一个正则表达式提取器
它的页面应该类似这样填写:
cookie在返回包中的消息头中,选中消息头,cookie 名字为BAIDUID,正则表达式用来匹配消息头中的cookie,http消息头中的cookie是这个样子:BAIDUID=EB8A76382372306096A079F34C1C84EA:FG=1; H_PS_PSSID=1690_1438_1541_1542_1662_1582,表达式BAIDUID=(.*); 可以提取出其中的cookie value(如果不了解正则表达式,可以参见:http://www.yeetrack.com/post/2012-11-02/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%88%E4%B8%80%EF%BC%89),下面的模板的意思是如果我们写的正则表达式匹配到了多条内容,我们去其中的第几个,如$1$就是取第一个,下面的缺省值指如果没有匹配到内容,就指定一个默认值,这里可以不填写。
-
ok,下一步,点击百度页面右上角的“登录”,用httpfox或者浏览器自带的网络查看去找相应的参数。对应到jmeter中,就是再新建一个http请求,get方法。应该如下填写:
参数共8个,要分别填写在表格里,其中有个参数t,指的是当前的Unix时间戳,jmeter提供一些函数,我们可以直接调用 ${__time()}这个就是调用jmeter的系统函数获取本地时间。
-
呃,忘了一步,第三步中我们用正则表达式,提取出了返回消息http头中的cookie,我们需要将这个cookie,放到jmeter的消息管理器中,这样在jmter在发送http请求时会自动带上相应cookie,右击“线程组”添加cookie管理器组件:
添加完毕,进行配置,应该是这样样子的:
名称是cookie 的key,要和http消息头中的名字对应;值是我们从正则表达式中提取的cookie value,${BAIDUID}是指取出BAIDUID这个变量的值(要和正则表达式页面的名字对应),下面两个是后面用到的。cookie的域和路径依次填好。
-
继续,我们点击了登录按钮,百度为了防止csrf攻击,会给我们一个token(这个token在我们提交密码时一起提交过去),我们要在jmeter中再新建一个http 请求,来获取这个token,get方法。相应参数如图:
我们仍旧需要一个正则表达式来获取这个token,注意这个token并没有放在返回消息的http头中,而是在响应消息中的js代码中,故firefox中我们无法看到,这里我用的是burp suite这个工具(具体使用方法参见:http://www.yeetrack.com/?p=173),在看到那段javascript代码后,我们用正则表达式进行提取:
-
获取完这个token,我们就可以提交用户名和密码了。再次新建一个http请求,构造一个post请求,应该是这样:
注意由于是https连接,故端口为443,参数一共16个,自己去firefox中依次查看并添加到表格中,这里对于ppui_logintime这个参数有些不明白,应该是和本地时间有关,不太确定,随便填写了一个,校验通过了,如果你有更深的理解,欢迎讨论。
post请求之后,服务器校验用户名密码是否匹配,如果通过,服务器会发送cookie到浏览器,ok,再次用正则表达式提取,这次需要提取两个cookie,SAVEUSERID和BDUSS(不要忘记将这两个添加到cookie管理器中)
-
OK ,至此登录动作结束,我们可以试验一下,运行之前我们先添加一个“查看结果树”来统计运行结果。
点击中上方的运行按钮。你的结果应该类似这样:
我们可以看到每个包的发送和相应情况,检查一下是否登录成功。看下面截图,返回消息为浏览器设置cookie,代码登录通过。
-
好了,登录成功,我们来提交个搜索的请求。新建一个http请求,如下图
当然如果我们要搜索的关键词很多,也可以从外面的文件中读取,方法是:在线程组中添加一个csv data set config,这个组件专门用来读取外部的文本文件。
keyword.txt中的关键字要用制定的字符隔开,这样在运行时文本中的关键字会被加载到keyword变量中,我们就可以在脚本中通过${keyword}来引用。
-
最后在添加上结果统计的组件,来分析web程序的性能。
最后分享自己的脚本,http://wangpan.baidu.com/share/link?shareid=149068&uk=537055152。我是在登录动作中加了个一次控制器,让每个线程的登录动作只执行一次,搜索可以执行多次,如果你下载使用,将其中发送用户名、密码的post包中的username和password参数修改成自己的账号即可,然后在d盘下新建keyword.txt,里面放着用逗号隔开的关键词即可。 本文由易踪网原创,如果你喜欢本文,请关注易踪网。