JMeter 使用正则和JSON提取器参数化(常用于提取token/cookie)

正则式:

<input type="hidden" name="returnUrl" value="(.+?)" /> // 提取HTML中隐藏域的值
^(.*)$  // 提取整个response返回
<input value="(.+?)".*\n.*My Label   // 提取My Label关联的input的值
<input value="radio43" type="radio" name="myradio" id="long_nested_path"/>
<label for="long_nested_path">My Label</label>

"(.+:create:.+?)"   // 提取下面link的href的值
<a href="?wicket:interface=:4:create::ILinkListener:">
JSESSIONID=(.*);Path=/ // 从Response的Headers中抓取Cookie JSESSIONID的值
Set-Cookie: JSESSIONID=(.*?);  // 从Headers抓取JSESSIONID,非贪婪

正则替换字符串:

${__strReplace(${returnUrl},"&amp;","&")}或者 ${__unescapeHtml(${returnUrl}\,&amp;\,&)}

传参数组:

例如参数格式是:
{
a:“1”,
b:“2”,
c:[“3”,“4”]
},则只需要使用json格式传入就好了。

首先添加http请求,然后选择消息体数据,将json数据填好。这里使用了csv文件参数化。

 

 

再添加http信息头管理器,设置Content-Type为application/json。

一、使用正则表达式提取器提取token

 查看登录响应参数找出token。图中token为 "ticketString": "ccf26b17-a96f-4913-8925-9bbf737bef35"

 

使用正则表达式提取器提取token

 

 

 

当其他线程组需要使用token时,需要使用BeanShell Sampler设置全部变量,${__setProperty(newtoken,${token})}

 

在“HTTP信息头管理器”使用   ${__property(newtoken)}   引用token ,需要注意设置和引用时的区别,name里面的token为我们需要传入变量名,不是我们提取token时自定义的变量

 

在结果树里面,查看引用了token请求的RequestHeaders,若显示token值则表示token引用成功,若显示的是 ${__property(newtoken)} 则表示引用失败,失败原因从使用正则提取token开始排查

2. 提取cookie:登录后根据正则表达式提取cookie,cookie位于响应头中的set-cookie字段。

正则:Set-Cookie: (.*);Path=/;

在线程组一级添加一个http cookie manager。并且要在每个请求下面都添加一个http cookie manager,虽然什么东西都不用填写,但是必须添加,不然只会让紧跟在登录请求后的那个请求有cookie,后面的请求都没有cookie。

二、使用json提取器提取token

首先查看登录响应数据结构

 

 使   $.data.ticketString   提取token,提取后引用方式都相同

 

查看引用token是否成功

 

注:利用上面两种方法基本上可以提取任何响应的数据并将其参数化

三、常见问题

1、在线程组中引用另一个线程组定义的参数时,参数的值未被引用。(已使用json Path Tester或RegExp Tester验证提取的方法能提取出值)

问题原因:线程组(Thread Group)之间是同级的,在使用Jmeter默认配置时,线程组是无序并行运行的,所以可能会出现线程组1还没提取出参数的值,线程组2却已经引用了参数。

解决方法:点击TestPlan(测试计划) --> 勾选RunThread Groups...,让线程组按排列顺序执行即可。

主要的函数如下:
1.将字符串转为大写或小写: ${__lowercase(Hello,)}  ${__uppercase(Hello,)}
2.生成字符串:  __RandomString函数
3.取字符串中的子串:  __substring函数
4.从文件中按行取字符串:   _StringFromFile函数   (注:然后取子串,进行处理,取行中特点的值)
5.分割字符串  用指定的分割符分割:  __split或者${__javaScript( "aaa|bbb|ccc".split("|")[1],d1)}

函数的组合使用
文件test.txt中每行数据的格式为:13400000001,123456
要求:从文件中取出手机号,作为参数
方法:
1.先利用__StringFromFile函数从文件中取出一行数据
即:${__StringFromFile(e:\test.txt,,,)}

2.然后利用__substring函数取出行数据中的前11个字符,即手机号,如下:
${__substring(${__StringFromFile(e:\test.txt,,,)},0,11,)}

3.__lowercase函数  __uppercase函数  转变大小写
${__lowercase(Hello,)}
${__uppercase(Hello,)}

4.__RandomString函数  生成特定长度,由指定的字符组成的字符串
${__RandomString(5,abcdef,teststr)}

5.__substring函数  取字符串中的子串,指定起始下标
${__substring(hell world,5,10,)}
   
6._StringFromFile函数  从文件里面取数据,按行取

7._StringFromFile函数是从一个文件中读取一个字符串,用来实现参数化,
一次读取一行
${__StringFromFile(E:\test.txt,test,,)}

8.__FileToString函数   将文件转换为字符串
${__FileToString(e:\test.txt,,)}

${__split(${string},,)}  分割字符串

9.另一种js分割方法
${__javaScript( "aaa|bbb|ccc".split("|")[1],d1)}
 
10.替换参数或者获取的字符串,使用beanshell前置处理器脚本,具体操作:
  a)、 添加beanshell前置处理器,获取JMeter脚本中的变量 ${demoParam}
  import java.text.*;

 String demo = vars.get("demoParam");

b).将数据保存到JMeter脚本中的变量 ${demeParam}

String str= demo.replace("/Home/Menu?ticket=","");

vars.put("demoParam", str);

c). 将信息写入到JMeter.log文件

String demo = "ABCD";

log.info("this is a demo log" + demo);

d). prev - (SampleResult): 获取前面的sampler返回的信息,常用用法:

System.out.println(prev.getResponseCode());

System.out.println(prev.getResponseDataAsString());

prev.setResponseCode("222");

System.out.println(prev.getResponseCode());

prev.setResponseMessage("qiaoyeye你好");

System.out.println(prev.getResponseMessage());

prev.setResponseData("qiaoyeye你好","UTF-8");

System.out.println(prev.getResponseDataAsString());

System.out.println(${port});

System.out.println(ctx.getThreadNum());

e). props:即JMeterProperties - class java.util.Properties,操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是put函数,value数据类型只能为String,不能是一个对象。对应于java.util.Properties。

    aa) props.get("START.HMS");  注:START.HMS为属性名,在文件jmeter.properties中定义

    bb) props.put("PROP1","1234");

 

posted @ 2020-11-01 20:18  anlcy  阅读(1534)  评论(0编辑  收藏  举报