Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

快速学习Jmeter性能测试工具 #23

Closed
zxh456 opened this issue Feb 25, 2021 · 0 comments
Closed

快速学习Jmeter性能测试工具 #23

zxh456 opened this issue Feb 25, 2021 · 0 comments

Comments

@zxh456
Copy link

zxh456 commented Feb 25, 2021

快速学习Jmeter性能测试工具

本文将从零基础开始学习JMeter工具,文章主要包括JMeter基础知识、JMeter最简开发流程、运行与监听、JMeter元件库、脚本开发等方面讲解JMeter性能测试工具。

  • JMeter基础知识

包括工具介绍、安装、相关工具安装、目录介绍、体系结构介绍、运行原理介绍等,有一定基础的同学可以跳过。

  • JMeter最简开发流程

虽然叫JMeter最简开发流程,其实包含了性能测试中的常用关键字,即录制(其他工具录制导入、JMeter录制导入)、参数化、关联、事务、集合点、检查点等。

  • 运行与监听

运行场景中主要介绍线程组、GUI运行、非GUI运行,远程运行、JMeter自身性能参数配置;以及常见的报告产生方法

  • JMeter元件库

将介绍最迷惑初学者的元件运行顺序、常见元件详解、各类元件总结分析与简述。

  • 脚本开发

将针对常用的采样器进行讲解主要有:BeanShell、FTP、JAVA请求、JDBC请求、JUnit请求、SOAPUI接口测试、RESTFUL接口测试等。

JMeter基础

JMeter介绍

Apache JMeter是Apache组织开发的基于Java的压力测试工具。
用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。
JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。
image.png
image.png

JMeter安装

Windows下安装

JMeter Windows下载地址:
http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-3.1.zip。确保已经安装JDK1.7以上版本。
设置环境变量:

  • JAVA_HOME 变量值:D:\Java\jdk1.8.0_25
  • CLASSPATH 变量值:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
  • Path 在变量值的最前面加上:%JAVA_HOME%\bin;

java -version

Linux下安装

JMeter Linux下载地址:
http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-3.1.tgz
解压:
指定path目录:
安装完成后运行,验证安装是否成功。

Badboy安装

badboy主界面介绍:

badboy使用步骤如:

  • 录制脚本
  • 参数化
  • 检查点
  • 脚本回放

badboy不能发散,必定是一个工具,不能三言两语搞定。如果有同学感兴趣,后面可以开专门的chat来聊一聊badboy自动化测试工具。

JMeter目录介绍

bin:

可执行文件目录

  • examples:打开里面是一个csv样例。
  • jmeter.bat:windows的启动文件。
  • jmeter.log:日志文件。
  • jmeter.sh:linux的启动文件。
  • jmeter.properties:系统配置文件(是常改文件之一)。
  • jmeter-server.bat:windows分布式测试要用到的服务器。

docs:

文档目录。api:api文件以及css和图像样式

extras:

扩展插件目录,目录下的文件提供了对ant的支持。

lib:

所用到的插件目录,里面全是jar包,JMeter 会自动在 JMETER_HOME/lib 和 ext 目录下寻找需要的类。
lib目录下的ext子目录是jmeter的核心jar包;用户扩展所依濑的包不能直接放到lib下,要放到lib/ext下(注意最新版本是这样,之前个别版本可能反过来,所以很多同学两边都放,两边都放好处在于一定OK,但坏处在于当用户误操作时可能导致两边版本不一样,不好定位问题)。junit子目录是放junit脚本的。
☞注意: 无法识别 zip 格式的包文件,所以需要的包文件均要求以 .jar 结尾。

printable_docs:

usermanual子目录下是jmeter用户手册,尤其是component_reference.html是最常用的核心元件帮助手册。

JMeter体系结构

  • LoadRunner结构

讲JMeter结构前,先看看大家常用工具LR的结构:
LR主要由:脚本产生器、负载控制器(含调度、监控)、压力产生器、分析器组成。脚本产生器负责生产用户代码模拟单个用户以及为模拟多个用户做准备;负载控制器用于控制压力产生器的运行,并收集测试情况、性能计数等;压力产生机主要负责模拟许多用户对服务器进行测试;而分析器主要通过图表、表格分数测试情况用于测试者产生测试报告。

  • JMeter结构

