文章目录
Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。
JMeter官方文档:http://jmeter.apache.org/index.html
测试计划: 起点,所有组件的容器
线程组: 代表有一定数量的用户
取样器: 向服务器发送请求的最小单元
逻辑控制器: 结合取样器实现一些复杂的逻辑
前置处理器: 在请求之前的工作
后置处理器: 在请求之后的工作
定制器: 负责在请求质检的延迟间隔。固定、高斯、随机
配置元件: 配置信息
断言: 用于判断请求是否成功
监听器: 负责收集结果
执行顺序: 测试计划>>>线程组>>>配置元件>>>前置处理器>>>定时器>>>取样器>>>后置处理器>>>断言>>>监听器
作用域: 辅助组件(除测试计划、线程组、取样器之外的组件)作用于父组件、同级组件,以及同级组件下的所有子组件
线程组元件可以理解为一个测试计划的开始(jmeter其它的元件都要放在线程组下)
右击测试计划>>>添加>>>Threads(Users)>>>线程组

在取样器错误后要执行的动作
(1)、继续:继续执行接下来的操作
(2)、Start Next Thread Loop: 开始下一次循环
(3)、停止线程:退出该线程,不在执行此线程的操作
(4)、停止测试:等待当前执行的采样器结束后,结束整个测试
(5)、Stop Test Now:立刻停止测试
线程属性
(1)、线程数:相当于模拟的用户数量,一个用户占一个线程,模拟200个用户就是200个线程
注:进行参数化时,需配置对应的线程数量
(2)、Ramp-Up Period (in seconds):设置多长时间内启动全部线程。例如线程数为100,时间设定为10s,那么就是10s加载 100个线程,每秒启动的线程数=100/10=10
(3)、循环次数: 如果填具体的数值,就是循环对应的次数,例如线程数为200,循环次数为10,则每个线程发10次请求;如果选择“永远”,则一直执行下去,直到手动停止
(4)、Delay Thread creation until needed:默认不勾选,测试开始时,所有的线程就被创建完。勾选此项,延迟线程创建,直到需要才创建
调度器配置
(1)、持续时间(秒): 脚本持续运行的时间
(2)、启动延迟(秒):脚本延迟启动的时间
选择线程组右键>>>添加>>>Sampler>>>HTTP请求

Basic
(1)、协议:向目标服务器发送http请求时的协议,http/https,大小写不敏感,默认http
(2)、服务器名称或IP: http请求发送的目标服务器名称或者IP地址,比如www.baidu.com
(3)、端口号:目标服务器的端口号,默认值为80
HTTP请求
(1)、方法:发送http请求的方法,例:GET\POST
(2)、路径:目标的URL路径(不包括服务器地址和端口)
(3)、Content encoding:内容的编码方式(Content-Type=application/json;charset=utf-8)
(4)、自动重定向:如果选中该项,发出的http请求得到响应是301/302,jmeter会重定向到新的界面
(5)、Use keepAlive:jmeter 和目标服务器之间使用 Keep-Alive方式进行HTTP通信(默认选中)
(6)、Use multipart/from-data for HTTP POST:当发送HTTP POST 请求时,使用
parameter: 请求 URL 中添加参数,函数定义中参数,而argument指的是函数调用时的实际参数,简略描述为:parameter=形参(formal parameter),
Body Data: 实体数据,就是请求报文里面主体实体的内容,一般我们向服务器发送请求,携带的实体主体参数,可以写入这里
Files Upload: 从HTML文件获取所有有内含的资源:被选中时,发出HTTP请求并获得响应的HTML文件内容后还对该HTML
CSV 数据文件变量是指从外部 csv 文件读取数据出来作为变量
选择请求>>>添加>>>配置元件>>>CSV 数据文件设置

