JMeter Cookie的使用场景
工作中的场景,比如某个系统,需要先登录,然后进行添加门店、添加会员、添加会员等操作,这些操作可执行的前提是要先登录。用户在登录的时通常会生成cookie,接下来的操作中都要带上cookie。还会遇到一些场景,只需要登录一次,接着进行其他操作,还有跨线程怎么传输cookie。
整体的思路:
- setUp线程组中登录,登录后使用正则把cookie取出来
- 通过BeanShell把变量设置为全局变量,供跨线程使用
- 在一个普通线程组中添加HTTP Cookie管理器,把登录生成的cookie值引用到cookie管理器中
HTTP Cookie管理器定义
Cookie Manager元素具有两个功能:
-
首先,它像Web浏览器一样存储和发送cookie。如果您有HTTP请求,并且响应包含cookie,则cookie管理器会自动存储该cookie,并将其用于将来对该特定网站的所有请求。每个JMeter线程都有其自己的“ cookie存储区”。因此,如果您正在测试使用cookie来存储会话信息的网站,则每个JMeter线程将拥有自己的会话。请注意,此类cookie不会出现在Cookie Manager上,但可以使用“查看结果树监听器”看到它们。
-
JMeter会检查收到的Cookie是否对该URL有效。这意味着不会存储跨域Cookie。如果您有错误的行为或希望使用跨域cookie,请定义JMeter属性“ CookieManager.check.cookies = false ”。
收到的Cookies可以存储为JMeter线程变量。要将cookie保存为变量,请定义属性“ CookieManager.save.cookies = true ”。另外,在存储cookie名称之前,它们以“ COOKIE_ ”为前缀(这避免了局部变量的意外损坏)。若要恢复原始行为,请定义属性“ CookieManager.name.prefix = ”(一个或多个空格)。如果启用,则名为TEST的cookie的值可以称为$ {COOKIE_TEST}。 -
其次,您可以手动向Cookie管理器添加cookie。但是,如果执行此操作,则cookie将被所有JMeter线程共享。
请注意,此类Cookie的创建时间是将来的很远
默认情况下, 具有空值的Cookies被忽略。这可以通过设置JMeter属性来更改:CookieManager.delete_null_cookies = false。请注意,这也适用于手动定义的Cookie-更新后,所有此类Cookie都会从显示中删除。还要注意,cookie名称必须唯一-如果用相同的名称定义了另一个cookie,它将替换第一个。
总结一下:
- HTTP Cookie管理器可以自动管理cookie,前面有讲解过,就把cookie管理器加上去就行了
- 也可以对cookie进行跨域使用,跨域使用就是前面所说的思路。
还是拿部署好的教育系统进行实战讲解:
一、实操
1.新增setUp线程组
setUp线程组下一节在做具体讲解,setUp线程组执行一个初始化的操作,在普通线程组之前直接,而且只执行一次。比如现在我们就只需要登录一次,然后接着操作学校列表接口、禁用、启用学校等。
2.在setUp线程组中进行登录
登录后抓取cookie的值,通过抓包或者直接在查看结果树中看,cookie的值在响应头中。
3.通过正则提取cookie的值
通过正则提取cookie的值,关联和正则的相应的说明在前面的文档有详细说明。
4.通过beanshell设置存放cookie的变量为全局变量
添加一个beanshell取样器,在脚本中编写:
${__setProperty(new,${c},)};
c是上面正则提取处理的变量值;new是新定义的全局变量;
要设置为全局变量才能跨线程使用
5.在另外的一个线程组中添加cookie管理器
在另外线程组中添加cookie管理器,把cookie的值引用过来
${__P(new)
域和值一定要填写正确,域填写错不起作用的。
“ domain ”(域)是服务器的主机名(不带http://);该端口当前被忽略。域直接写主机名就可以了。
6.在线程组中添加请求
在线程组中添加一个学校列表页,接口都可以写在这个线程组中,这些接口的共同特点就是都需要先登录,才有权限访问。
新增一个学校列表页接口,请求成功。