| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> JMeter 入门实践指南 -> 正文阅读 |
|
[开发测试]JMeter 入门实践指南 |
前言Apache JMeter是测试工程师日常工作中经常会使用的一款软件,它可用来测试接口、模拟用户负载来完成性能测试工作,可以对web应用或各种服务的性能进行分析和度量。它具有开源高扩展性,使用成本低的特点,是当前使用率最高、最好用最全面的性能测试工具之一。本篇文章为大家详细描述了在使用 JMeter 进行测试时常用的测试场景的脚本编写方法,希望能为你带来一些帮助,推荐收藏,作为工具书查阅。 JMeter 有什么优势?开源免费:开源意味着高扩展性,免费意味着使用成本低; 高扩展性:支持可视化插件进行扩展测试; 友好GUI:界面简单易用; 可移植性:100% 纯 Java 桌面应用程序,可以多平台运行; 安装方便:组件小,下载安装包解压,配置路径即可使用; 完全多线程:可以通过多个线程组并发取样,也可通过单独的线程组对不同的功能同时取样; 结果可视化:可视化界面展示执行结果和你可能需要关注的性能指标; 多测试策略:比如功能测试、负载测试、分布式测试; 录制回放:支持多种录制脚本的方法,最常见的是第三方工具 Badboy 录制,还有JMeter自身设置来录制脚本; 仿真:可以模仿真实的用户行为; 支持多协议:支持 HTTP、HTTPS、FTP、SOAP / REST、LDAP等多种协议; 支持脚本测试:可以自行编写 bean shell、java脚本进行测试。 下面我们就来了解下如何使用JMeter来进行脚本的开发,首先你要先安装上它。 下载与安装一、下载地址:Apache JMeter - Download Apache JMeter 二、选择需要版本的zip包(解压安装方式时) 三、文件解压缩,把下载的zip文件解压缩到你的安装目录 四、配置环境变量(适用win10系统)
五、安装完成 JMeter 安装路径——bin——jmeter.bat,鼠标右键管理员方式运行/双击运行 注意:JMeter 3.0需要对应安装jdk1.7,JMeter 4.0对应jdk1.8以上,否则启用 JMeter 也会报错 快速开始JMeter 导航栏初次使用 JMeter 的伙伴可能对界面上的一些元素不太熟悉,下面就通过一张图来说明一些常用元素的含义 。 你也可以打开已存在的脚本,路径为:文件——打开——选择jmx文件即可。 如何进行脚本录制?使用Badboy进行脚本录制下载与安装
Badboy使用
使用 JMeter 的代理服务器功能进行脚本录制
录制效果如图: 但是并不推荐使用脚本录制工具,更推荐手动编写脚本,原因如下:
测试脚本必需元件JMeter 中一个脚本就是一个测试计划,也是一个管理单元。测试计划需要包含以下要素: 脚本中测试计划只能有一个:JMeter 脚本在 GUI 显示树型结构,测试计划是根节点 测试计划中至少要有一个线程组:JMeter 负载通过线程组驱动,可以建立多个线程组 至少有一个取样器:测试的目的是模拟用户请求,没有取样器的脚本毫无意义 至少有一个监听器:我们需要从结果中分析衡量系统性能 线程组添加线程组 一个测试计划可添加一个或多个线程组,其中多个线程组的运行采用的是并行的方式,即同时被初始化及同时执行其下的 Sampler。 配置参数:
取样器添加 Sampler 取样器(Sampler)是与服务器进行交互的单元。一个取样器通常进行三部分的工作:向服务器发送请求,记录服务器的响应数据和记录相应时间信息。 常用的Sampler:HTTP 请求、Java 请求、JDBC 请求。 监听器添加监听器 监听器(Listener)负责收集测试结果,添加成功后便可执行,根据监听结果判断测试是否达到预期目标 我们常用的包括:察看结果数、聚合报告、用表格查看结果,都支持将结果数据写入文件。 添加察看结果树后,运行脚本,可在察看结果树中看到运行结果。 一般关注 Response Code 看请求是否成功,Response Headers 里可能要提取一些身份验证信息。 请求里我们可以观察自己发出的请求信息是否正确,如 Cookie 信息是否正确等。 响应数据是我们最关注的内容了,这里可以查看请求返回的数据,一般我们还需要对响应数据进行断言,来判断接口返回是否符合预期。 常见类型的接口请求查询参数类型查询参数,其实就是URL地址中问号(?)后面的部分就叫查询参数,比如:https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/fonts/fontawesome-webfont.woff2?v=4.6.1。在这个接口中,查询参数就是v=4.6.1。这一部分是由有键值对组成,格式为:key1=value1&key2=value2, 如果有多组键值对,要用&隔开 。 在 JMeter 中如何请求
表单类型在请求头中查看 Content-Type:application/x-www-form-urlencoded .那么就说明客户端提交的数据是以表单形式提交的 。 在 JMeter 中如何请求 可以在察看结果树中看到post请求中,参数不会跟在请求url的后面,而是单独的表单数据提交,安全性更好。 json类型这应该是接口测试中最常见的一种情况了 , 请求头中 Content-Type: application/json;charset=UTF-8 。 在 JMeter 中如何请求 添加 HTTP 请求后,填写请求方法为 POST ,服务器信息和 URL ,以及请求的 json 参数。 在 HTTP 请求上添加 HTTP 信息头管理器,需要配置 Content-Type 如下,若不设置,Content-Type 默认是application/x-www-form-urlencoded,会导致请求失败。 请求如下: 上传文件类型浏览器中可以看到请求的原始传参,如下图所示。 在 JMeter 中如何请求
注意:信息头管理器中不要填写 Content-Type。 常用的文件类型 MIME 类型表(也可用通过页面请求时控制台的 Content-Type 值来获取MIME类型)。
上面我们演示了比较常见类型的接口测试,但是实际应用的场景可能更加复杂,下面就来说下必不可少的参数化。 学习指南体系结构我们将它拆解为三维空间,X1~X5 是负载模拟的过程。 YI:负载模拟,模拟用户请求 取样器Sampler:模拟用户操作,向服务器发出请求 X2:当取样器有参数化需求时,为取样器提供数据支持 前置处理器:环境/参数准备工作,如数据库连接 配置元件:参数化,为取样器提供预备数据 后置处理器:处理响应数据 X3:控制器:实现各种业务场景的灵活控制 X4:定时器:请求发送的时间控制 X5:线程组:模拟用户负载情况,设置运行线程数、时长、定时运行等 Y2:断言:验证结果正确性,实际结果与预设结果匹配 Z:监听器:对测试结果进行处理和可视化展示,常用的有图形结果、查看结果树、聚合报告等 如何进行参数化?参数化是自动化测试脚本的一种常用技巧。简单来说,参数化的一般用法就是将脚本中的某些输入使用参数来代替,在脚本运行时指定参数的取值范围和规则。常用的参数化元件包括配置元件、前置处理器、函数助手。 用户定义的变量 User Defined Variables 中定义的参数值在 test plan 执行过程中不能发生取值的改变,适用于全局的、在多处引用的变量,比如环境、账号信息等。 在需要引用用户自定义变量的地方进行引用 ${variableName}。 HTTP 请求默认值 当我们在对某个网站进行测试时,往往服务器地址是统一不变的,这时我们就可以使用HTTP请求默认值,设置固定的请求信息,那么在后续的 HTTP 请求中若不配置 Web 服务器信息,则会使用这里的配置值作为默认值。一定程度上提升工作效率,并且当我们想要切换不用的测试环境时,我们也不必进到每个请求中修改,只需在默认值这里修改即可。 前面我们演示了一些在工作中常用的固定参数配置的方法,但是我们工作中常常需要去进行一些参数不固定的请求,比如并发请求时使用不用的账号登录,或者批量造数据时,每次的入参需要不一样,这时我们可以使用下面的方法。 用户参数 用户参数适用于小范围参数变化,每次迭代更新一次 如果有多个用户/使用变量时勾选,则不同的线程用不同的值 如果不勾选,所有线程用的是同一个值。 路径:选中线程组右键添加——前置处理器——用户参数。 csv data set config 当我们想要进行批量接口测试的时候,往往参数是大规模的动态数据,这时我们就可以使用csv来配置请求参数,然后 JMeter 中去读取 csv 文件中的数据,实现接口请求。 路径:选择需要读取文件数据的请求右键添加——配置元件—— csv data set config。 csv 适用大规模的动态参数,我们可以在 csv 文件中维护我们的数据,然后在请求中引用 csv 文件中的参数。 函数助手 函数大全使用指南:Jmeter函数助手大全 - 简书。 介绍:JMeter提供了一组函数来帮助生成需要的数据,可用作参数化,还可以进行运算、字符编码格式转换等,以${__function()}形式进行函数调用。 路径:JMeter主菜单——选项——函数助手对话框。 使用:找到对应的函数功能,输入对应参数,自动生成函数字符串,引用函数字符串。 如何进行动态数据关联?在HTTP请求的参数中经常会遇到一些参数的值是从服务器相应的动态数据,这些数据需要进行关联才能使得每一次请求都能成功得被服务器接受,在 JMeter 中使用后置处理器来获取这些动态的数据。 JSON提取器
正则表达式提取器 正则表达式允许用户从服务器响应中获取数据,作为一个后置处理器,正则表达式提取器会在每一个请求执行后再执行,正则表达式提取请求的参数值,产生模板字符串,并将结果保存到给出的变量中。
实例展示: 待提取响应头:Set-Cookie:xsrf-token=B5FF209B4831463699204ECCDAFAC423; Domain=91lyd.com; 需要提取 xsrf-token 的值,则提取表达式如下 xsrf-token=(.*);Domain 添加一个 Debug Sampler(线程组——Sampler中),可以看到 JMeter 变量中 xsrf-token 变量提取过程保存了一个数组,其中 xsrf-token_g 为元素总数,xsrf-token_g0 为全部字符串,xsrf-token_g1 为取到的第一个匹配内容,以此类推。 正则表达式提取变量引用也是以 ${xsrf-token} 的方式进行引用。 如果不确定写的正则表达式能不能匹配到数据,可以在查看结果树中进行查找,在对应的响应信息中输入正则表达式,勾选正则表达式,点击 find 按钮即可验证正则表达式是否能匹配到。不过该方式适用于 Response Data 的匹配,对于 Response Header 不适用。 如何模拟复杂的业务逻辑?当我们在进行一些复杂业务场景的请求时,我们可能需要编排请求的执行顺序或者执行次数等,这时我们就需要用到逻辑控制器,逻辑控制器(Logic Controller)可以自定义 JMeter 发送请求的行为逻辑,它与 Sampler 结合使用可以模拟复杂的请求序列。 循环控制器 循环控制器可以设置请求的循环次数或永远循环。 While控制器 While 条件循环:While Controller 会一直运行,直到条件 (Condition) 为 false。 添加元件:右键线程组->添加->逻辑控制器->while controller。 Condition 的可能值如下:为空 -- 直到某次 sample 执行失败才会退出循环 LAST -- 直到最后一个 sample 请求失败,才会退出循环其它 -- 输入最终计算结果等同于“false”的变量或函数。 如下实例: ${var_name} - var_name 的值由其它元素设置为"false" ${__javaScript(${count}<60 && ${code}=="5001")} ${__P(property)} - 某处会被设置为"false"的某个属性 (property) 上图为判断变量 calculateTaxErrorCode 变量的值等于100004时,则执行 While 循环体内的 sampler,否则跳出While 循环。 事务控制器 性能测试结果统计需关注TPS,即每秒事务数,JMeter会把每个请求统计成一个事务,但也可通过逻辑控制器设置。 事务控制器可以将多个请求放在同一个事务中。如果选中 Gegerate parent sample ,则聚合报告中只显示事务控制器的数据,而不会显示其中的各个请求的数据,反之则全部显示。 如何进行请求断言?断言用于检查测试中得到的响应数据等是否符合预期。在 request 的返回层面增加一层判断机制;因为 request 成功了,并不代表结果一定正确。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。最常用的断言方式为响应断言。 路径:在选择的【Sampler——断言——响应断言】元件中配置响应的检查内容。 一个 Sampler 可以添加多个断言,当 Sampler下所有的断言都通过了,那么才算 request 成功。 模式匹配规则: 包括:相当于 Substring,返回结果包括你指定的内容,可以支持正则匹配 。 匹配:相当于 equals 。当返回值固定时,可以返回值做断言,效果和 equals 相同 。 Equals:返回结果与你指定结果一致。 Substring:返回结果包括指定结果的字串。 否:不进行匹配。 要测试的响应字段: 响应文本: 服务器响应文本,一般普通http响应,都勾选这个。 Document(Text):包括文本响应,还支持 PDF, Office, Audio, Video等。JMeter 会用 Apache Tika 去解析服务器响应内容,很耗内存且很容易解析失败。 url样本:是对 sample 的 url 进行断言。没有重定向,那么就是请求 url 。 有重定向(且跟随重定向),那么 url就包含请求 url 和 重定向 url 。 响应代码:http 响应代码,如101,200,302,404,501等。要验证 404,501 等 http 响应代码时,需要勾选“ ignore status”。 响应信息:http 响应代码对应的响应信息。 要测试的模式 若响应结果预期为 json 串,可以填写完整 json 格式串(得保证 json 内容完全一致,否则断言失败),如果只想匹配 json 串中的某个字段,可以用 "key":"value" 的形式进行断言,支持多个键值对的断言,如下: 断言结果为通过时,显示绿色。 断言结果为失败时,显示红色。 如何便捷查看性能指标?当我们执行性能测试的时候,需要关注请求的错误率、响应时间、吞吐量等信息,我们就可以添加一个聚合报告,它会帮我们生成所有 Sampler 的相关信息。具体参数解释如下:
如何进行数据库请求?测试过程中经常会遇到需要操作数据库增删改或查询数据后作为其他业务的参数使用的场景。 数据库操作的简单用法
方式一:JMeter 中引入 mysql 的jar包到 JMeter 的安装目录:下载 mysql-connector-java-x.x.xx.zip 文件,解压 mysql-connector-java-x.x.xx-bin.jar 到 JMeter 的安装目录下的 /apache-jmeter-3.2/lib/ext 文件夹下,然后重启JMeter。 方式二:使用 JMeter 的 Test Plan 引入相应的 jar 包,在测试计划中,使用 Add directory or jar to classpath 选项。
1)线程组——配置元件—— JDBC Connection Configuration 2)配置参数 Variable Name: 数据库连接池的名称,我们可以有多个 jdbc connection configuration,每个可以起个不同的名称,在 jdbc request 中可以通过这个名称选择合适的连接池进行使用。 Database URL: 数据库 url,jdbc:mysql:// 主机 ip 或者机器名称:mysql 监听的端口号/数据库名称, 如:jdbc:mysql://localhost:3306/test JDBC Driver class: JDBC 驱动 username:数据库登陆的用户名 passwrod:数据库登陆的密码 3)不同数据库具体的填写方式,可以参考下面的表格:
1)线程组——Sampler——JDBC Request 2)配置 JDBC 请求参数 Variable Name:数据库连接池的名字,需要与 JDBC Connection Configuration 的 Variable Name Bound Pool名字保持一致 Query:填写的 sql 语句 Parameter values:参数值 Parameter types:参数类型,可参考:Javadoc for java.sql.Types Variable names:保存 sql 语句返回结果的变量名 Result variable name:创建一个对象变量,保存所有返回的结果 Query timeout:查询超时时间 Handle result set:定义如何处理由 callable statements 语句返回的结果 以上我们就完成了一个简单的查询和更新 sql ,但是如果我们的返回结果为多行或多列数据时,要怎么获取需要的数据呢? Variables names 参数使用方法 如果给这个参数设置了值,它会保存sql语句返回的数据和返回数据的总行数。使用 ${columnName_#}、${columnName_1}...获取相应的值,此处的 columnName 代表具体的列名,如下例中的 customer_id 。 customer_id :代表第一列所有的数据,customer_id_# 可以获取到第一列的行数。 customer_id_n :获得第一列第n行的数据。 tax_no 和 area_code 的功能类似, 假如我们只需要 customer_id 和 area_code 的数据,可以写成customer_id,,area_code ,中间的 "," 不可以省略。 Result variable name 参数使用方法 如果给这个参数设置值,它会创建一个对象变量,保存所有返回的结果,可以在 BeanShell 脚本中进行获取,获取具体值的方法:columnValue = vars.getObject("resultObject").get(0).get("Column Name")。 上面说了 sql 语句固定的情况,如果我们要执行的 sql 需要参数化,该怎么做呢? JDBC Request参数化 方法一、JMeter 参数化,在 sql query 中使用变量
方法二、在 sql query中使用 "?" 作为占位符,并传递参数值和参数类型
如何使用命令行模式?因为可视化的图形页面会占用一定的资源,影响性能测试的结果,所以当我们在执行性能测试时,更推荐使用命令行执行脚本的方式,脚本如下: $ JMeter -n -t my_test.jmx -l log.jtl
注意: 执行命令前要检查当前目录是否是 %JMeter_Home%\bin 目录; 如果 JMeter 脚本不在当前目录,需要指定完整的 路径;如果要把执行的结果保存在其他地方也要指定完整的路径。 |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/18 4:36:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |