1. 简介
1.1 作用
用于对服务器、网络或对象模拟巨大的负载
自行编写断言脚本验证期望结果是否正确
1.2 优缺点
优点:开放源代码,可自行编写插件扩展新功能;支持多协议;跨平台,不同平台、不同系统都可以使用
缺点:无法验证JS程序、UI界面,前端内容可配合selenium;不支持IP欺骗测试;(行动产生的IP数据包为伪造的源IP地址,以便冒充其他系统或发件人的身份)
2. 基本操作
2.1 添加线程组
选中【测试计划】右键-添加-线程(用户)-线程组
setup线程组:最先执行的线程组
tearDown线程组:最后执行的线程组
2.2 线程设置与执行顺序
没有特殊设置则为并发执行,若要按顺序执行需选中【测试计划】,勾选【独立运行每个线程组】
2.2 添加HTTP请求
选中【线程组】右键-添加-取样器-http请求,或复制其他http请求后选中【父级】进行黏贴
http请求填写方式:http后是ip,:后是端口,端口后为路径,内容编码:utf-8
例子:请求方法:GET ,请求地址:http://127.0.0.1:8000/api/departments/
只有域名的,可以用cmd直接ping域名,然后看回复的ip是啥,这个就是服务器ip
添加http请求默认值,作用:写入重复性的设置,就不用再对单独的http请求进行设置,重复的设置封装在一起
2.3 添加结果树
选中【测试计划】右键-添加-监听器-查看结果树
2.4 添加信息头管理器
提交的数据格式为json格式则需要用【信息头管理器】声明提交的数据的内容类型
否则会报错:不支持请求中的媒体类型
2.5 参数化
动态的获取、设置或生成的数据,用程序代替人工的数据设计,可提高效率。用以下四种方案
1.用户定义的变量,调用格式:${变量名}
2.csv文件批量添加参数
csv:逗号分隔值,文件以纯文本形式存储表格数据(数字和文本),以某种换行符分隔,数据储存格式
变量名称填写需要添加数据用到的变量名称
csv数据中用什么符号分隔数据则分隔符填写什么符号
需要将原有数据替换为变量名
3.用户参数,不能数据与jmeter分离,csv更实用些
需要将原有数据替换为变量名
4.常见函数
(1)计数函数counter
${__counter(true,)}–每个用户有单独的计数器,每个用户都独立从1、2、3开始
${__counter(false,)}–没有单独的计数器,从1、2、3、4、5、6往下顺延
(2)生成随机数函数Random
${__Random(1,6,)}–最小值1,最大值6,为闭区间
(3)时间函数time
时间戳,无指定格式的话即为任意生成从1970年0时0分0秒到现在的时间换算成毫秒
2.6直连数据库
添加jar包,用sqlite则添加sqlite的jar包,用mysql则添加mysql的jar包
添加的取样器要改为JDBC
添加JDBC的配置
需要自己设置的模块
Database URL:需要连接的数据库地址
若是sqlite写法:jdbc:sqlite:数据库存放地址,JDBC Deiver class选择org.sqlite.JDBC
若是mysql写法:jdbc:mysql:// 数据库地址 /数据库名,JDBC Deiver class选择com.mysql.jdbc.Driver
Username与password填写对应的数据库账号密码
JDBC request设置:
1.Variable Name填写在JDBC连接配置中对应的Variable Name
2.select对应查询,update对应增删改
2.7调试取样器
添加调试取样器后在查看结果树中能看到在脚本中所有参数化变量所取的值,这样有利于排错
例如在百度商搜索 学院 ,就可以得到对应的http请求
配置好后就可以动态获取数据
2.8断言
让程序代替人工判断响应结果是否符合预期
响应断言:断言状态码和响应体
大小断言:判断相应内容的字节长度
断言持续时间:判断响应时间
断言通过无提示,失败则会给出错误
(1)响应断言
常用响应文本以及响应代码的判断
响应文本从响应数据中获取即可
报错情况如下
响应代码,若单个则选择相等,若多个则选择或者并且写多个响应代码即可
(2)大小断言
从取样器结果中可看到具体响应的大小
响应代码200不是二百的意思,是代表着2 0 0 三个字符,所以大小断言中字节大小要写3
同理,响应信息为ok,也是代表两个字符,所以大小断言中字节大小要写2
(3)断言持续时间
2.9常见的响应代码分类
借鉴:https://www.bilibili.com/read/cv14908490/
信息响应(100–199);成功响应(200–299);重定向(300–399);客户端错误(400–499);服务器错误 (500–599)
一、信息响应
1、100 Continue:这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。
2、101 Switching Protocol:该代码是响应客户端的 Upgrade (en-US) 标头发送的,并且指示服务器也正在切换的协议。
3、102 Processing (WebDAV (en-US)):此代码表示服务器已收到并正在处理该请求,但没有响应可用。
4、103 Early Hints:此状态代码主要用于与Link 链接头一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源。
二、成功响应
1、200 OK:请求成功,成功的含义取决于HTTP方法:
①GET:资源已被提取并在消息正文中传输;
②HEAD:实体标头位于消息正文中;
③POST:描述动作结果的资源在消息体中传输;
④TRACE:消息正文包含服务器收到的请求消息;
2、201 Created:该请求已成功,并因此创建了一个新的资源。这通常是在POST请求,或是某些PUT请求之后返回的响应。
3、202 Accepted:请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。
4、203 Non-Authoritative Information:服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
5、204 No Content:服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。
6、205 Reset Content:服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
7、206 Partial Content:服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。
8、207 Multi-Status (WebDAV (en-US)):由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
9、208 Already Reported (WebDAV (en-US)):在 DAV 里面使用: propstat 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。
10、226 IM Used (HTTP Delta encoding):服务器已经完成了对资源的 GET 请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。
三、重定向
1、300 Multiple Choice:被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
2、301 Moved Permanently:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
3、302 Found:请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
4、303 See Other:对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。
5、304 Not Modified:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
6、305 Use Proxy:被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。
7、306 unused:在最新版的规范中,306 状态码已经不再被使用。
四、客户端响应
1、400 Bad Request
①语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
②请求参数有误。
2、401 Unauthorized:当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。
3、402 Payment Required:此响应码保留以便将来使用,创造此响应码的最初目的是用于数字支付系统,然而现在并未使用。
4、403 Forbidden:服务器已经理解请求,但是拒绝执行它。
5、404 Not Found:请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
6、405 Method Not Allowed:请求行中指定的请求方法不能被用于请求相应的资源。
7、406 Not Acceptable:请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
8、407 Proxy Authentication Required:与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。
9、408 Request Timeout:请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。
10、409 Conflict:由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。
11、410 Gone:被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。
12、411 Length Required:服务器拒绝在没有定义 Content-Length 头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。
13、412 Precondition Failed:服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
14、413 Payload Too Large:服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。
15、414 URI Too Long:请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。
16、415 Unsupported Media Type:对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
17、416 Range Not **isfiable:如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。
18、417 Expectation Failed:此响应代码意味着服务器无法满足 Expect 请求标头字段指示的期望值。
19、418 I’m a teapot:服务器拒绝尝试用 “茶壶冲泡咖啡”。
20、421 Misdirected Request:该请求针对的是无法产生响应的服务器。 这可以由服务器发送,该服务器未配置为针对包含在请求 URI 中的方案和权限的组合产生响应。
21、422 Unprocessable Entity (WebDAV (en-US)):请求格式良好,但由于语义错误而无法遵循。
22、423 Locked (WebDAV (en-US)):正在访问的资源被锁定。
23、424 Failed Dependency (WebDAV (en-US)):由于先前的请求失败,所以此次请求失败。
24、425 Too Early:服务器不愿意冒着风险去处理可能重播的请求。
25、426 Upgrade Required:服务器拒绝使用当前协议执行请求,但可能在客户机升级到其他协议后愿意这样做。 服务器在 426 响应中发送 Upgrade (en-US) 头以指示所需的协议。
26、428 Precondition Required:原始服务器要求该请求是有条件的。
27、429 Too Many Requests:用户在给定的时间内发送了太多请求(“限制请求速率”)。
28、431 Request Header Fields Too Large:服务器不愿意处理请求,因为它的 请求头字段太大( Request Header Fields Too Large)。 请求可以在减小请求头字段的大小后重新提交。
29、451 Unavailable For Legal Reasons:用户请求非法资源,例如:由政府审查的网页。
五、服务端响应
1、500 Internal Server Error:服务器遇到了不知道如何处理的情况。
2、501 Not Implemented:此请求方法不被服务器支持且无法被处理。只有GET和HEAD是要求服务器支持的,它们必定不会返回此错误代码。
3、502 Bad Gateway:此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。
4、503 Service Unavailable:服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。
6、504 Gateway Timeout:当服务器作为网关,不能及时得到响应时返回此错误代码。
7、505 HTTP Version Not Supported:服务器不支持请求中所使用的HTTP协议版本。
8、506 Variant Also Negotiates:服务器有一个内部配置错误:对请求的透明内容协商导致循环引用。
9、507 Insufficient Storage:服务器有内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当端点。
10、508 Loop Detected (WebDAV (en-US)):服务器在处理请求时检测到无限循环。
11、510 Not Extended:客户端需要对请求进一步扩展,服务器才能实现它。服务器会回复客户端发出扩展请求所需的所有信息。
12、511 Network Authentication Required:511 状态码指客户端需要进行身份验证才能获得网络访问权限。
3. 业务逻辑控制器
3.1 if 逻辑控制器
如果要让if控制器生效,则对应的http请求取样器要做if控制器的子级
需要取消勾选下面红色方框内的内容
–Interpret Condition as Variable Expression
如果不勾选此选项,则输入的条件表达式,将会使用JavaScript进行解析,得到需要的true/false结果。
如果勾选此选项:
1)输入的条件表达式,不会使用JavaScript进行解析,而是将条件视为JMeter的变量。
2)如果需要进行条件判断,则需要使用__jexl3或者__groovy函数,来生成函数表达式。通过函数表达式,得到需要的true/false结果。
–Evaluate for all children
如果勾选该项,则该控制器在每一个子节点执行时前,执行一次。
默认情况下,该控制器可以对在其下面的所有可运行的组件,进行控制执行,但只在入口执行一次。
添加一个变量用于判断是否满足条件
3.2 forEach逻辑控制器
用来遍历每个数组的数据,在用户自定义变量中读取一系列相关的变量,该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。因此有了foreach控制器,就不需要设置线程组循环次数
如果要让forEach控制器生效,则对应的http请求取样器要做forEach控制器的子级
需要自定义使用的变量
foreach控制器
将输出变量名称作为变量写入请求中
3.3 循环控制器
可以单独对一个取样器进行循环请求
如果要让循环控制器生效,则对应的http请求取样器要做循环控制器的子级
4.关联
上一个请求的响应结果数据与下一个请求的数据有关系
例如访问网站1,将返回结果中的某个字段传给另一个访问请求,则需要Xpath提取器
4.1 后置处理器:Xpath提取器
例如
Xpath提取器可以提取网站中由<>组成的标签数据,即html数据
将获取到的值放入变量val中并运用在另一个取样器中,就可以实现关联
4.2 正则表达式提取器
可以获取{ }中的数据,需要做取样器的子级
正则表达式需要用小括号括起来():所有符号都要用英文状态
. 代表任意字符 * 代表任意格式 ? 代表终止贪婪模式,所以(.*?)代表匹配任意字符格式
ps.从响应数据中复制json格式的字段,为了美观可能会出现空格,需要仔细检查是否有空格
贪婪模式:拿到一个符合条件的字段数据后没有停止一直往下拿剩下的的数据,会导致案例报错
4.3 跨越线程组传值
先设置全局变量将要用的值赋给全局变量,再用另一个函数取全局变量的值,将这个函数写于要用这个值的地方
跨越不同线程组传值需要用全局变量,用函数助手生成即可,setproperty设置全局变量函数
将生成的函数字符串写于beanshell取样器中,这个步骤是写为全局变量
再用函数助手property获取全局变量值赋值给hyy
5.性能测试
5.1同步定时器-高并发
假设为同时100人访问
添加同步定时器-在取样器下添加
设置同步定时器配置
超时时间作用:假如共有100人同时访问,一次访问30人,则剩余10人会等待到有30人一起访问。若超时时间设置为n,则等待n毫秒后还是没有满足30人会直接进行访问,若设置为0则会一直等下去,程序会卡死
添加聚合报告可以查看响应时间情况、异常率等
5.2常量吞吐量定时器-高频率
eg.一个用户一秒钟访问20次,持续15秒,统计平均响应时间等;QPS:每秒钟访问次数
添加常量吞吐量定时器
设置定时器配置
设置线程组的循环次数,因为只有一个用户所以线程数为1
运行结果可在聚合报告中查看
5.3分布式
多人协作,以集群方式完成测试任务,提高效率;需要控制机以及若干个执行机
控制机与执行机如何通信:端口号
remote_hosts
server.rmi.ssl.disable,是否允许远程访问字段;#要删除掉
控制机运行时选择远程启动所有,可以同时运行多台执行机
ps.执行机需要打开jmeter.bat文件,进入待命状态
6.接口测试
自动化脚本设计:每次开发人员更新都要保证以前的功能不受到影响,因此要把基本的功能设计自动化执行脚本。每次更新后执行该脚本查看是否老接口有收到影响。(测试数据不能对现有数据进行污染)
例如对增删改查功能的执行脚本,先增最后删除,就不会对现有数据进行影响;且不能修改id
弱压力测试-在一段时间内要求访问某人次
生成图形化报告
1.选中需要生成报告的jmx文件,复制到jmeter的bin目录下,并在当前bin目录输入cmd打开运行窗口
2.输入命令:jmeter -n -t 文件名 -l 日志文件名 -e -o 目录名
ps.日志文件名随意写例如hyy.txt,可以是已存在的文件(但必须保证是空白无内容否则会报错),也可以是不存在的文件会自动生成。目录名为生成图形化报告的目录,也要无内容,可以是已存在的或不存在的。./为当前路径
在设置的目录下就会生成图形化报告
7. 遇到问题及解决方案
1.问题:运行就报Error occurred starting thread group :线程组, error message:Invalid duration 0 set in Thread Group:线程组, see log file for more details 这个错误
解决方案:调度适配器的时间没有设置
版权归原作者 晕呀晕呀哟 所有, 如有侵权,请联系我们删除。