下图为JMeter核心结构关系图,解释了性能核心关键字所对应的元件,以及个元件的位置关系。 整体来讲:JMeter主要由以下4部分组成:一部分负责模拟,一部分负责验证,一部分负责收集结构,一部分负责周边。各部分用途见后面分解:

  • JMeter结构目录和主要用途

模拟部分:取样器、配置元件、控制器、定时器、前置处理器、后置处理器、线程组。模拟部分线程组用来建立线程池,多线程运行其他模拟、断言、监听部分;配置元件主要用来做一些数据准备,通用请求准备(如设置一些默认值HTTP请求的、JAVA请求的);控制器主要处理逻辑关系如循环、分支、交替、事务等;定时器用于处理思考时间、集合点、随机时间等工作;前置处理器用来对请求前的数据进行处理(如JDBC请求前的数据准备等);后置处理器用来对请求返回后的数据进行处理(如关联)。
验证部分:断言。断言是测试的精髓,用于判断返回值与预期一致。
收集和展示部分:监听器。是用来收集数据和展示数据(如:测试报告)。
周边部分:工作台(可以防止备用元件、抽象的模块等)。

  • JMeter运行原理

JMeter分布式运行原理图
控制机:(调度与收集)
负载机:(Agent、多线程、脚本产生器)

  • 远程调用原理

  • JMeter测试计划

测试计划是用来管理整个测试的,计划和线程组都可以理解为容器,是用来放东西的。测试计划可以用来管理测试套、测试工程、测试包等。
一个测试计划至少一个包括:1个测试计划、1个以上线程组、1个以上取样器、1个以上监听器。

JMeter最简开发流程

工作区介绍

元件树、编辑区、菜单及工具区,具体做什么下图有说明。

录制之一:badboy录制

  • 使用badboy录制脚本

录制、参数化、检查点、回放。

  • 导入badboy脚本

从badboy File菜单中导出JMeter脚本,使用JMeter直接打开。

  • 脚本增强

添加查看结果树监听器让执行结果可见。
修正断言,断言可能在超级链接、HTML元素大小写变化等方面会发生变化,需要回复修正。
增强JMeter测试计划可读性。

录制之二:JMeter录制

  • JMeter配置代理录制

JMeter-【工作台】-【非测试元件】-【HTTP代理服务器】中配置代理。

  1. 修改端口号
  2. 修改目标控制器(代码放在什么位置,【线程组】-【简单控制器】)
  3. 选择分组
  4. 勾选断言


为浏览器网页访问添加代理

清空浏览器缓存、清空浏览器主页(为什么)。

  1. 启动 浏览器中进行业务操作。

缺点:

  • JMeter录制会带来很多干扰,特别是一些后台网络访问程序。
  • 对于使用动态加载方式(Ajax+JS+JSON)来出来的JMeter和LR处理都不是很好。
  • JMeter调试 添加【查看结果树】监听器-【运行】。
  • JMeter代理启动后的https证书导入

试着访问https://www.baidu.com。证书位置$JMeter_Home/bin/.crt。

  • Firefox下如何导入证书方法:

  • 练习证书导入
  • firefox下导入证书
  • ie下如何导入证书
  • 练习JMeter录制脚本

JMeter非录制开发开发流程

放弃使用录制方法进行性能测试。
实例:查询一个城市的天气预报。
使用抓包工具观察用户页面请求所产生的请求列表,筛选最核心的(不然一些css/js/imag一般情况下可以忽略)。具体思路如下:同抓包发现,查询一个城市的天气是先通过查询城市代码、然后通过城市代码查询天气预报。

第一个Http请求:

Http信息头管理器:

Referer:提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的。 由于服务器有限制,因此必须要告诉接口你是从他希望的服务器过来,不然你可能得不到想要的数据。
响应断言:

我们想返回的数据中包括我们想要的结果。
断言结果:当断言失败时,断言结果会把失败原因给指出来。
查看结构树:

  • JMeter参数化

如果使用单元数据,用户可选用“用户自定义变量”进行数据引入。
用户自定义变量:

