Jmeter
BeanSehll
在接口之前的动作
import org.apache.commons.codec.digest.DigestUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
//String time = "2019091816355";
String time = dateFormat.format(date);
String clicode = vars.get("clicode");
String usertype = vars.get("usertype");
String serviceno = vars.get("serviceno");
String key = "epg_Henan_points2019";
String str = clicode+'&'+serviceno+'&'+ time+'&'+ usertype+key;
String token = DigestUtils.md5Hex(str);
vars.put("token",token);
vars.put("time",time);
取样器Sampler:进行脚本逻辑控制(各种请求)
线程组:场景设置
线程数:用户数(虚拟用户数)
Ramp-Up Period(in seconds): 加压策略
调度器:持续压测时间 需要把循环的勾选上
监视器:监控我们脚本运行,取得性能指标
注意做性能测试的时候最好不要使用断言,jemter有这个bug
监听器可以添加断言结果,查看断言结果
jmeter变量
用户定义的变量 添加->配置元件->用户自定义的变量 ,使用时 ${变量名称}
文件参数化
1、函数助手__csvRead:选项->函数助手
csv文件分隔符是逗号
把csv路径写入
csv文件列号
生成函数:把这个粘贴 复制到实际使用的地方
2、csv data set config
- 如果文件是txt,需要使用,分割
- 如果文件是csv,直接在表格中输入,实际用记事本打开也有,
变量名 a,b,c 使用时${a}
函数助手__randomstring
随机字符串
Jmeter查看结果树:
JSON PATH Tester: $.xxx.xxx $是根节点的意思
Regexp Tester: xxx(.*?)xxx ?是非贪婪匹配
xpath tester:可以在浏览器复制出XPATH
信息头管理器
User-Agent:可以copy浏览器访问的粘贴过来,模拟浏览器访问,某些接口不带这个头不能正常返回
断言
- xpath Assertion:用的比较多的是响应断言
- json 断言 $.xxx.xxx $是根节点的意思
- 正则断言
必备正则表达式

- 在响应结果里拿到某个值:后置处理器->正则表达式提取器 前面的(.+?)后面的 模板:$1$ 匹配第几个
- 可以在线程组添加 Debug Sampler 用于查看正则表达式提取的值对不对
- 正则表达式可以使用逗号分割,写几个,模板是 $1$ $2$ 使用的时候 ${变量名_g1} $
后置处理器
JSON path:
如果返回结果是json格式的数据,可以使用jsonpath获取结果$ 代表根节点 如何获得数组类型的: $.data.files[*].fileid $.data.files[0:3].fileid
正则:
获取数组:匹配数字是0,返回的随机的匹配到的 如果一次性全都匹配到 匹配数字填写-1 ,可以配合逻辑控制器foreach使用 ,把控制器放到http请求的后面处理获得的数组
HTTP cookie管理器
当测试某个接口需要先登录的时候
方法1:线程组添加http cookie管理器
方法2:登录接口添加正则表达式处理器,把id值取出来,然后再接下来的接口添加HTTP cookie管理器 讲取得的id赋值(有可能需要填入path和域:IP地址)
token处理
有的接口入参需要token,token的值一般是在这个请求之前的某个接口返回的,可以用fidller抓包后查看
返回编码问题,看不出来中文是什么
可以把请求代理设置为127.0.0.1 端口8888 投到fidller查看
写入结果到excel
下载jxl.jar包放到jmeter的lib下,需要利用beanshell写java代码讲结果写入excel中
用例编号、用例标题、测试数据、预期结果、实际结果、执行结果
得先写一个java程序,导出成jar,放到jmeter的lib的ext下使用

import com.cw.CWOutputFile;
CWOutputFile t=new CWOutputFile();
String filepath=t.cOutputFile("测试");
vars.put("filepath",filepath);
import com.cw.CWOutputFile;
CWOutputFile s = new CWOutputFile();
s.wOutputFile("${filepath}","1","用例名称1","{xxxx}","预期结果","预期结果");
import com.cw.TestReport;
import org.json.JSONObject;
TestReport s = new TestReport();
String response_data = prev.getResponseDataAsString();//获取接口返回的response数据
JSONObject response = new JSONObject(response_data);
testResult=false;
if(response.get("code").toString().equals("0"))
{
testResult=true;
}
String oriData = prev.getSamplerData();
int start = oriData.indexOf("{");
int end = oriData.lastIndexOf("}") + 1;
String requestData = oriData.substring(start, end);
s.writeResult(vars.get("filepath"),prev.getSampleLabel(),prev.getUrlAsString(),requestData,prev.getResponseDataAsString(),testResult);
测试用例csv
用例编号、用例标题、预期结果
参数化数据csv
入参:参数化数据也可以和测试用例设计成一个csv
单个上传文件
files upload
文件名称:本地路径
参数名称 :file
MIME类型:docx
批量完成文件上传
需要用到参数化 ,单个用户批量文件上传
将文件地址、大小进行参数化放到csv文件中

jmeter插件
TPS插件
Transactions Per Second(每秒传输的事物处理个数)即服务器每秒处理的事务数
插件安装方法:将lib目录下的jar包拷贝到jemterlib对应目录下
重启 JMeter,发现监听器中已经支持 TPS、TRT 等视图了:
使用方法:线程数设置为50,循环时间为60秒,观察TPS
集合点:flag可以放到运行参数中用来测试强并发,
-
就是在一时刻同时发送,而不是一个时间段陆陆续续发送
-
需要用到if控制器【控制是否启用集合点】 ${__jexl3("${flag}"=="1")}
-
在if控制器中添加定时器Synchronizing Timer,在定时器中输入用户数
-
在控制器下再添加一个BeanShell取样器 log.info("线程数量:>${__threadNum}")
内置变量
pre:
- pre.getResponseCode()
- pre.setSuccessful(true)
Failure
使用JDBC Request 到数据库查询内容 ,在beanshell中 使用 ${变量_#} 可以获得行数
json的数量是 ${变量_matchNr}
线程组与循环的误区




浙公网安备 33010602011771号