Jmeter学习笔记[1]

Jmeter学习笔记[1]

十一月 19, 2019

常用的性能测试工具对比

目前常用的性能测试工具对比:

1、loadrunner:性能稳定,压测结果及细粒度大,可自定义脚本进行压测,但软件太过于繁重,功能过于繁多。

2、apache ab(单接口压测最方便):模拟多线程并发请求,ab命令对发出负载的计算机要求很低,既不会占用很多CPU, 也不会占用太多的内存,但却会给目标服务器造成巨大的负载, 简单DDOS攻击等。

3、webbench:webbench首先fork出多个子进程,每个子进程都循环做web访问测试。子进程把访问的结果通过pipe告 诉父进程,父进程做最终的统计结果。

Jmeter基本介绍和使用场景

简介:

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。

1、压测不同的协议及应用

​ 1) Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)
​ 2) SOAP / REST Webservices
​ 3) FTP
​ 4) Database via JDBC
​ 5) LDAP 轻量目录访问协议
​ 6) Message-oriented middleware (MOM) via JMS
​ 7) Mail - SMTP(S), POP3(S) and IMAP(S)
​ 8) TCP等等

2、使用场景及优点

​ 1)功能测试
​ 2)压力测试
​ 3)分布式压力测试
​ 4)纯java开发
​ 5)上手容易,高性能
​ 4)提供测试数据分析
​ 5)各种报表数据图形展示

Jmeter的安装

1、需要安装JDK8。或者JDK9,JDK10

2、快速下载
windows: http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.2.zip
mac或者linux:http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.2.tgz

3、文档地址:http://jmeter.apache.org/usermanual/get-started.html

4、建议安装JDK环境,虽然JRE也可以,但是压测https需要JDK里面的 keytool工具。

Jmeter目录文件

Jmeter下载后其实是一个文件夹,以下是文件夹里包含几个主要内容:

bin文件夹:是核心的可执行文件,包含配置。其中有几个常用的文件如下:

  • jmeter.bat:Windows下的Jmeter启动文件。
  • jmeter:Mac或者Linux下的Jmeter启动文件。
  • jmeter-server:Mac或者Linux分布式压测机器上使用的启动文件。
  • jmeter-server.bat:Windows分布式压测机器上使用的启动文件。
  • jmeter.properties: 核心配置文件。

extras文件夹:插件拓展的包,一些Jmeter使用的插件包放在这里面。

lib文件夹:核心的依赖包。

  • ext:核心包
  • junit:单元测试包

Jmeter基本组件和实操

1、添加线程组(Thread Group)

首先,打开Jmeter的GUI界面,找到Test Plan,右键,选择Add–>Threads–>Thread Group,点击。

成功添加上一个线程组后,观察一下里面的配置信息。

在Name那里可以为线程组进行自定义命名,下面的Thread Properties中设置线程组的具体配置:

  • Number of Threads (users):表示虚拟的用户数,一个用户占用一个线程或进程。
  • Ramp-Up Period(in seconds):全部线程的启动时长,比如上图中的10个线程,5秒,则表示要在5秒内这10个线程都要启动完成,每秒启动2个线程。
  • Loop Count:每个线程循环发送的次数,前面有一个Forever选项,勾选后线程会一直无限循环启动,比如这里的数值填5,线程组的值为100,则会启动500个线程。

2、添加HTTP请求

选中刚刚添加的线程组,右键,点击Add–>Sampler(采样器)–>HTTP Request,点击。

在刚刚的线程组下我们添加另一个HTTP的请求,下面是HTTP请求的基本配置。这里我选择请求的网页是之前用Django搭的一个发布会管理系统,先把服务在本地启动起来。

接下打开浏览器,输入127.0.0.1:8000/index查看发布会管理登录界面

我们看服务已经启动了,接下来可以配置Jmeter中的HTTP请求来对网页进行请求了,下面看一下HTTP请求的配置。

在Name那里可以更改HTTP请求的名称,下面看一下几个主要的配置项:

  • Protocol:协议填写,一般不填写默认的是Http
  • Server Name or IP:这里填写所要请求目标服务器名称的或IP地址
  • Port Number:端口号
  • Method:请求的方法,有Get,Post……等选项。当使用POST发送请求时需要勾选下面的Use multipart/from-data选项,默认情况下是不选中的状态
  • Path:服务器url

3、查看测试结果

需要添加一个结果查看器来查看请求是否成功,这里选用的就是察看结果数工具

选中线程组,右键,Add–>Listener–>View Results Tree,点击。

接下来点击start按钮,就是上面工具栏中的“绿色播放键”,点击后选中察看结果树界面