继续使用以上用例,进行简单的参数化,使用csv Data setConfig引入多样的数据,这样就可以在线程组中设置循环运行或多线程运行。
csv Data set Config:

  • JMeter关联

后置处理器——正则表达式提取器:

第二个HTTP请求:
http://www.weather.com.cn/weather1d/10101010007A.shtml#search
10101010007A使用正则表达式表达的变量进行替换:

如果对正则表达式不了解的同学可以下载一个正则表达式测试工具,如:RegexTester。

  • JMeter检查点

断言——Response Assertion:

  • 事务

逻辑控制器——事务控制器:

  • 集合点

定时器——同步定时器:

  • 函数助手

用于增强用户编写的脚本:

生成后作为变量使用:

函数助手脚本为什么会失败?明明是查询的城市是北京,为什么断言变成了上海。

看看这个代码为何会成功,思考为什么?(具体原因后面讲述元件运行顺序的时候会重点说明。)

运行与监听

场景设计

线程组

通过【线程组】实现并发。同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量,不会影响其他线程的变量值
Delay Thread creation until needed: 默认情况下,测试开始的时候,所有线程就被创建完了。如果勾选了此选项,那么线程只会在合适的需要用到的时候创建。
Ramp-Up Period:线程启动的时间,下图的线程配置,多少个线程,多长启动时间(秒),每个线程执行多少次循环。那么每秒会启动一个线程,每次循环执行一个请求。

取样器错误:

当线程执行取样器失败的时候,要执行的策略选项:

  • 继续:忽略错误,是继续执行。
  • Start Next Thread Loop:忽略错误,线程当前循环终止,执行下一个循环。
  • 停止线程:当前线程停止执行,不影响其他线程正常执行。
  • 停止测试:整个测试会在所有当前正在执行的线程执行完毕后停止。
  • 立即停止测试:整个测试会立即停止执行,当前正在执行的取样器如果可能会被中断。

调度器:

如果不想立即执行执行,可以通过调度器控制测试执行的开始时间和结束时间。

  • 启动时间:控制测试在某个时间点启动。这个配置会被“启动延迟(秒)”配置覆盖。
  • 结束时间:控制测试执行的结束时间。这个配置会被“持续时间(秒)”配置覆盖。
  • 持续时间(秒):控制测试执行的时间。
  • 启动延迟(秒):控制测试多久后启动执行。

场景运行

  • 运行方式:GUI、命令行
  • 运行架构:本地化运行、远程运行

GUI运行


分别:运行、忽略所有暂停、停止、关闭线程、远程运行、远程停止、远程下线。
远程运行步骤:
1)修改设置控制机jmeter.properties文件,比如远程机的地址为192.168.0.102。
2)运行远程机的jmeter-server.bat批处理文件。
3)在控制机上运行远程按钮。

非GUI运行

使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源。
1)需要设置PATH环境变量把JMeter软件目录囊括进去。 如:
2)命令行jmeter -n -t testplanFilename -l listenerFilename
如:
这次我们可以清晰地看到每个线程的执行情况。这里是我们使用非 GUI 模式运行测试脚本时可以使用的一些命令:

  • -h 帮助 -> 打印出有用的信息并退出
  • -n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
  • -t 测试文件 -> 要运行的 JMeter 测试脚本文件
  • -l 日志文件 -> 记录结果的文件
  • -r 远程执行 -> 启动远程服务
  • -H 代理主机 -> 设置 JMeter 使用的代理主机
  • -P 代理端口 -> 设置 JMeter 使用的代理主机的端口号

例如:
执行结果可以使用 GUI模式下的聚合报告查看,比如你想要看 logfile1.jtl 的报告,可以打开 JMeter GUI 界面 ->测试计划 -> 添加线程组 -> 添加聚合报告 ->点击"所有数据写入一个文件"下的 "浏览..."按钮找到你刚生成的jtl文件就可以对执行结果进行直观分析了。
从文件查看聚合报告:

性能参数配置

