其实JMeter不仅仅是一个优秀的压力测试工具,还是一个优秀的针对Web应用的调试、单元测试、功能测试工具。在本文的最后,会详细描述如何用JMeter的录制(Recording)功能调试Web应用。
使用JMeter,首先要对理解一些概念。
测试计划(Test Plan)
测试计划就是保存所有测试信息的容器,比如要测试的REST API、Cookies、线程配置以及测试报告等。一个测试计划可以保存成一个.jmx文件。
线程组(Thread Group)
线程组可以说load test中最重要的一个配置。可以配置起多少个并发线程,以及每个线程执行多少次,或者执行多长时间。具体来说,可以配置以下各项,
1、线程属:也即是并发请求数。在压力测试中,往往是要测试服务器在不同并发请求数的情况下性能,比如TPS,AVG response time等;
2、线程的调度配置
2.1、循环次数:精确控制每个线程执行多少次;
2.2、启动延迟:控制延迟多久后才启动线程;比如点击开始运行之后,并不是马上开始向服务器发送请求,而是希望是30秒后才开始,那么就可以设置该参数为30秒;
2.3、持续时间:控制测试运行的时间。比如测试运行10分钟后自动停止;
2.4、启动时间和结束时间:设置测试一个启动时间点和一个结束时间点。注意:如果设置了“启动延迟”,则忽略“启动时间”;如果设置了“持续时间”,则忽略“结束时间”配置。
如果“循环次数”和“持续时间”/“结束时间”都定义了,那么不管哪个条件先达到,测试就自动停止。
用户定义变量(User Defined Variable)
用户定义变量是一种配置元素(config element),可以预先定义一些变量。当一个测试计划中有一些随着环境变化的参数,那么正确的做法就是为这些参数定义变量,然后在需要的地方使用变量。这样,当测试环境改变的时候,只需要修改变量的值。比如假设你要测试的服务器地址是 https://www.yourcompany.com:9080,而且所有的REST API的都是针对这个服务器的,只是各种的具体path不同。那么就可以考虑将服务器的hostname和port定义成变量:
srv_port: 9080
默认HTTP请求(HTTP Request Defaults)
一般测试的所有REST API(REST请求都是基于HTTP的)的基本URL都是一样的,例如假设有下面两个REST API:
https://www.yourcompany.com:9080/test/api/v3/sample1;
https://www.yourcompany.com:9080/test/api/v3/sample2;
他们的基本URL都是https://www.yourcompany.com:9080。那么就可以定义一个默认的HTTP请求,将基本URL信息设置进去。然后对每个REST API再定义一个HTTP Request,对每个不同的REST API,只需要设置path(例如: /test/api/v3/sample1 或 /test/api/v3/sample2)以及相应的参数。
CSV数据集配置(CSV Data SET Config)
有时在测试中,要对REST请求提供的不同的参数值,那么就可以将这些不同值定义在CSV文件。每次从CSV文件中读取一行,然后拆分到不同的变量中。
HTTP Cookie管理器(HTTP Cookie Manager)
该元素的作用是管理每个HTTP请求的Cookie信息。主要有两种管理Cookie的方式:
1、完全像浏览器一样管理Cookie。比如你在登陆你的邮箱的时候,输入用户名和密码,登录进去之后,浏览器就自动保存了服务器返回的包含验证token等信息的Cookies,在随后的各种操作请求中,会自动带上这些Cookies,否则服务器会认为请求未通过验证。HTTP Cookie管理器可以达到和浏览器同样的行为。你只需要创建一个HTTP Cookie管理器,无需为其添加任何配置,那么任何一个HTTP Response里面的Cookie信息会被自动保存,并被用于随后的HTTP Request。
另外,也需要在jmeter.properties中设置如下配置项:
HTTP头管理器(HTTP Header Manager)
顾名思义,HTTP头管理器就是为HTTP请求设置头部信息。
JSON Extractor
JSON Extractor是一种后置处理器。所谓后置处理器(PostProcessor),就是一个HTTP Request结束之后,也就是收到HTTP Response之后才会执行的处理器。它的作用通常是用于从HTTP Response中提取需要的信息。注意:JSON Extractor用于Response是JSON格式的场景。
既然有后置处理器,自然也有前置处理器,也就是HTTP Request发出之后执行的处理器,一般用于修改HTTP Request。
HTTP Request
HTTP请求是JMeter实现的众多采用器(Sampler)中的一种。顾名思义,就是用来向Web服务器发送HTTP/HTTPS请求的。每一个REST API其实就是一种HTTP Request。
聚合报告(Aggregate Report)
聚合报告属于一种监听器(Listener)。在分布式测试中,每个远程JMeter节点会将测试结果发回到控制节点,而控制节点就可以利用聚合报告来自动聚合所有远程节点的测试结果。
函数和变量(Functions and Variables)
JMeter已经实现了很多函数,通常一个函数调用的形式如下:
${__functionName(var1,var2,var3)}
例如__Randon函数可以用来参数随机数。
变量在前面已经提过,就是可以将一些测试参数定义成变量,然后在其他地方通过 $的方式引用。注意变量不能嵌套引用,例如$}是非法的。而__V函数就可以解决嵌套使用变量的问题: $))。
录制测试(Recording Tests)
录制测试是JMeter非常实用的一个功能。顾名思义,可以将手动或自动测试过程录制下来。主要有以下几个方面的作用,
1、当需要开发具体的测试计划(test plan)的时候,往往对很多HTTP请求的路径信息、头部信息、参数信息、HTTP返回格式等信息不是很清楚。这时通过录制测试,就可以得到所有这些具体信息,从而省去大量的阅读源代码调研的时间;
2、该功能也可以用于调试Web相关的问题。有时在操作Web页面的时候,会有一些莫名其妙的反应或错误,这时通过录制测试,就可以知道在操作的时候,到底向Web服务器发送了什么请求,服务器又返回了什么,从而就比较容易知道问题出在哪里;
3、针对于HTTP/REST API相关的单元测试,也是很有用的。
录制测试的具体步骤比较简单,大致如下:
1、执行$/bin/jmeter.bat(Linux下是jmeter.sh)启动JMeter;
2、点击工具栏上的Template按钮;
3、选择“Recording”,然后点击“Create”;
4、这时一个完整的测试计划就生成了; 设置缺省HTTP请求:protocol/Server Name/Port;
5、在HTTP(S) Test Script Recorder中点击“Start” 。其实就是启动了一个HTTP代理,默认监听8888端口。当然,可以修改这个端口。
6、接下来就是运行你的测试了
a) 如何通过浏览器手动测试,那么需要将浏览器的代理设置成localhost:8888;
b) 如果直接在eclipse或者其他IDE中执行unit test,那么在测试代码之前加上如下几行代码:
c) 如何通过ant target运行java 程序,那么在build XML中为target设置如下几个jvm参数:
7、在测试进行过程中,就会发现在Recording Controller中记录下一些HTTP请求。可以在"HTTP(S) Test Script Recorder"下面的“View Results Tree”查看每个HTTP Request/Response的具体信息。
领取专属 10元无门槛券
私享最新 技术干货