在此界面,可以看到发送的所有请求,之前设置的线程组是10,循环2次,在5秒内执行完成。所以这里一共有20个请求,每秒发送4个请求。这里我们看发送的20个请求全部成功。然后我们观察网页服务器也有请求的相关信息。这就是一个简单的HTTP请求测试。

4、Jmeter断言的基本使用

断言的增加:Add–>Assertions–>Respose Assertion,点击。

然后选中响应断言,查看相关配置。

  • Apply to(应用范围):

    • Main sample only:一般默认情况下选择这个。仅当前父取样器进行断言,一般一个请求触发一个。
    • Sub-samples only:这个比较少用到。指一个请求可以触发多个断言。
  • Field to Test(测试响应的字段):

    • Text Response:响应的文本,即响应的数据,比如json等文本。

    • Response Code:http的响应状态码,比如200,302,404这些。

    • Response Message:http响应代码对应的响应信息,例如:OK, Found。

    • Response Header:响应头

      一般常用的几个响应字段如上所示,也是用的比较多的。

  • Patterns to Test(模式匹配规则):

    • Contains:包含,信息包含在内即成功。
    • Matches:匹配,响应内容完全匹配,不区分大小写。
    • Equals:相等,响应内容完全匹配,区分大小写。
    • Substring:也是包括的意思,只不过不匹配正则表达式。
    • Not:取反,如果勾选前断言响应结果为TRUE,勾选后的响应结果就位FALSE。
  • Custom failure message(断言匹配失败的提示信息):当断言响应为FALSE的时候,打印相关的报错信息。

断言结果监听器:选中线层组,Add–>Listener–>Assertion Results

里面的内容是sampler采样器的名称,当断言失败,在断言结果界面会打印失败信息,察看结果树任务结果颜色标红(通过结果数里面双击不通过的记录,可以看到错误信息),如下图所示:

每个sample下面可以加单独的结果树,然后同时加多个断言,最外层可以加个结果树进行汇总。

5、压测结果的聚合报告

前面介绍了如何发送请求并且验证请求的成功以及请求失败后的断言,这里介绍评判性能的一个工具:聚合报告。

聚合报告的添加:选中线程组,Add–>Listener–>Aggregate Report,点击。

然后我们线程数改为100,执行时间为5s,循环2次,然后分析聚合报告的信息。

先来看一下上方表栏的意思:

  • Label:sampler的名称
  • Samples:一共发出去多少个请求,这里我们线程数是100,循环2次,所以是200个
  • Average:平均响应时间(单位是ms)
  • Median:中位数,也就是 50% 用户的响应时间
  • 90%Line:90%用户响应不会超过该时间
  • 95%Line:95%用户响应不会超过该时间
  • 99%Line:99%用户响应不会超过该时间
  • MIn:最小响应时间
  • Max:最大响应时间
  • Error%:错误的请求的数量/请求的总数
  • Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类比为qps
  • Received KB/sec:每秒接收的数据量
  • Sent KB/sec:每秒发送的数据量

然后我们分析我们的数据,一共发送了200个请求,平均响应时间为11ms,50%用户响应时间为7ms,90%用户响应不会超过23ms,95%用户响应不会超过36ms,99%用户响应不会超过60ms,最小响应时间为4ms,最大响应时间为84ms,错误请求为0,吞吐量约为每秒完成39条的请求,每秒接收的数据量为54.21KB,每秒发送的数据量为9.49KB。以上数据会给你一个性能参考,一般我们主要关注的有几个地方:错误请求率,吞吐量,平均响应时间,最大响应时间。一般要测这个系统的极限的话就在相同事件内将发送的请求数增加,随着请求数的增加,系统的吞吐量也会随之增加,当你增加请求数后发现吞吐量没有再继续增加反而有一点点回退,那就达到这个系统的极限值了,这个时候就可以去记录下数据方便后续对性能的分析。

6、Jmx脚本的分析

当我们想保留这个配置的时候,可以save到本地,Jmeter文件为.jmx文件,这里我放在了sublime里来看,你也可以直接用vim编辑器来打开。

上面可以看到关于测试计划,线程组的一些配置,以及HTTP请求的配置,可以在这里直接进行配置。

上面是有关响应断言以及察看结果数的配置,可以直接在代码里寄信配置。

上面是断言结果以及聚合报告的一些配置。

7、小结一下

以上介绍了jmeter的一些基本控件的使用以及文件代码的配置,在实际工作中,jmeter都是通过命令行而非GUI界面来启动,是为了更好的利用资源进行测试,所以看懂并配置代码时很重要的。