Jmeter是运行在JVM之上,因此需要设计到JVM相关配置。
jmeter.bat配置取一段一起学习:
set HEAP: 设置JVM堆大小,-xms(初始),-xmx(最大堆大小),-xmn(年轻代,官方推荐年轻代大小是最大大小的3/8)。
set NEW: 设置年轻代大小-XX:NewSize设置初始化大小,-XX:MaxNewSize年轻代最大内存。这个设置云-xmn有重复,一般使用-xmn来设置。年轻代分Eden区和Survivor区。
set SURVIVOR: -XX:SurvivorRation=8,设置Surviovor与Eden区大小的比值。由于surviovor有两个,所有比值为2/(2+8)=1/5。Eden占8/(2+8)=4/5。
set TENURING: -XX:MaxTenuringThreshold=2,年轻代晋升年老代周期(也就是经过多少次GC还存活)。
set PERM: -XX:PermSize,持久代大小,如果要对持久代进行垃圾回收就设置:-XX:+CMSClassUnloadingEnabled。
set DUMP: -XX:+HeapDumpOnOutOfMemoryError,设置当内存溢出是Dump内存信息。

测试监听

summary Report

  • Label:取样器名称。
  • Samples:发送的请求总数。
  • Min:最小响应时间。
  • Max:最大响应时间。
  • Std.Dev:所有请求响应时间的标准差。
  • Error%:出错率(出错的Request数/所有的request数)。
  • Throughput:吞吐量,每秒/每分钟(具体看“/”后面的单位)处理的Request数。
  • KB/sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec。
  • Avg.Bytes:服务端返回给Request数据的平均值,可以理解为:服务端返回所有数据/请求数。

aggregate Report聚合报告

  • Label:取样器名称。
  • Samples:运行过程中一共发出了多少个请求。
  • Average:平均响应时间。
  • Median:响应时间中间值。
  • 90%Line:响应时间90%线。
  • 95%Line:响应时间95%线。
  • 99%Line:响应时间99%线。
  • Min:最小响应时间。
  • Max:最大响应时间。
  • Error%:出错率(出错的Request数/所有的request数)。
  • Throughput:吞吐量,每秒/每分钟(具体看“/”后面的单位)处理的Request数。
  • KB/sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec。

JMeter元件库

元件运行顺序与作用域

元件的运行顺序和作用域是JMeter最精髓的东西,当然也JMeter优缺点的体现地,感兴趣的同学可以重点看看提供给大家的汇总表。

执行顺序

元件执行顺序:"配置元件config elements" 、"前置处理程序Per-processors" 、"定时器timers"、"取样器sampler"、"后置处理程序post-processors" 、"断言assertions" 、"监听器listeners" 。

作用域 

元件作用域:配置元件,影响作用域内所有元件;前置处理程序,作用域内每个取样器之前执行;定时器,作用域内每个取样器有效;取样器,无作用域;后置处理程序,作用域内每个取样器之后执行;断言,作用域内。
每个取样器执行后的结果校验;监听器,作用域内每个取样器的信息并呈现;逻辑控制器,作用域于子节点取样器和逻辑控制器。父节点不是取样器,作用域是其父节点下其他所有后代节点(子节点和其下的所有节点)。
元件全局分析:

作用域与顺序:

实例分析

详解常见元件库

HTTP代理服务器

对于一些HTTPS协议的系统需要在启动代理后,安装JMeter/bin下的证书,才能使用代理服务器,如果手机的录制,需要把设计手机的代理服务器、端口,并在手机段安装证书。

上图中1/7/8条需要单独说明:

  • 分组 我们把每个URL看成一个组。在组间添加分割,每个组放入一个新的控制器。只存储每个组的第一个样本(使用缓存,而非每次请求都要下载,但对于CDN区进行验证的时候就不能选择此选项)。put each group in new transaction controller(每次请求都放入一个控制器)。
  • TYPE 默认为空,可选项为:HttpClient3.1、HttpClient4、JAVA、空值。选择JAVA使用Jdk中的net包模拟浏览器、使用httpclient3.1或httpclient4模拟浏览器。空值默认使用jmeter.properties中jmeter.httpsampler的配置。
  • Content-Type filter
  • Include:Content-Type的白名单,表示那些Content-Type可以通过。
  • Exclude:Content-Type黑名单,表示那些Content-Type被拒绝。
  • 其他

