写在最前页面:
本篇BLOG仅仅是根据我自己的实际经历,来说明Jmeter的一些基本用法,并无恶意,谢谢!
前段时间,无意中发现CSDN的博客支持了Markdown语法,于是我就使用CSDN的“博客搬家”功能,将博客从ITEye迁移至CSDN了。迁移之后,一直没有时间来打理。最近,得空看了一眼搬家到CSDN的博客,感觉很多方面还不错,但是有一个方面让我很郁闷,就是,之前在ITEYE中的博客的“tag”,搬迁到CSDN之后,全部变成了“博客类别”,这直接导致我的博客类别有600多个。。。
咋一看,觉得没多少啊,但是请大家注意看上图右边的滚动条。此刻我的内心是崩溃的。:(
这么多可咋办呢?删除呗。但是,CSDN又没有提供批量删除的功能,于是,我只能一个一个的手动删除起来了。刚删了没几个,觉得这不对啊。我大概算了一下,删除一个标签,平均下来算它花费3.5秒。那么,我删除这600个标签,总共要的时间至少为:
3.5 * 600 / 60 = 35 分钟
转身一想,身为程序猿的我,处理这种事情怎么能这么LOW呢。
于是乎,想起了之前测试web应用时所使用过的神器Jemeter,同时有一款配合使用的软件badboy。它们正适合此场景来使用。哈哈。
下面开始步入正题,说明一下,如何使用Jemeter来批量删除类别。
使用badboy录制删除一个博客类别的脚本
参照上图,先在红框框处,输入CSDN的登陆页面的地址,然后,点击它右边的的绿色小箭头,就可以打开CSDN的登陆页面了。
接下来,在页面中完成登陆操作,并跳转至博客类别管理页面,然后,删除一个类别。这之后,点击,badboy工具栏中的“红色按钮”来停止录制脚本。
将badboy录制的脚本导出为Jemeter的格式
用Jemeter打开导出的脚本
从图中可以看到,这个脚本有很多步骤是我们不需要的,比如,“pos.baidu.com/acom”这种的,我们需要把它从脚本中删除。
最终,我将它删除成如下这个样子:
登陆CSDN 请求
另外两个HTTP请求分别是:
获取所有博客 请求(其实,这个请求也可以删除的)
删除指定 博客类别 请求
另外,我为了下面好描述,在脚本了增加了一个叫“察看结果树”的监听器,它的作用就是可以把你发送的每个请求都记录下来,然后你可以查看每个请求的具体状态。
我本以为修改一下所需删除的博客类别的ID,然后运行这个脚本就可以了的。但是,没想法,我连登陆都登陆不上去。
从图中可以看出,当我们执行第二个请求的时候,CSDN返回的是“帐号登录”页面,也就是我执行了这个脚本之后,CSDN都没有登陆得上,更别谈删除博客类别了。
可是,这是为什么呢?这个是用badboy录制的脚本啊,为什么再执行就不行了呢?
于是,我重新看了一下登陆CSDN请求,看到了它所需要的参数里,有“lt”和“execution”这两个参数比较可疑,由于调查了一下。
我用Chrome打开了CSDN的登陆页面,F12打开Chrome的控制台,定位到它的登陆按钮,有一行赤裸裸的注释告诉了我秘密:
我几次刷新页面之后,这两个参数的值是会发生变化的。
所以,我自然而然的想到一个方法:先发送一个 登陆请求, 然后从这个请求的返回中 提取出所需要的两个参数的值,然后再次发送一个 登陆 请求,并使用提取出来的值作为参数值发送给服务器。
那么,问题来了,要怎么样来提取这两个参数的值呢?
还好,之前测试的时候,使用过 正则表达式 来从请求的响应中提取 相关内容。
首先,添加一个 HTTP请求 sampler
然后,在它的下面增加两个“正则表达式提取器”这个后置处理器
先简单说一下正则表达式提取器的参数的意义:
- 引用名称:就是声明一个变量,供其他组件来调用,比如上面声明了一个lt的引用名称,那么,那他组件便可以来引用它,引用的方式是 ${xxx},比如,${lt}
- 正则表达式:用来提取指定内容的正则表达式
- 模板:要返回的值的格式,可以使用$number$来引用正则表达式返回的某个组。像我上面的那个$1$,表示仅仅返回正则表达式返回的第1组的内容。如果改成$1$–$1$,则表示,用–连接正则表达式的第1组的内容,并返回。
PS:正则表达式的相关知识在此不作说明,请自行查阅。
上面增加正则表达式提取器之后,下面,我们需要修改一个CSDN LOGIN这个请求的参数值了
好了,经过以上修改,重新运行这个脚本,可以看到,的确可以正常删除指定的博客类别了。
可是,感觉好像还有什么不对劲的样子。。。
不错,我们要删除的是600多个 类别,如果每个类别都要这么执行一下脚本,那和从浏览器上一个一个的删除有什么区别呢?我们要的是批量删除!批量删除!
这个时候,又得感谢之前测试的工作了,因为Jmeter提供了一种方法来实现批量操作啊,简单来说,就是把所有要删除的类别的ID列在一份CSV文件中,然后让Jmeter来遍历这个CSV文件进行批量删除。下面来说使用方法。
添加“CSV Data Set Config”这个元件
下面说一下“CSV Data Set Config”这个元件各个参数的意义
- FileName:就是你要使用的CSV文件的路径
- File encoding:为了避免乱码问题,请填写与你CSV文件所使用的编码一样的编码格式
- Variable Names:将CSV的每一行,按指定分隔符分割之后,每个分割结果对应的变量的名称
- Delimiter:每一行分割所使用的分割符
- 其他的几个我也没怎么具体了解过,请自行查阅
CSV文件的内容为
总共600多个,这里只截了20来个
好了,修改完毕,重新跑一下脚本吧:
不对啊,应该是删除600多个呢啊,怎么还是只发送了一个 删除 请求啊,这不科学啊。
好吧,先来看一眼 线程组的配置:
从图里可以看出,这个线程组里只有一个线程,而且只循环一次就结束了。所以啊,即使我们配置了从CSV文件里读取,但是因为每次运行脚本时,只有一个线程去文件里读取,所以就只会发送一个请求啊。
这个时候,你可以想着去修改线程数或者循环次数来达到读取CSV文件中所有行的内容。这么做可以是可以,但是不推荐这么做。为什么呢?因为这样改了之后,你每循环一次,就要把整个流程都要跑一遍,从登陆到删除,都要跑一次,这样很浪费,别搞得CSDN把你的IP给封了。
那么,有没有什么办法来遍历CSV中的所有行呢?当然有啦,这个时候,就轮到“循环控制器”上场了。
上图中的循环次数只要等于你的待删除的类别的数量就可以了。
OK,到此结束,我们最后来看一下,这个时候,脚本运行的最终结果: