Apache JMeter

JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试。它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器等等。JMeter可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回预期的结果。

单节点JMeter在做某些场景的性能测试时,由于网络带宽的限制,很难将压力提高到指标需要的值,为了提高并发量,采用分布式部署方案,一个JMeter节点作为主控节点,另外多个JMeter节点作为测试节点,主控节点可将测试计划同步给测试节点的JMeter,多个测试节点同时向应用服务器发送请求,以达到大量并发的目的

环境准备

首先,从官网下载jmeter ,地址如下:

https://jmeter.apache.org/download_jmeter.cgi

下载完成后,解压即可,无需安装。

如果没有安装jkd,需要安装jdk,请参考安装jdk的文档,这里不再赘述。

启动jmeter:

双击 bin\jmeter.bat即可。

性能指标监控工具

JMeter的Perfmon插件提供了对服务器资源占用率的采集和监控,可将监控数据以图形化显示,也可将监控数据保存到文件中。可监控的指标为:CPU、内存、磁盘IO、网络IO等。

用例制作-脚本录制-新建测试计划

启动jmeter,在菜单中选择Template

java压测工具开源 java压力测试脚本编写_java压测工具开源

 

在左侧菜单中选择HTTP(S)Test Script Recorder,如下图所示。

java压测工具开源 java压力测试脚本编写_java_02

点击“Start”按钮。这样就启动了代理。

浏览器配置代理

浏览器选择配置->选项,在选项窗口中点击“局域网设置”

 

java压测工具开源 java压力测试脚本编写_HTTP_03

在弹出框中的“代理服务器”部分,勾选为LAN使用服务器(这写设置不用于拨号或VPN连接)(X)如下图:

 

java压测工具开源 java压力测试脚本编写_java压测工具开源_04

以上操作,将代理配置成了刚才jmeter创建的代理。

录制

接下来,我们要录制Relax登录首页的过程。

启动web系统,打开登录页。

java压测工具开源 java压力测试脚本编写_java压测工具开源_05

 

输入用户名、密码,点击登录,进入首页。

java压测工具开源 java压力测试脚本编写_java_06

需要录制的过程操作完成后,即可在jmeter上停止录制过程,点击stop按钮,如图:

java压测工具开源 java压力测试脚本编写_java压测工具开源_07

执行测试

性能测试前,先设置线程参数,点击“Thread Group”,根据测试压力设置右侧的参数,比如线程数200,循环1次,如下图:

java压测工具开源 java压力测试脚本编写_HTTP_08

为了观察运行的结果,可添加一个Listener -> Summary Report。

点击运行按钮,选择Summary Report可观察测试的统计信息。如下图,可看到每一个请求的执行次数、平均执行时间、最小执行时间、最大执行时间、错误率、每秒执行次数、每秒接收数据量、每秒发送数据量、平均数据量等信息。

java压测工具开源 java压力测试脚本编写_java压测工具开源_09

选择View Results Tree,可查看每个请求的详细信息,如下图:

java压测工具开源 java压力测试脚本编写_java_10

窗口右侧可查看Sampler result、Request、Response data,分别是结果样例、请求数据、应答数据。

从本地文件中获取变量

在测试过程中,某些请求信息不能够硬编码在脚本中,比如登录用户的名称和密码,此时可以从本地文件中读取,jmeter支持从CSV文件中读取数据并设置给用户变量。

本地创建文件,如account.dat,内容如下:

java压测工具开源 java压力测试脚本编写_CSV_11

有两种方式可将本地文件的内容读取入变量:1.通过函数读取,2.通过CSV Data Set Config获取。

通过函数获取

jmeter提供了函数来读取CSV文件,函数名称为__CSVRead,jmeter提供了方法帮助,可辅助生成方法的调用脚本,点击菜单Option->Function helper Dialog(选项->方法帮助窗口),在方法名称中选择

java压测工具开源 java压力测试脚本编写_HTTP_12

,表格中输入文件路径以及文件中的字段索引,比如获取第一个字段,则填0,第二个字段,则填1,依次类推。

点击Generate & Copy to clipboard,在Function syntax中显示了方法的调用表达式,同时,也会自动将调用表达式保存在剪切板中。

java压测工具开源 java压力测试脚本编写_CSV_13

新增用户变量username和password。

name中填入 username,value中将剪切板中的函数调用表达式粘贴在表格中即可,如下:

java压测工具开源 java压力测试脚本编写_java压测工具开源_14

通过CSV Data Set Config获取

新增CSV Data Set Config

java压测工具开源 java压力测试脚本编写_java压测工具开源_15

填写文件信息、变量信息,入下图所示:

java压测工具开源 java压力测试脚本编写_CSV_16

说明:

文件名:输入或选择需要读取的文件名称,文件格式为CSV

encoding编码:选择文件的正确编码。

变量名:变量列表,和文件中的变量一一对应,逗号分隔。

分隔符:CSV文件中的变量 分隔符。

在文件结束符循环:选择是,则读取到文件结束后循环读取。

在文件结束符停止线程:选择否,读到文件结束符时不停止线程。

共享模式:可选项有All Threads(全部线程)、Current thread group(当前线程组)、Current Thread(当前线程)、Edit(编辑)

下一步,就是将读取的用户名称和密码设置到请求中。

找到负责登录的请求,修改前如图所示:

java压测工具开源 java压力测试脚本编写_HTTP_17

修改请求语句,使用用户变量的数据,如下:

java压测工具开源 java压力测试脚本编写_HTTP_18

测试执行,验证是否已经将文件中的变量设置到请求中。

将变量存入本地文件

在大多数测试场景中,需要将应答的结果保存到变量中,或将变量保存到文件中。

要将应答保存在变量中,按照如下步骤:

首先要编写代码,代码功能是将传参保存在文件中,我们这里编写java的代码来写入文件。

创建AppendFile.java,内容如下:

package com.relax.test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class AppendFile {
  public static void appendFile(String fileName, String content) throws IOException{
  FileWriter writer = null;
  try {
     writer = new FileWriter(fileName, false);
     content = content + "\n";
     writer.write(content);
  } catch(IOException e){
     e.printStackTrace();
  }finally{
      if (writer != null){
        writer.close();
      }
    }
  }

}

 

通过javac命令,将其编译成class文件。

如果测试计划中没有"HTTP Cookie 管理器",则需添加一个"HTTP Cookie 管理器"(用来存储cookie)。

在线程组上添加一个Sampler-->“HTTP 请求”(用来登录用的),添加一个Sampler-->“Debug Sampler”和监听器-->“察看结果树”,保存测试计划,关闭Jmeter。

修改jmeter目录下bin/jmeter.properties中的CookieManager.save.cookies=true,然后重新启动Jmeter。

运行测试计划,查看结果树,发现“Debug Sampler”节点中存在“COOKIE_”打头的变量,这个就是Jmeter自动存储的cookie

上面步骤产生cookie之后,整个测试计划周期内"HTTP Cookie 管理器"会自动帮我们保存这些cookie,当然如果想要获取某个cookie的值也可以使用${COOKIE_对应key}方式获取。

cookie的key默认以“COOKIE_”是Jmeter默认提供的,如果想要以别的方式开始,可以给bin/jmeter.properties中的CookieManager.name.prefix=赋值即可(如:CookieManager.name.prefix=test)

新建变量sessionid,如下,value可不设值。

java压测工具开源 java压力测试脚本编写_java_19

session id是在登陆请求成功后,由服务端返回的,放置在Cookie中。

我们选择登录请求,在登录请求上增加后置处理器。

java压测工具开源 java压力测试脚本编写_java压测工具开源_20

在其中编写代码,如下:

source("D:\\work\\ruijie\\document\\架构设计\\20180908-性能优化\\性能测试\\com\\relax\\test\\AppendFile.java");

String filename = "";
String sessionid = vars.get("COOKIE_sid");
Append.appendFile();
log.info("sessionid = " + sessionid);

以上就可将sessionid写入本地文件中。

 

测试用例间的SessionId传递

有几种方式可将sessionid传递到不用的线程

一种方式:将sessionId获取出来以后,写入文件,另一个线程从文件中获取

一种方式:在同一个线程组内,先做登录,使用HTTP Cookie Manager保存session,在该线程组内继续录制下一测试场景,就可以和下一个场景共享sessionid了。

第一种方式详述:

在登录请求下,增加后置处理器BeanShell PostProcessor,代码参考上部。

在下一个场景的第一个请求,添加前置处理器,HTTP Cookie Manager,添加session名称,配置从文件中读取,即可。

第二种方式详述:

新建Template 测试计划。

录制登录操作,登录成功后,将脚本中将除登录请求外的请求删除。

在这个线程组下,再录制下一个场景,这样在同一个线程组内就可以共享会话。

添加Perfmon监控服务器性能

插件下载

下载地址https://jmeter-plugins.org/downloads/all/,下载plugins-manager.jar

把给文件放到apache-jmeter/lib/ext目录下

启动jmeter

1.点击选项-plugins Manager

java压测工具开源 java压力测试脚本编写_java压测工具开源_21

在这里勾选监控内存我们使用的是:jp@gc - PerfMon Metrics Collectot,点击Apply Changes and Restart jmeter(或者双击运行/serverAgent/startAgent.bat )2种方法都可以用。

java压测工具开源 java压力测试脚本编写_java_22

这样就添加完成了,打开jmeter-添加-监听器-@gc-perfMon Metrice Collector。

java压测工具开源 java压力测试脚本编写_HTTP_23