Prefix:对每个录制的http请求的前缀命名,默认为空,则录制的请求会按照数字递增的方式进行命名。

  • 重定向:用于将用户从一个URL重新路由到另一个URL。☛具体内容见文档。
  • 自动重定向:当发送HTTP请求后得到的响应是302/301时,JMeter 自动重定向到新的页面,比如重A页面重定向到B页面,只会记录B页面的信息,A页面的信息称之为过程信息,如果要做关联就不能搞定了。另外自动重定向只针对GET和Head请求,不能使用在PUT和POST上。
  • 搜索:通常是通过重定向来实现的,因此搜索内网站需要勾选【自动重定向】;但有的功能需要记录带入的cookies,这个时候需要把【自动重定向】改为【跟随重定向】(比如badboy录制的脚本)。
  • 跟随重定向:是否启用跟随重定向,是指发生重定向时,会生成sampler请求,即生成脚本。
  • Use keepalive:jmeter和目标服务器之间使用Keep-Alive方式进行HTTP通信,默认选中.keepalive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
  • 从HTML文件获取所有内含的资源:当该选项被选中时,jmeter在发出HTTP请求并获得响应的HTML文件内容后,还对该HTML进行Parse并获取HTML中包含的所有资源(图片、flash等)。

HTTP请求

http请求的执行引擎,可以通过修改jmeter/bin下的jmeter.properties更换。

  • parameters:随着请求一起发送的参数,可以是get/post方法。
  • 协议:HTTP , HTTPS or FILE,默认为HTTP。
  • Body Data:使用POST时用到。
  • File Upload:当需要文件上传时用到,MIME类型可以通过一些网络抓包工具获取。
  • Embedded Resources from HTML Files:解析HTML和发送的Http/Https请求资源,其他选项分别是:检索所有资源、并发检索资源(可设置大小)、使用正则表达式匹配URL。
  • Save response as MD5 hash:选中该项,在执行时仅记录服务端响应数据的MD5值,而不记录完整的响应数据。在需要进行数据量非常大的测试时,建议选中该项以减少取样器记录响应数据的开销。
  • 用作监视器:此取样器被当成监视器,在Monitor Results Listener 中可以直接看到基于该取样器的图形化统计信息。默认为不选中。

用户定义的变量

  • 描述: 名称描述 名称建议使用一定的命名规范,使用变量的方法:

${variableName}

Http Cookie管理器

每次清除cookies,每次线程组启动时都会清除cookie。

  • Implementation:

HC4CookiesHandler广泛用于APP,HC4CookiesHandler是用于支持HttpClient4的,而HC3CookiesHandler是用于支持HttpClient3的。

  • Cookie Policy:
  • compatibility 推荐选择此种策略。这种兼容性设计要求是适应尽可能多的不 同的服务器,尽管不是完全按照标准来实现的。如果你遇到了解析 Cookies 的问题,你就可能要用到这一个规范。有太多的web站点是用CGI脚本去实现的,而导致只有将所有的 Cookies 都放入 Request header 才可以正常的工作。这种情况下最好设置 http.protocol.single-cookie-header 参数为 true。
  • RFC2965 RFC2965定义了版本2并且尝试去弥补在版本1中Cookie的RFC2109标准的缺点。RFC2965是,并规定RFC2965最终取代RFC2109.发送RFC2965标准Cookies的服务端,将会使用Set-Cookie2 header添加到Set-Cookie Header信息中,RFC2965 Cookies是区分端口的。
  • Ignore Cookies

此规格忽略所有Cookie。被用来防止HttpClient接受和发送的Cookie。

  • Netscape Netscape是最原始的Cookies规范,同时也是RFC2109的基础。尽管如此,还是在很多重要的方面与RFC2109不同,可能需要特定服务器才可以兼容。
  • RFC2109 RFC2109是W3C组织第一次推出的官方Cookies标准。理论上,所有使用版本1Cookies的服务端都应该使用此标准。HttpClient已经将此标准设定为默认。

Http Header管理器

