JMeter
引言
由于公司有压测的需求,现在开始学习Jmeter,在这里记录并总结学习的过程。
JMeter介绍
Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。
可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器等等。
JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能。
JMeter可以帮助你对你的应用程序进行回归测试。通过你创建的测试脚本和assertions来验证你的程序返回了所期待的值。为了更高的适应性,JMeter允许调用二次开发的jar包来丰富你的测试场景,JMeter允许你使用正则表达式来创建这些assertions。
JMeter的基本使用
永久设置中文和字体
找到JMeter的配置文件,一般在安装目录下bin文件夹下
################################################################################
# Apache JMeter Property file
################################################################################
################################################################################
#Preferred GUI language. Comment out to use the JVM default locale's language.
language=zh_CN
#---------------------------------------------------------------------------
# Look and Feel configuration
#---------------------------------------------------------------------------
jmeter.hidpi.mode=true
# To enable pseudo-HiDPI mode change to true
jmeter.hidpi.mode=true
# HiDPI scale factor
#jmeter.hidpi.scale.factor=1.0
# Suggested value for HiDPI
jmeter.hidpi.scale.factor=1.2
# Toolbar icons default size: 22x22. Available sizes are: 22x22, 32x32, 48x48
jmeter.toolbar.icons.size=48x48
# Tree icons default size: 19x19. Available sizes are: 19x19, 24x24, 32x32, 48x48
# Useful for HiDPI display (see below)
jmeter.tree.icons.size=24x24
#Components to not display in JMeter GUI (GUI class name or static label)
# These elements are deprecated and will be removed in next version:
# MongoDB Script, MongoDB Source Config, Monitor Results
# BSF Elements
not_in_menu=org.apache.jmeter.protocol.mongodb.sampler.MongoScriptSampler,org.apache.jmeter.protocol.mongodb.config.MongoSourceElement,\
org.apache.jmeter.timers.BSFTimer,org.apache.jmeter.modifiers.BSFPreProcessor,org.apache.jmeter.extractor.BSFPostProcessor,org.apache.jmeter.assertions.BSFAssertion,\
org.apache.jmeter.visualizers.BSFListener,org.apache.jmeter.protocol.java.sampler.BSFSampler,\
org.apache.jmeter.protocol.http.control.gui.SoapSamplerGui
# Number of items in undo history
# Feature is disabled by default (0) due to known and not fixed bugs:
# https://bz.apache.org/bugzilla/show_bug.cgi?id=57043
# https://bz.apache.org/bugzilla/show_bug.cgi?id=57039
# https://bz.apache.org/bugzilla/show_bug.cgi?id=57040
# Set it to a number > 0 (25 can be a good default)
# The bigger it is, the more it consumes memory
#undo.history.size=0
# Hotkeys to add JMeter components, will add elements when you press Ctrl+0 .. Ctrl+9 (Command+0 .. Command+9 on Mac)
gui.quick_0=ThreadGroupGui
gui.quick_1=HttpTestSampleGui
gui.quick_2=RegexExtractorGui
gui.quick_3=AssertionGui
gui.quick_4=ConstantTimerGui
gui.quick_5=TestActionGui
gui.quick_6=JSR223PostProcessor
gui.quick_7=JSR223PreProcessor
gui.quick_8=DebugSampler
gui.quick_9=ViewResultsFullVisualizer
#---------------------------------------------------------------------------
# Remote hosts and RMI configuration
#---------------------------------------------------------------------------
# Remote Hosts - comma delimited
remote_hosts=127.0.0.1
#---------------------------------------------------------------------------
# Settings that affect SampleResults
#---------------------------------------------------------------------------
# Save the start time stamp instead of the end
# This also affects the timestamp stored in result files
sampleresult.timestamp.start=true
#---------------------------------------------------------------------------
# Upgrade property
#---------------------------------------------------------------------------
# File that holds a record of name changes for backward compatibility issues
upgrade_properties=/bin/upgrade.properties
#---------------------------------------------------------------------------
# HTTPSampleResponse Parser configuration
#---------------------------------------------------------------------------
# Space-separated list of parser groups
HTTPResponse.parsers=htmlParser wmlParser cssParser
# for each parser, there should be a parser.types and a parser.className property
# CSS Parser based on ph-css
cssParser.className=org.apache.jmeter.protocol.http.parser.CssParser
cssParser.types=text/css
#---------------------------------------------------------------------------
# HTML Parser configuration
#---------------------------------------------------------------------------
htmlParser.className=org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser
htmlParser.types=text/html application/xhtml+xml application/xml text/xml
#---------------------------------------------------------------------------
# WML Parser configuration
#---------------------------------------------------------------------------
wmlParser.className=org.apache.jmeter.protocol.http.parser.RegexpHTMLParser
#Used by HTTPSamplerBase to associate wmlParser with content types below
wmlParser.types=text/vnd.wap.wml
#---------------------------------------------------------------------------
# JDBC Request configuration
#---------------------------------------------------------------------------
# String used to indicate a null value
#jdbcsampler.nullmarker=]NULL[
#
# Max size of BLOBs and CLOBs to store in JDBC sampler. Result will be cut off
#jdbcsampler.max_retain_result_size=65536
# Database validation query
# based in https://stackoverflow.com/questions/10684244/dbcp-validationquery-for-different-databases list
jdbc.config.check.query=select 1 from INFORMATION_SCHEMA.SYSTEM_USERS|select 1 from dual|select 1 from sysibm.sysdummy1|select 1|select 1 from rdb$database
jdbc.config.jdbc.driver.class=com.mysql.jdbc.Driver|org.postgresql.Driver|oracle.jdbc.OracleDriver|com.ingres.jdbc.IngresDriver|com.microsoft.sqlserver.jdbc.SQLServerDriver|com.microsoft.jdbc.sqlserver.SQLServerDriver|org.apache.derby.jdbc.ClientDriver|org.hsqldb.jdbc.JDBCDriver|com.ibm.db2.jcc.DB2Driver|org.apache.derby.jdbc.ClientDriver|org.h2.Driver|org.firebirdsql.jdbc.FBDriver|org.mariadb.jdbc.Driver|org.sqlite.JDBC|net.sourceforge.jtds.jdbc.Driver|com.exasol.jdbc.EXADriver
#---------------------------------------------------------------------------
# Summariser - Generate Summary Results - configuration (mainly applies to non-GUI mode)
#---------------------------------------------------------------------------
#
# Comment the following property to disable the default non-GUI summariser
# [or change the value to rename it]
# (applies to non-GUI mode only)
summariser.name=summary
#---------------------------------------------------------------------------
# BeanShell configuration
#---------------------------------------------------------------------------
# BeanShell Server properties
#
# Define the port number as non-zero to start the http server on that port
#beanshell.server.port=9000
# The telnet server will be started on the next port
#
# Define the server initialisation file
beanshell.server.file=../extras/startup.bsh
#---------------------------------------------------------------------------
# CSV DataSet configuration
#---------------------------------------------------------------------------
# String to return at EOF (if recycle not used)
#csvdataset.eofstring=<EOF>
#list in https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html
csvdataset.file.encoding_list=UTF-8|UTF-16|ISO-8859-15|US-ASCII
#---------------------------------------------------------------------------
# Miscellaneous configuration
#---------------------------------------------------------------------------
# Netscape HTTP Cookie file
cookies=cookies
jsyntaxtextarea.font.family=Hack
jsyntaxtextarea.font.size=20
view.results.tree.renderers_order=.RenderAsText,.RenderAsRegexp,.RenderAsBoundaryExtractor,.RenderAsCssJQuery,org.apache.jmeter.extractor.json.render.RenderAsJsonRenderer,.RenderAsXPath2,org.apache.jmeter.extractor.json.render.RenderAsJmesPathRenderer,.RenderAsXPath,.RenderAsHTML,.RenderAsHTMLFormatted,.RenderAsHTMLWithEmbedded,.RenderAsDocument,.RenderAsJSON,.RenderAsXML
# Classpath finder
# ================
classfinder.functions.contain=.functions.
classfinder.functions.notContain=.gui.
#---------------------------------------------------------------------------
# Additional property files to load
#---------------------------------------------------------------------------
# Should JMeter automatically load additional JMeter properties?
# File name to look for (comment to disable)
user.properties=user.properties
# Should JMeter automatically load additional system properties?
# File name to look for (comment to disable)
system.properties=system.properties
# Comma separated list of files that contain reference to templates and their description
# Path must be relative to JMeter root folder
#template.files=/bin/templates/templates.xml
#---------------------------------------------------------------------------
# Think Time configuration
#---------------------------------------------------------------------------
# Change this parameter if you want to override the APDEX satisfaction threshold.
jmeter.reportgenerator.apdex_satisfied_threshold=500
# Change this parameter if you want to override the APDEX tolerance threshold.
jmeter.reportgenerator.apdex_tolerated_threshold=1500
#---------------------------------------------------------------------------
# Documentation generation
#---------------------------------------------------------------------------
# Path to XSL file used to generate Schematic View of Test Plan
# When empty, JMeter will use the embedded one in src/core/org/apache/jmeter/gui/action/schematic.xsl
#docgeneration.schematic_xsl=
remote_hosts=127.0.0.1
server_port=1099
基础概念
这里介绍jmeter中常用的构件
线程用户Threads
setup线程组
一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行。
teardown线程组
一种特殊类型的ThreadGroup的,可用于执行测试后动作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试结束后执行定期的线程组。
可能你还是不太理他们与普通的线程组有什么不同。 如 果您用过junit,想必你不会对setup ,teardown这2个字眼陌生。 即时每用过,也没关系。 熟悉loadrunner的应该知 道,loadrunner的脚本除了action里是真正的脚本核心内容,还有初始化“环境”的初始化脚本和测试完毕后对应的清除信息的脚本块。 那么这 里 setup thread group 和 teardown thread group 就是分别指这两部分。 其实从本质上来看,他们并没有什 么不同。
线程组
这个就是我们通常添加运行的线程。通俗的讲一个线程组,,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。线程组中包含的线程数量在测试执行过程中是不会发生改变的。
取样器(Sampler)
取样器(Sample)是性能测试中向服务器发送 请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler , 如 HTTP Request Sampler 、 FTP Request Sample 、TCP Request Sample 、 JDBC Request Sampler 等,每一种不同类型的 sampler 可以根据设置的参数向服务器发出不同类型的请求。(在 jmeter 的所有sampler 中,Java Request Sampler 和 Beanshell Request Sampler 是两种 特殊的可定制的 Sampler ,后面会深入讨)
逻辑控制器(Logic Controller)
逻辑控制器,包括两类无件,一类是用于控制 test plan 中 sampler 节点发送请求的逻辑顺序的控制器,常用的有 如果(If)控制器 、switch Controller 、 Runtime Controller、循环控制器等。另一类是用来组织可控制 sampler 来节点的,如 事务控制器、吞吐量控制器。
配置元件(Config Element)
配置元件(config element)用于提供对 静态数据配置的支持。CSV Data Set config 可以将本地数据文件形成数据池(Data Pool),而对应于 HTTP Request Sampler和 TCP Request Sampler等类型的配制无件则可以修改Sampler的默认数据。(例 如,HTTP Cookie Manager 可以用于对 HTTP Request Sampler 的cookie 进行管理)
定时器(Timer)
定时器(Timer)用于操作之间设置等待时间,等 待时间是性能测试中常用的控制客户端QPS的手端。类似于LoadRunner里面的“思考时间”。JMeter 定义了 Bean Shell Timer、Constant Throughput Timer、固定定时器等不同类型的Timer。
前置处理器(Per Processors)
用于在实际的请求发出之前对即将发出的请求进行特殊处理。例如,HTTP URL重写修复符则可以实现URL重写,当RUL中有sessionID 一类的session信息时,可以通过该处理器填充发出请求的实际的sessionID 。
后置处理器(Post Processors)
用于对Sampler 发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据(类似LoadRunner测试工具中的关联概念)。例如,XPath Extractor 则可以用于提取响应数据中通过给定XPath 值获得的数据。
断言(Assertions)
断言用于检查测试中得到的相应数据等是否符合预期,断言一般用来设置检查点,用以保证性能测试过程中的数据交互是否与预期一致。
监听器(Listener)
这个监听器可不是用来监听系统资源的元件。它是用来对测试结果数据进行处理和可视化展示的一系列元件。 图行结果、查看结果树、聚合报告。都是我们经常用到的元件。
实践使用
添加配置元件
一般会添加HTTP信息头管理器、HTTP请求默认值、用户定义的变量这些元件
HTTP信息头管理器:设置每个请求默认携带的请求头,一般会在这里设置token,这里的token是全局变量,使用${__property(token,)}进行取值
HTTP请求默认值:设置每个请求的域名、协议等
用户定义的变量:用在初始化时,可以订阅一些需要用到变量
添加断言
断言可以区分响应是成功还是失败,我这边接口响应成功的接口会在json的结构体中包含"code":0,所以在脚本测试中,code不为0的接口返回,会被判定为响应失败
添加线程组
这里会使用两个线程组,为了保证线程执行的先后顺序,设置测试计划独立运行每一个线程组
第一个线程组负责登录,只会执行一次,拿到登录接口返回的token并且将token设置为全局变量
添加取样器–HTTP请求,填写请求方式以及访问地址等参数
添加JSON提取器,提取token设置成局部变量,局部是在当前线程组生效的变量
添加BeanShell后置处理器,将token设置为全局变量,可以跨线程生效,设置全局变量的关键代码KaTeX parse error: Expected group after '_' at position 2: {_̲_setProperty(to…{token},)};
第二个线程组负责测试流程,会执行多次,配置线程数为50,循环10次,通过上一个线程拿到的token进行认证访问接口
对于简单的接口,添加取样器–HTTP请求配好参数即可
假如接口的返回值中的参数在后面需要用到,可以将参数设置成全局或者局部变量
添加监听器
监听器可以用来查看请求的结果,一般配置结构树和聚合报告就够用,运行结果如下
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末小卡片领取】
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!