Jmeter跟postman都是接口测试的最常用工具,但Jmeter还可以进行压力测试,这点就挺好。下面就介绍一下使用方法和功能:
一、jmeter 的下载跟安装
这是下载安装包的地址,下载后解压,D:\apache-jmeter-3.1\bin\jmeter.bat 不需要安装,直接双击jmeter.bat就可以进入界面了。
* 因为jmeter是java开发的,因此需要提前安装java jdk1.8+
二、线程组,一个项目用一个线程组,测试计划 -> 添加 -> Threads -> 线程组
三、我们添加了线程组之后,就开始添加请求了,右键线程组, 添加 -> sampler -> http请求
一个http请求就是一个接口,开始配置各个参数:
端口号我们设置为80,这样一个get请求就设置好了。
下面在来一个post 方式的请求:
post方式的提交跟 get不同的是,有 request body,在Body Data里设置json格式的数据,作为提交到服务器的参数。
三、那么我们提交了请求,现在就应该看看结果了,这时候在所在请求上,右键 -> 添加 -> 监听器 -> 观察结果树
在实际工作中,我们都是一个请求对应一个结果树。
下面有三个选项卡,通过查看请求跟响应数据可以看到我们想要的数据。返回的请求结果。
四、经常遇到入参变动,这时候可以考虑,将其设置为变量,jmeter提供了三种方式设置变量
1、用户自定义变量 :
在所在的请求上右键,添加、配置元件、用户自定义变量。
定义好了,如何引用呢? ${domain} 通过这个就可以了。
3、用CVS文件读取:
在所在的请求上右键,添加、配置元件、CVS Data Set Config。
第二种不常用就不说了。
五、有一种情况就是,服务器域名、端口、协议、编码都是相同的,那么我们没有必要每一个请求都添加一遍,这个时候可以使用,http请求默认值:
右键测试计划、添加、http默认请求。
六、我们在接口请求的时候经常是处于登录状态下的,没有cookie或者token,无法请求一些私密性的接口:
所在请求上右键、添加、配置元件、cookie管理器,在里面设置三个参数,key value domain
七、jmeter断言提供了几种方法,我喜欢bean shell函数,比较灵活:
所在请求上右键、添加、断言、bean shell断言,
String response = "";
// Str 就是接口的一个字段, response就是接口内容
String Str = "\"externalSignInProviders\":[{\"provider\":\"WeChat\",\"providerDisplayName\":\"微信\"},{\"provider\":\"QQ\",\"providerDisplayName\":\"QQ\"},{\"provider\":\"GitHub\",\"providerDisplayName\":\"GitHub\"}]";
response = prev.getResponseDataAsString();
if(response == ""){
// 设置断言失败为真
Failure = true;
FailureMessage = "系统无响应,获取不到响应数据!";
log.info(FailureMessage);}
else if(response.contains(Str) == false){
// 设置断言失败为真
Failure = true;String Msg = "\n系统返回响应结果与期望结果不一致!请排查是性能问题,还是程序代码问题";
FailureMessage = Msg + "\n" + "期望结果:\n" + Str + "\n" + "响应内容: \n" + response +"\n";
log.info(FailureMessage);
}else{
// 设置断言失败为假
Failure = false;
log.info("期望结果:\n" + Str + "\n" + "响应内容: \n" + response +"\n"+"一致通过");}
八、 有的时候,上一个请求返回的接口中提取指定的值,用来做下一次请求的参数,就叫做接口关联,我喜欢使用json提取。还可以使用正则表达式提取。
所在请求上右键、添加、后置处理器、json extractor,
先看看接口结果:
{"publicKey":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0MccuMeXCHgVlGOoYyFwLdS24Im2e7YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdgOQT6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvXH0zDKfi02prknrScAKC0XhadTHT3Al0QIDAQAB","externalSignInProviders":[{"provider":"WeChat","providerDisplayName":"微信"},{"provider":"QQ","providerDisplayName":"QQ"},{"provider":"GitHub","providerDisplayName":"GitHub"}],"externalSignedIn":null}
根据接口的结构,这样添加就可以了。
* 注意请求的顺序,必须是提供参数的请求在先,接收参数的请求靠后。