头信息管理,常见的有:User-Agent、Connection( 允许客户端和服务器指定与请求/响应连接有关的选项如:keep-alive)、content-type、Accept、Cookie、location302重定向地址信息、Cache-Control。可以通过抓包工具、或查看录制的脚本、察看结果树找到相应的解释。

简单控制器

用来规范代码。

察看结果树

察看服务器返回信息、请求信息、采样信息。

  • 采样信息
  • Thread Name: 线程组名称
  • Sample Start: 启动开始时间
  • Load time: 加载时长
  • Latency: 等待时长
  • Size in bytes: 发送的数据总大小
  • Headers size in bytes: 发送头大小
  • Body size in bytes: 发送数据的其余部分大小
  • Sample Count: 发送统计
  • Error Count: 交互错误统计
  • Response code: 返回码
  • Response message: 返回信息
  • Response headers: 返回的头部信息
  • 请求信息 包含请求相关信息如主机端口、请求头等。
  • 相应信息 返回的消息,可通过正则表达式查询文本,方便文本检查点内容的取得。
  • 操作

正则表达式提取器

文中使用的正则表达式测试器(RegexTester):下载地址

  • Apply to
  • 当前父取样器和当前父的子取样器
  • 当前父取样器
  • 仅匹配子取样器
  • 支持Jmeter变量进行匹配
  • 要检查的响应字段
  • 主体(不包含header),这里就是body
  • Body(替换了转义码的Body)
  • Body as a Documet:返回内容作为一个文档
  • 信息头
  • URL
  • 响应编码
  • 响应信息
  • 引用名称
  • 参数

响应断言

  • 参数讲解 ![【断言】-【响应断言】.jpg-314.6kB][34]
  • 模式匹配规则练习 分别尝试包括、匹配、equals、Substring、是否降级处理。

事务控制器

  • 阐述 Generate Parent Sample:如果事务控制器下有多个取样器(请求),勾选后,在察看结果树中不但可以看到【事务控制器】,还可以看到每个取样器的结果。

事务的成功与每个取样器的成功相关:

同步定时器

  • 讲述 性能测试中我们经常提到一个概念就是“并发”,其实在实际真实的性能测试中是不存在真正的并发的。为了更真实的模拟对一个请求的并发测试场景,我们通常设置一个集合点。简单理解就是:设置一个阀值(请求数量),当请求数达到这个阀值时,允许请求同时发出。


若在超时时间内,性能测试并发场景设定的并发样本数量未达到,则jmeter认为超时,会立即执行并发。

  • 超时时间要求:超时时间 > 请求集合数量 * 1000 / (线程数 / 线程加载时间)。
  • 分母:每秒启动的线程数;请求集合数量:为设定的性能测试场景的样本并发数量。
  • 结果为:加载性能并发样本所需时间(毫秒)。

CSV DATA SET CONFIG

以下是CSV Data Set Config各个参数的简要说明:

  • FileName:即同目录下csv文件的名称。
  • File Encoding: 默认为ANSI。
  • Varible Names: 定义文本文件中的参数名,参数之间逗号分隔.定义后可在脚本在以Shell变量的同样的方式引用。
  • Allow Quoated data: 双引号相关。
  • Recycle on EOF: 设置为True后,允许循环取值。
  • Stop Thread on EOF: 当Recycle on EOF为false并且Stop Thread on EOF为true,则读完csv文件中的记录后,停止运行。
  • Sharing Mode: 设置是否线程共享。

函数助手


其他元件库
此部分实际应用时可通过搜索引擎查看相关配置。

定时器

逻辑控制器

配置元件

前置处理器

后置处理器

断言

监听器

脚本开发

BeanShell

什么是Bean Shell?

  • BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法。
  • BeanShell是一种松散类型的脚本语言(这点和JS类似)。
  • BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象- 脚本语言特性,非常精简的解释器jar文件大小为175k。
  • BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。

BeanShell官网地址

