前2个月使用LoadRunner对公司的一个项目新开发的功能进行了压力测试,因为之后要使用Jmeter在其他项目中进行压测,最近又有点空余的时间^_^,

就拿之前做过的项目玩一下,并将遇到的问题记录下来。

jmeter需要登陆的请求如何保持登陆:

1.同一线程组下请求,解决方法:添加登录请求、HTTP Cookie 管理器即可,可自动获取登录(缺点:只能使同一线程组下请求保持登录,不可跨线程组)

   还有一种:添加正则表达式,将cookie值传递给HTTP信息头管理器(只能同一线程组下引用)

2.解决跨线程组登录并自动获取sessionid的问题:需要设置jmeter全局变量并调用。使用正则表达式获取sessionid,BeanShell PostProcessor设置全局变量,HTTP信息头管理器引用全局变量(跨线程组传递cookies值

因为我们不对登录接口进行压测,所以需要采取跨线程组的办法:

        一、添加初始化线程组获取SESSION并设为变量

1)setup thread group ,一种特殊类型的ThreadGroup的,可用于执行预测试操作。

这里设置初始化线程组的原因是:因为我们对压测接口的前提是要先从登陆接口获取SESSION的值,

所以添加一个setup Thread Group,用作于初始化的操作

2)添加HTTP请求

填写登陆接口的请求地址和报文

3)添加正则表达式

登录成功后,那么我们需要获取服务端返回的Cookie值,这里我们使用了后置处理器下面的Regular Expression Extrator组件来处理。

引用名称:其他地方引用时的变量名称,名称只能是一个,引用方法:${cookie}

正则表达式:数据提取器,一般简单的通用语法就是:左边界(.*?)右边界,左右边界就是为了能准确定位到想匹配的内容,如最上面图的"Set-Cookie: SESSION=(.*?);, 其中Set-Cookie: SESSION=和;就是左右边界,(.*?) 是替换了想要提取的内容,里面的'?'为非贪婪匹配,(非贪婪模式就是说在遇到第一个右边界后就停止匹配,这样就可以精确拿到想要的内容)。建议均使用非贪婪匹配,除非特殊情况。

模板:对应正则表达式提取器类型,样式为:$n$。若模板为:$0$,则为整个表达式匹配到的内容,就是包括小括号内跟小括号外的内容;若模板为:$1$,则对应正则表达式中的第一个(.*?)所匹配的内容;若模板为:$2$,则对应正则表达式中的第二个(.*?)所匹配的内容

匹配数字:正则表达式匹配数据的最终结果可以看做一个数组,匹配数字即可看做是数组的第几个元素。当为 0 时,随机返回匹配的数据。当为 1 时,表示返回匹配结果数组的第一个元素。当为负数(-1,-2,-100都可以)时,表示返回全部元素,并且同时会返回一个元素总数的变量token_matchNr,在引用时:通过${token_1}的方式来取第1个匹配的内容,${token_2}来取第2个匹配的内容。

缺省值:匹配失败时的默认值。通常用于后续的逻辑判断,建议使用一些特殊含义的,比如0,NULL,ERROR等。

如图设置引用名称:cookie、正则表达式:Set-Cookie: SESSION=(.*?);、模板:$1$、匹配数字:1

 提取如下Response Headers里的SESSION:

 

4)添加BeanShell PostProcessor

BeanShell PostProcessor设置全局变量,${__setProperty(newcookie,${oldcookie},)}; 设置全局变量newcookie

如图${__setProperty(releasecookie,${cookie},)}; 设置全局变量releasecookie

 

二、添加正常线程组并引用全局变量

1)添加HTTP Cookie 管理器

HTTP信息头管理器引用全局变量,${__P(newcookie,)}引用全局变量newcookie

如图使用${__P(releasecookie,)}引用全局变量releasecookie

 

2)添加需要压测的HTTP请求

3)添加监听器-查看结果数、响应时间和TPS