到Apache JMeter官网下载最新版本的JMeter Source压缩包,解压到指定目录下即可。之后进入bin目录,点击ApacheJMeter.jar文件即可打开Apache JMeter的图形界面。
如果是在Mac系统下,可能会出现下图所示错误,因为在最新的macOS Sierra系统下,系统偏好设置中的“安全与隐私”默认已经去除了允许“任何来源”App的选项,如果不开启会直接影响到无法运行一些第三方应用。
解决方案是打开终端,复制下面的代码并粘贴到终端。
$ sudo spctl --master-disable
上面的代码执行完成后,系统偏好设置中的“安全与隐私”默认已经选择允许“任何来源”了。现在再次点击bin目录下的ApacheJMeter.jar文件,就可以打开Apache JMeter的图形界面,如下图所示,我们还可以选择自己喜欢的外观风格。
在上图所示的JMeter图形界面中,界面左侧的区域叫工作台。现在工作台上只有一个测试计划,测试计划是用来描述一个性能测试,包含与本次性能测试所有相关的功能,也就说本次性能测试的所有内容是于基于一个测试计划的。
线程与用户
通过右键单击测试计划弹出菜单,可以添加线程与用户,即Threads(Users)。虽然Threads(Users)下有三个添加线程组的选项,但创建之后,图形界面是一样的。
Threads(Users)下有setUp theread Group、terDown Thread Group、线程组三个选项。
- setUp theread Group:用于执行预测试操作,也就是测试开始前定期执行的线程组
- 线程组:我们通常添加的线程组,可以当成是一个虚拟用户组,线程组中的每个线程都可以理解成一个虚拟用户
- terDown Thread Group:用于执行测试后操作,也就是测试结束后定期执行的线程组
下面我们再详细看看线程组的具体设置。
按上面的图片,我们从上到下介绍每一个选项的作用。
- 名称:给线程组设置一个名称
- 注释:给线程组添加备注信息
- 在取样器错误后要执行的动作:在线程执行过程中,出现错误失败后要如何处理
- 继续:请求不会停止,继续执行
- Start Next Thread Loop:忽略线程当前循环错误,执行下一个循环
- 停止线程:停止当前错误线程,不影响其他线程执行
- 停止测试:当前执行的线程全部执行完毕后结束
- Stop Test Now:马上停止全部线程
- 线程数:虚拟用户数,一个虚拟用户占用一个线程,需要多少用户并发,就设置多少个线程数
- Ramp-Up Period(in seconds):设置的线程数需要多长时间全部启动,比如线程数为100,准备时长为10,那么需要10秒启动100个线程,也就是每秒启动10个线程
- 循环次数:每个线程发送请求的次数,比如线程数为20,循环次数为100,那么每个线程发送100次请求,则总请求数为20*100=2000。如果勾选了永远,那么所有线程会一直发送请求,一直到测试停止运行为止
- Delay Thread creation until needed:勾选后,线程只会在合适的、需要用到的时候创建
- 调度器:勾选后,可以设置本次测试的持续时间和启动延迟时间
想要实现测试,除了设置线程组,还需要设置控制器,在JMeter中有两种类型的控制器:取样器和逻辑控制器,使用这些控制器可以驱动处理一个测试。
取样器
通过右键单击线程组弹出菜单,可以添加取样器,即Sampler。取样器是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元。JMeter支持多种不同的取样器,如HTTP请求、FTP请求、TCP取样器、JDBC Request、Java请求等,每一种不同类型的取样器可以根据设置的参数向服务器发出不同类型的请求。
在那么多取样器中,我们就以较为常见的HTTP请求为例。
还是按上面的图片,从上到下介绍每一个选项的作用。
- 名称:标识当前取样器,使用一个有意义的名称
- 注释:给当前取样器添加备注信息
- 协议:向目标服务器发送HTTP请求时的协议,填写http或https,默认为http
- 服务器名称或IP:目标服务器的域名或IP地址
- 端口号:目标服务器的端口号,默认为80
- 方法:发送HTTP请求的方法,可选择GET、POST、HEAD等方法
- 路径:目标URL路径,不包括服务器地址和端口
- Content encoding:内容的编码方式,默认为iso8859
- 自动重定向:勾选后,当发送HTTP请求后得到的响应是302/301时,自动重定向到新的页面
- 跟随重定向:勾选后,与自动重定向不同的是,会记录重定向过程中的所有请求响应,在查看结果树时可以看到服务器返回的内容,并对响应的内容做关联
- Use KeepAlive:勾选后,和目标服务器之间使用Keep-Alive方式进行HTTP通信
- Browser-compatible headers:勾选后,当使用multipart/form-data时,会只发送Content-Disposition标头
- 同请求一起发送参数:在请求中发送URL参数,可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对
以上就是HTTP请求取样器的大部分内容。
逻辑控制器
逻辑控制器可以控制取样器的执行顺序,因此,逻辑控制器需要与取样器配合使用,否则逻辑控制器就没有什么意义。放在逻辑控制器下面的所有的取样器都会当做一个整体,执行时也会一起被执行。
我们以登录场景下经常会使用到的仅一次控制器为例。
如上图,在测试计划执行期间,该控制器下的取样器对每个线程只执行一次,登录场景经常会使用到这个控制器。
配置元件
JMeter中的配置元件可以用来初始化默认值和变量,以便后续取样器使用,将在其作用域的初始化阶段处理。
我们以计数器为例,计数器允许用户创建一个计数器,可以在线程组中任何地方被引用。
如上图所示,计数器界面有以下设置项。
- Starting value:计数器的起始值,第一次迭代时会把该值赋给计数器
- 递增:每次迭代后,给计数器增加的值
- Maximum value:计数器的最大值,如果超过最大值,重新设置为起始值,如果持续测试,建议不要设置最大值
- Number format:可选格式,比如000,格式化为001、002
- 引用名称:用于控制在其它元素中引用该值,形式为$(reference_name}
- 与每用户独立的跟踪计数器:不勾选时,即全局的的计数器,比如用户#1获取值为1,用户#2获取值还是为1。勾选后,即独立的计数器,每个用户有自己的值,比如用户#1获取值为1,#2获取值为2
- Reset counter on each Thread Group Iteration:勾选与每用户独立的跟踪计数器后,才可以选择。勾选后,则每次线程组迭代,都会重置计数器的值,当线程组是在一个循环控制器内时比较有用
以上就是计数器配置元件的大部分内容。
定时器
默认情况下,Jmeter的线程在发送请求时没有间歇,我们可以使用定时器来设置延迟与同步,以便设定请求之间应该隔多长时间。
同样的,我们以Constant Throughput Timer这个固定吞吐量定时器为例子。Constant Throughput Timer可以让JMeter以指定数字的吞吐量执行,即指定TPS,只是这里要求指定每分钟的执行数,而不是每秒。
如上图所示,下面我们认识一下Constant Throughput Timer的设置选项。
- 名称:定时器的描述性名称
- 注释:定时器的注释信息
- Target throughput(in samples per minute):每分钟的吞吐量
- Calculate Throughput based on:有以下选项可以选择
- This thread only:控制每个线程的吞吐量,总吞吐量=设置的吞吐量*线程的数量
- All active threads:设置的吞吐量将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理的时间后再次运行,活跃线程是指同一时刻同时运行的线程
- All avtive threads(shared):与All active threads基本相同,不同的是,每个活跃线程都会在所有活跃线程上一次运行结束后等待合理的时间后再次运行
- All active threads in current thread group:设置的吞吐量将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程组时,该选项和All active threads选项的效果一样
- All active threads in current thread group(shared):与All active threads in current thread group基本一样,不同的是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行
以上就是Constant Throughput Timer定时器的大部分内容。
前置处理器
前置处理器用于在实际的请求发出之前对即将发出的请求进行特殊处理,即在取样器执行之前用来修改取样器的。
以用户参数这个前置处理器为例,用户参数列表中的参数取值可以在测试计划执行过程中发生变化。
如上图所示,参数username和password分别有两组不同的取值,通过界面右下方的四个按钮,可以向列表中增加参数、增加参数值、删除参数和删除参数值。勾选每次迭代更新一次后,则参数的值在每个迭代中保持不变,在新的迭代开始时取下一个值,如果不勾选,则参数值在每个在其作用域内的取样器发出请求时取下一个可用值。
后置处理器
后置处理器用于对取样器发出请求后得到的服务器响应进行处理。
我们以正则表达式提取器为例,正则表达式提取器在请求完成后,会从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用。
如上图所示,下面是各个参数值的含义。
- Apply to:应用的范围
- Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
- Main sample only:仅作用于父节点的取样器
- Sub-samples only:仅作用于子节点的取样器
- JMeter Variable:作用于jmeter变量,输入框内可输入jmeter的变量名称
- 要检查的响应字段:样本数据源
- 主体:响应报文的主体
- Body(unescaped):响应的主体内容,但是替换了所有的html转义符
- Body as a Document:从不同类型的文件中提取文本,会影响性能
- 信息头:响应报文的信息头
- Request Headers:请求报文的信息头
- URL:统一资源定位符,即网络上用来描述信息资源的字符串
- 响应代码:响应状态码,比如200、404等
- 响应信息:就是响应信息呀
- 引用名称:在HTTP等请求中,引用此数据,需要用到的名称
- 正则表达式:用于将需要的数据提取出来的正则表达式
- 模板:表示使用提取到的第几个值,$-1$表示取所有值,$0$表示随机取值,$1$表示取第1个,以此类推$n$表示取第n个
- 匹配数字(0代表随机):0代表随机取值,1代表全部取值
- 缺省值:如果正则表达式没有搜找到值,则使用此缺省值
以上就是正则表达式提取器这个后置处理器的大部分内容。
断言
断言用于检查测试中得到的相应数据等是否符合预期,断言一般用来设置检查点,用以保证性能测试过程中的数据交互是否与预期一致。
我们以Compare Assertion这个比较断言为例,Compare Assertion是一种比较特殊的断言,针对断言进行字符串替换时使用。
如上图所示,我们看一下每一个设置的内容。
- Compare Content:可以选择比较的内容类型,True、False或自定义编辑
- Compare Time:比较时间,可以设定比较的时间,单位为秒,默认为-1
- Regex String:要替换的字符串,可从断言结果中选择
- Substitutions:替换的字符串,即替换结果
以上就是Compare Assertion这个断言的大部分内容。
监听器
监听器可不是用来监听系统资源的,它是用来对测试结果数据进行处理和可视化展示的,图形结果、察看结果树、聚合报告等都是我们经常用到的。
我们以聚合报告为例,聚合报告会统计响应信息并提供请求数、平均值、最大值、最小值、错误率、大约吞吐量和吞吐量等数据。
对于聚合报告,我们主要看一下它统计了那些数据。
- Label:每个部分的Name值,例如HTTP请求的Name
- Samples:发出请求数量
- Average:平均响应时间,默认是单个请求的平均响应时间
- Median:中位数,也就是50%用户的响应时间
- 90%Line:90%用户的响应时间
- 95%Line:95%用户的响应时间
- 99%Line:99%用户的响应时间
- Min:最小响应时间
- Max:最大响应时间
- Error%:本次测试中出现错误的请求的数量/请求的总数
- Throughput:吞吐量,默认情况下表示每秒完成的请求数
- KB/sec:每秒从服务器端接收到的数据量
到此为止,我们已经简单了解Jmeter的基本组成元件了,我们以后的性能测试工作也就是使用这些元件来完成的,如果我们能灵活的使用Jmeter的这些元件,Jmeter就能完成各种各样的测试任务。