设置CSV数据文件
(1)、文件名:csv文件路径,可以是绝对路径或者相对路径
(2)、文件编码:编码格式,与所选文件编码格式保持一致
(3)、变量名称:如果文件中只有一个变量,直接写变量名,如果有多个变量,用英语的逗号隔开
(4)、是否允许带引号?:
设置为true,参数文件包含引号时,实际的数据为引号中的数据。比如参数文件中的数据为"1",当使用该参数时,实际取得值为1
设置为false,参数文件包含引号时,实际取得值为全部的值。比如参数文件中的数据为"1",当使用该参数时,实际取得值为"1"
(5)、遇到文件结束符再次循环?:
设置为true后,参数文件中的数据循环使用,测试按照线程组中的设置执行。比如csv 文件共有 10 条记录,但线程数有 15 个,循环 10 次后,重头开始循环取值
设置为false后,参数文件不再循环遍历取值
(6)、遇到文件结束符停止线程:当执行完参数文件中所有参数后,直接停止线程
(7)、线程共享模式:
所有线程(All threads):参数文件对所有线程共享,这包括同一测试计划中的不同线程组(测试计划下的所有线程组下的所有线程共享参数文件,所有线程之前参数取值互相影响,线程在同一次迭代下取值相同)
当前线程组(Current thread group): 只对当前线程组中的线程共享(当前线程组下的所有线程公用一个参数文件,同一个线程组下的线程之前取值相互影响,线程在同一次迭代下取值相同)
当前线程(Current thread): 仅当前线程获取(即每个线程获取一个参数文件,各个线程之间参数取值互不影响,线程在同一次迭代下取值相同)
注:
1)当参数文件的位置与线程组在同级下,线程组下存在循环控制器时,循环控制器下的参数取值相同
2)线程组下存在循环控制器时,当参数文件在循环控制器下,循环控制器下每次迭代时重新取值
3)线程组下存在仅一次控制器,参数文件在仅一次控制器下,当参数在仅一次控制器下取值一次之后,之后无论哪次迭代参数取值都不变,类似于unique once
注:创建CSV文件最好用notepad创建,编码格式为UTF-8
设置jmeter发送的HTTP请求头所包含的信息
右键>>>添加>>>配置元件>>>HTTP信息头管理器

信息头,也就是请求头,会跟随HTTP请求一起发送到服务器。比如需要传输User-Agent 、cookie、token或其他某些信息,或是需要伪造请求头的时候。
右键>>>添加>>>配置元件>>>HTTP Cookie管理器

如果你有一个 HTTP 请求,其返回结果里包含一个 cookie,那么 Cookie 管理器会自动将该 cookie 保存起来,而且以后所有的对该网站的请求都使用同一个 cookie。
管理公用的HTTP请求配置数据
线程组右键>>>添加>>>配置元件>>>HTTP请求默认值

配置线程组下所有【HTTP请求】的请求行和请求体的默认值,与【HTTP请求】放在同级目录。配置后,每个【HTTP请求】无需重复配置,特殊的请求也可以单独配置,单独配置的优先级更高
选择请求>>>添加>>>配置元件>>>用户定义的变量

引用变量的格式为:${变量名}
优先级:
1、线程组下的用户自定义变量 优先级高于 测试计划里的用户定义的变量
2、HTTP 请求下的用户自定义变量 优先级高于 线程组下的用户定义的变量
注意点:
1、定义的所有参数的值在测试计划的执行过程中不能发生取值的改变。即使变量的值是随机数(Random),不同用户数循环多次,拿到的用户自定义变量值都是一样的
2、一般仅将测试计划中不需要随迭代发生改变的参数(只取一次值的参数)设置在此处
选择请求>>>添加>>>定时器>>>同步定时器(synchronized timer)

模拟用户组的数量(Number of Simulated Users to Group by):设置多少用户进行同步操作。设置为0表示执行线程组的线程数,设置为3只会执行三个线程数(假设同步线程组数设置为5)4,5线程执行到这一步会停止
注:设置的值不能大于它所在线程组中设置的线程数;0表示 all 无穷大,最大
超时时间(Timeout in milliseconds):以第一个到达同步定时器的用户开始,如果在设置的时间内所有用户都达到了,就立即释放后续操作,如果在设置的时间内还没达到,则目前到达集合点的用户先进行释放做后续操作。 设置为0则一直等待,(以第一个到达为准,到多少走多少),如果设置为3,线程设置为永远循环,每凑够三个就会执行释放
jmeter支持的变量类型:用户自定义变量;函数生成变量;BeanShell 变量;数据文件变量
选中请求>>>添加>>>前置处理器>>>用户参数

变量引用格式为:${user}
内置的函数
点击菜单栏选项>>>函数助手对话框>>>下拉选择>>>选择对应函数