BeanShell的用法:
在此介绍下BeanShell Sampler的用法,其它的beahshell可以类推。在此我们使用beahshell调用自己写的工具类,工具类实现了求三个数相加之和的功能:

  1. 在eclipse写好代码,然后把该类打成jar包(在类上点击右键->Export->jar file)。
  2. 把jar包放到jmeter目录\apache-jmeter-2.13\lib\ext下或者\apache-jmeter-2.13\lib\下。
  3. 测试计划中引入jar包。
  4. 打开jmeter,在sampler下添加一个BeanShellSampler,添加一个http sampler(调用小说网址)。
  5. 在beanshell Sampler中导入我们的jar包,调用里面的求和方法,把结果保存在jmeter变量中,下面两个方法是beanshell中我们最常用到的:
    • vars.get(String paramStr):获得变量值。
    • vars.put(String key,String value):,将数据存到jmeter变量中。
    • 把求和之和的值存到jmeter变量中,然后在http sampler中就可以通过${result}进行使用了。
    • 执行脚本。**

**
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

  • **log:**写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”)。
  • **ctx:**该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext。
  • vars: (JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:
  • vars.get(String key):从jmeter中获得变量值。
  • vars.put(String key,String value):数据存到jmeter变量中。
  • 更多方法可参考:org.apache.jmeter.threads.JMeterVariables。
  • props:(JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
  • props.get("START.HMS")。注意START.HMS为属性名,在文件jmeter.properties中定义。
  • props.put("PROP1","1234")。
  • prev:(SampleResult):获取前面的sample返回的信息,常用方法:
  • getResponseDataAsString():获取响应信息。
  • getResponseCode() :获取响应code。

FTP请求

用于intenet上文件的双向传输。需要兼容不同的操作系统,需要遵循相同的协议;与FTP默认设置一样只是多了用户名和密码。设置与"FTP默认设置"基本一样只是多次用户名和密码。

端口号不填写时默认为21:

  • SaveFilein Response?在结果察看树中的响应返回中可以看到内容
  • use binary mode?是否用二进制传输

☞使用二进制与文本传输区别
ASCII 方式和BINARY方式的区别是回车换行的处理,binary方式不对数据执行任何处理,ASCII 方式将回车换行转换为本机的回车字符,比如Unix下 是\n,Windows下是\r\n,Mac下是\r。
ASCII 方式下会转换文件,不一样的系统有不一样的行完毕符,unix系统下行完毕符是一个字节,即十六进制的0A,而ms的系统是两个字节,即十六进制的0D0A所以当你用ascii方式从unix的ftp server下载文件时(不论是二进制或许文本文件),每检测到一个字节是0A,就会自动插入一个0D,所以假设你的文件是二进制文件比如可执行文件、紧缩包什么的,就肯定无法用了。
假设你的文件就是unix下的文本文件,你用ascii方式是正确的,要是误用了binary方式,你在windows上看这个文件是没有换行的,内部是一个个的黑方块。普通来说,咱们最好都用binary方式,这样可以保证不出错。假设有文本格式转换的疑问,即unix格式的文本和dos格式的文本
Get下载、Put上传。如果是匿名用户也必须填写anonymous

JAVA请求

Java请求带有两个java请求类:JavaTest和SleepTest。
核心步骤

  • 创建一个Java工程。
  • 将JMeter的lib、lib/ext和lib/junit目录下的jar下文件添加进此工程的Build Path。
  • 创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写:
    • public Arguments getDefaultParameters():设置可用参数及的默认值。
    • public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作。
  • public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值。
    • public void teardownTest(JavaSamplerContext arg0):测试结束时调用。
  • Export为Runnable Jar File。
  • 将此jar包放入JMETER_HOME\lib\ext目录。
  • 创建线程组、Java Request、结果树,进行测试。

实例
新建java项目并引入Jmeter jar包和Junit Jar包,新建需要的包和类:

准备需要测试的代码,如新建一个文本文件并写入内容:
Junit测试代码
实现JavaSamplerClient接口:
新建Junit测试:
打jar包,并放入jmeter/lib/ext下:

在JMeter中进行测试:

JDBC请求

工作中需要对数据库进行测试,比如要看看1个sql的并发性能。
准备表:
常用步骤

  • 设置JDBC连接池
  • 添加JDBC请求

JDBC连接池设置
事务的ACID:A原子性、C一致性、I隔离性、D持久性。
先理解一下:

  • 脏读:一个事务读另一个事务未提交的数据。
  • 不可重复读:一个事务再次读之前的数据时,这个数据已经被另外数据修改。
  • 幻读:一个事务重新执行查询,返回的记录包含了其他事务提交的心记录。
  • TRANSACTION_NONE:不支持事务
  • TRANSACTION_READ_UNCOMMITTED:允许脏读、不可重复读和幻读。
  • TRANSACTION_READ_COMMITTED:禁止脏读,但允许不可重复读和幻读。
  • TRANSACTION_REPEATABLE_READ:禁止脏读和不可重复读,允许幻读
  • TRANSACTION_SERIALIZABLE:禁止脏读、不可重复读和幻读
  • DEFAULT:禁止脏读,但允许不可重复读和幻读。

mysql数据库:无需引入其他数据库驱动jar包,但要注意末尾别带了空格如:“com.mysql.jdbc.Driver ”。
sql server 数据库:下载sqljdbc4.jar 放到 jmeter根目录的lib目录下。
oracle数据库:将oracle数据的安装目录下面的\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar 放到jmeter根目录下的lib目录下。
数据库URL:


JDBC请求
query Type查询类别:

  • Select Statement:查询时用到。
  • update Statement:更新用到。
  • Callable Statement:CallableStatement对象,调用存储过程,可以有参数和占位符。
  • Prepared Select Statement:预编译查询语句{为了减少硬编译资源消耗,提倡使用绑定变量}。
  • Prepared Update Statement:预编译更新语句{为了减少硬编译资源消耗,提倡使用绑定变量}。
  • Commit:当前连接中的内容提交。
  • Rollback:当前连接状态中的内容回滚。
  • AutoCommit(false):指明不需要提交。

其他参数:

  • parameter values:参数值,参数户sql语句。
  • parameter types:参数类型。
  • variable names:查询结果列保存的变量名。
  • Result Variable name:查询结果集保存的变量名。
  • query timeout:定义查询超时时间。


JDBC请求实例
1)为查询语句定义入参
方法一:使用用户自定义参数:

方法二:使用‘占位符’:


☞注意:如果使用Select Statement只能使用变量,不能使用‘占位符’;如果使用Update Statement只能使用变量,不能使用‘占位符’;Callable Statement可以使用‘占位符’和变量定义。
2)使用commit语句时(连接配置不能自动提交)

