jmeter使用基础
1参数关联
一、Jmeter关联的方式:
Jmeter中关联可以在需要获取数据的请求上 右键-->后置处理器 选择需要的关联方式,如下图有很多种方法可以提取动态变化数据:
二、正则表达式提取器:
1、比如需要提取如下响应文本中的 “<title>百度一下,你就知道</title>” 里面的 “百度一下,你就知道”:
2、设置正则表达式提取器:
说明:
(1)引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它。
(2)正则表达式:
():括起来的部分就是要提取的。
(3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$$3$等等,表示解析到的第几个值给title。如:$1$表示解析到的第1个值
(4)匹配数字:0代表随机取值,1代表全部取值,通常情况下填0
(5)缺省值:如果参数没有取得到值,那默认给一个值让它取。
3、使用2中获取到的值:
三、关于正则表达式的举例说明:
1、提取单个字符串:
假如想匹配Web页面的如下部分:name = "file" value = "readme.txt">并提取readme.txt。一个合适的正则表达式:name = "file" value = "(.+?)">。
():封装了待返回的匹配字符串。
.:匹配任何单个字符串。
+:一次或多次。
?:不要太贪婪,在找到第一个匹配项后停止。
2、提取多个字符串:
假如想匹配Web页面的如下部分:name = "file.name" value = "readme.txt">并提取file.name和readme.txt。一个合适的正则表达式:name = "(.+?)" value = "(.+?)"。这样就会创建2个组,分别用于$1$和$2$
比如:
引用名称:MYREF
模板:$1$$2$
如下变量的值将会被设定:
MYREF: file.namereadme.txt
MYREF_g0: name = "file.name"value = "readme.txt"
MYREF_g1: file.name
MYREF_g2: readme.txt
在需要引用地方可以通过:${MYREF}, ${MYREF_g1进行使用。
1:Json后置处理器提取结果作为下一个sampler的传入参数
1.1:【线程组】->【简单控制器】->【HTTP sampler】->【Beanshell后置取样器】->【查看结果树】
1.2:Beanshell后置取样器获取HTTP请求1所有响应数据returnData和其中单独的数据
log.info(returnData)可以在Log中输出returnData的值
1.4:添加第二个sampler
1.5:查看结果树 HTTP请求1的响应数据作为HTTP请求2的POST Data传入服务器
2:Beanshell对Json数据的增删改查
2.1:Beanshell后置处理器对响应数据的查询
2.1.1:eclipse的httpclient获取接口返回数据
Maven导入的Jar包
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.5</version> </dependency> |
package Test.Json; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.junit.Test; import com.alibaba.fastjson.JSONObject; public class GetJsonData { private String URL = "http://mobile.weather.com.cn/data/sk/101010100.html"; // Get方法获取 http://mobile.weather.com.cn/data/sk/101010100.html @Test public void GetMethodData() { HttpGet httpGet = new HttpGet(URL); CloseableHttpClient httpClient = HttpClients.createDefault(); try { CloseableHttpResponse response = httpClient.execute(httpGet); int code = response.getStatusLine().getStatusCode();// 获取返回状态码 System.out.println(code); String returnData = EntityUtils.toString(response.getEntity());// 获取接口返回的text格式数据 System.out.println(returnData); //====================================================================== // 将text格式数据转换成JSON格式数据 JSONObject jsonObject = JSONObject.parseObject(returnData); // sk_inf为Json的一个节点 节点下采薇key value键值对 JSONObject data = jsonObject.getJSONObject("sk_info"); System.out.println(data); //====================================================================== //增 data.put("phone", 110); System.out.println(data); //====================================================================== //删除 data.remove("cityName"); //====================================================================== //改 data.put("phone", 120); //====================================================================== //查询 data.get("phone"); } catch (Exception e) { System.out.println(e); } } } |
2.1.2:Beanshell对响应Json数据的删除
Beanshell后置处理器脚本
//导入Json jar包 import com.alibaba.fastjson.JSONObject; String returnData = prev.getResponseDataAsString(); log.info(returnData); //将获取的数据放入 方便下面的sampler取值 JSONObject jsonObject = JSONObject.parseObject(returnData); JSONObject data = jsonObject.getJSONObject("sk_info"); //eclipse里面不用toString Jmeter中需要 log.info(data.toString());//这里输出有“北京” data.remove("cityName"); log.info(data.toString());//这里输出没有"北京" vars.put("returnData",returnData); vars.put("data",data.toString());//data不是string形式变量 需要toString转换 |
HTTP请求2
查看结果树
2.1.3:Beanshell对响应Json数据的增
//导入Json jar包 import com.alibaba.fastjson.JSONObject; String returnData = prev.getResponseDataAsString(); log.info(returnData); //将获取的数据放入 方便下面的sampler取值 JSONObject jsonObject = JSONObject.parseObject(returnData); JSONObject data = jsonObject.getJSONObject("sk_info"); //eclipse里面不用toString Jmeter中需要 log.info(data.toString()); data.put("name","Anndy"); log.info(data.toString());//这里输出增加"name":"Anndy" vars.put("returnData",returnData); vars.put("data",data.toString());//data不是string形式变量 需要toString转换 |
2.1.4:Beanshell对响应Json数据的改
//导入Json jar包 import com.alibaba.fastjson.JSONObject; String returnData = prev.getResponseDataAsString(); log.info(returnData); //将获取的数据放入 方便下面的sampler取值 JSONObject jsonObject = JSONObject.parseObject(returnData); JSONObject data = jsonObject.getJSONObject("sk_info"); //eclipse里面不用toString Jmeter中需要 log.info(data.toString());//cityName:北京 data.put("cityName","南京"); log.info(data.toString());//这里输出增加"cityName":"南京" vars.put("returnData",returnData); vars.put("data",data.toString());//data不是string形式变量 需要toString转换 |
2.1.5:Beanshell对响应Json数据的查
//导入Json jar包 import com.alibaba.fastjson.JSONObject; String returnData = prev.getResponseDataAsString(); log.info(returnData); //将获取的数据放入 方便下面的sampler取值 JSONObject jsonObject = JSONObject.parseObject(returnData); JSONObject data = jsonObject.getJSONObject("sk_info"); //eclipse里面不用toString Jmeter中需要 log.info(data.toString()); String city = data.get("cityName"); vars.put("returnData",returnData); vars.put("city",city); |
2.1.6:放入list集合
//导入Json jar包 import com.alibaba.fastjson.JSONObject; String returnData = prev.getResponseDataAsString(); log.info(returnData); //将获取的数据放入 方便下面的sampler取值 JSONObject jsonObject = JSONObject.parseObject(returnData); JSONObject data = jsonObject.getJSONObject("sk_info"); //eclipse里面不用toString Jmeter中需要 log.info(data.toString()); //beanshell不能使用泛型 List list = new ArrayList(); list.add("AAA"); list.add("BBB"); list.add("CCC"); data.put("nameList", list); //vars只能放入基础类型数据 vars.put("data",data.toString());//data不是基础类型 所以需要转换 否则会报错 |