接口需要关联时,提取接口指定数据

选择请求右键>>>添加>>>后置处理器>>>正则表达式提取器
(1)、引用名称:请求要引用的变量名称,如填写 result_num
(2)、正则表达式:匹配需要的内容。
(3)、模板:
(4)、匹配数字:0 代表随机取值,1 代表全部取值,
(5)、缺省值:如果参数没有取得到值,那默认给一个值让它取
正则表达式
检查点,比较预期结果与实际结果
选择一个请求右键>>>添加>>>断言>>>响应断言

断言成功,查看结果为绿标;断言失败,查看结果为红标
apply to
(1)、Main sample and sub-samples:作用于父节点取样器及对应子节点取样器
(2)、Main sample only:只作用于父节点取样器
(3)、sub-samples only:只作用于子节点取样器
(4)、JMeter Variable Name to use:作用于jmeter变量(输入框内输入变量名称)
要测试的响应字段
(1)、响应文本(Text Response):从服务器返回的响应文本,比如body,包含HTTP头
(2)、响应代码(Response Code) :比如 200、404
(3)、响应消息(Response Message) :比如 OK
(4)、Response Headers:响应头,比如 Set-Cookie 头
(5)、Document(text):通过Apache Tika追踪的各种类型文档的文本
(6)、lonore Status:指示JMeter设置sampler status的初始状态为success。sample status是否成功,由已Response status和断言结果决定,当选中Ignore Status时,Response status被强制设置为success,不执行进一步的断言判断。仅第一次断言时使用
模式匹配规则
(1)、包括:响应内容包括需要匹配的内容即代表响应成功,支持正则表达式
(2)、匹配:响应内容要完全匹配需要匹配的内容即代表响应成功,大小写不敏感,支持正则表达式。
(3)、Equals:响应内容要完全等于需要匹配的内容才代表成功,大小写敏感,需要匹配的内容是字符串正则表
达式
(4)、Substring:返回结果包含指定结果的字串,但是 subString 不支持正则字符串
(5)、否:不进行匹配
Custom failure message: 自定义失败消息
察看请求发送和返回的信息
查看结果树可以放在线程组下或者某个配置下,右键>>>添加>>>监听器>>>查看结果树

所有数据写入一个文件
(1)、文件名:可以通过浏览,选择一个文件,这样jmeter在执行的过程中,会将所有的信息输出到文件,也支持打开一个结果文件进行浏览
(2)、Log/Display Only(显示日志内容):
仅日志错误:表示只输入报错的日志信息
Successes:表示只输出正常响应的日志信息
不勾选:表示输出所有的信息
(3)、Configuer:配置需要输出的内容
Search: 在输入框中输入想查询的信息,点击查找(Search),可以在请求列表中进行查询,并在查询出的数据上加上红色的边框
结束数显示类型切换: 通过结果树上面的下来看可以进行切换,包含多种显示方式,默认Text
取样器结果: 取样器的详细结果,可以切换取样器的显示方式Raw/Parsed
请求: 显示当前取样器发送的详细请求内容,支持查找
响应数据: 显示请求得到的响应内容,支持查找
Scroll automaticlly?: 当执行的取样器较多,设置是否滚屏显示
查看结果树可以放在线程组下或者某个配置下,右键>>>添加>>>监听器>>>查看结果树
所有数据写入一个文件
(1)、文件名:可以通过浏览,选择一个文件,这样jmeter在执行的过程中,会将所有的信息输出到文件,也支持打开一个结果文件进行浏览
(2)、Log/Display Only(显示日志内容):
仅日志错误:表示只输入报错的日志信息
Successes:表示只输出正常响应的日志信息
不勾选:表示输出所有的信息
(3)、Configuer:配置需要输出的内容
Label:请求名称
# 样本:请求个数
平均值:响应时间 ms(毫秒)
中位数:响应时间 ms(毫秒)
90% Line:响应时间 ms(毫秒)
95% Line:响应时间 ms(毫秒)
99% Line:响应时间 ms(毫秒)
最小值:响应时间 ms(毫秒)
最大值:响应时间 ms(毫秒)
异常%:错误率
吞吐量:吞吐量
接收KB/sec:每秒接收多少KB
发送KB/sec:每秒发送多少KB
好好学习、天天向上
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po