3)使用rollback语句(连接配置不能自动提交)

JUnit 请求

Junit介绍
单元测试工具:

Junit请求

  • 核心步骤
  • 创建一个Java工程。
  • 创建想要测试的服务。
  • 创建想要的Junit测试。
  • Export为Runnable Jar File。
  • 将此jar包放入JMETER_HOME\lib\junit目录。
  • 创建线程组、junit Request、结果树,进行测试。
  • 实例
  • 工程目录

  • 创建服务
  • 创建Junit
  • 导入工程,准备脚本

  • 添加一个监听器,以查看结果

SOAP/XML-RPC接口测试

soapui工程可用在这里下载:https://git.oschina.net/giftboys/WebServiceSample.git

  • 一般步骤:
  • 取得RUL
  • 取得请求的XML
  • 参数化或变量化
  • 添加察看结果树
  • 实例:

通过WSDL方式取得地址等信息,如:

取得请求的XML,测试同时可用向研发索取,或者通过soapui等工具取得。

参数化或变量后的请求:

察看结果树:

  • 实例代码-接口:
  • 实例代码-实现:

RestFull接口测试

  • 一般步骤:
  • 取得RUL
  • 取得请求的XML
  • 参数化或变量化
  • 添加察看结果树
  • GET实例:

通过WADL方式取得地址等信息,如:

取得请求的XML,测试同时可用向研发索取,或者通过soapui等工具取得。

参数化或变量后的请求:

察看结果树:

  • put实例:

通过WADL方式取得地址等信息,如:

取得请求的XML,测试同时可用向研发索取,或者通过soapui等工具取得。

参数化或变量后的请求:

察看结果树:

  • 实例代码-接口:
  • 实例代码-实现:

本文就到这里了,这个假期很充实!
转载:https://gitbook.cn/gitchat/activity/58d70a9f77508ce666dbe12a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants