• JMeter使用简介


    接口测试工具-目录

    JMeter简介

    在完成接口功能测试后,根据接口需求我们要对接口的性能进行测试。
    JMeter是目前比较流行的开源性能测试工具。免费,灵活并支持众多插件。同时支持分布式压力测试。
    JMeter以Test Plan(测试计划)为基本单位。Test Plan下添加线程组作为运行控制器。
    Test Plan(测试计划)默认包含以下3种线程组。

    • setup线程组: 可选,进行整个计划的测试准备
    • 线程组:运行控制
    • teardown线程组:可选,进行整个计划的测试清理

    JMeter中包含很多元件,常用元件及大致作用顺序如图2-28所示。

    图2-28  JMeter处理流程

    采样器是JMeter的核心元件,负责数据的发送和采集,如HTTP请求。在采样器前后可以添加前置处理和后置处理器,对请求数据进行预处理以及对响应数据进行变量提取操作。同时还可以在配置管理器类型元件中添加默认配置或使用数据文件等。
    断言元件用于对比响应结果和预期结果的对比,监听器用于查看响应及测试结果。

    中文及编码设置

    JMeter默认为英文界面,可以在菜单语言选项中临时切换为简体中文语言。想要永久生效可以修改JMeter安装目录bin目录中的jmeter.properties文件。
    修改language属性值为zh_CN,并保存。同时为确保响应数据中的中文可以正常显示,可以修改sampleresult.default.encoding为UTF-8格式。如果2.29和2.30所示。

    图2.29  JMeter 中文界面配置

    图2.30  JMeter UTF-8编码配置

    修改完配置后保存,重启JMeter即可。

    发送请求

    使用JMeter发送请求,只要使用采样器元件中的HTTP请求元件并填写对应的请求数据即可。

    发送GET请求

    首先在JMeter测试计划中添加线程组,线程组使用默认配置即可。在线程组上点击右键,选择采样器,选择HTTP请求,修改请求名为GET请求,填写协议、服务器地址、方法、路径及参数值,如图2.31所示。

    图2.31  JMeter 发送GET请求

    如果参数中包含中文,可以在内容编码处加上utf-8,同时在参数刚勾选编码(URL编码)。
    如果想要查看响应结果,可以在线程组上点击右键,在监听器中选择结果树。点击工具栏上的三角按钮发送请求后,便可在请求树中看到响应的响应数据。

    发送POST-表单格式请求

    同样,发送POST请求需要添加采样器-HTTP请求元件,按需求填写请求数据,点击发送图标即可,如图2.32所示。

    图2.32  JMeter 发送POST-表单请求

    POST请求的参数表格对应请求体中的参数而不是URL参数,如果接口需要传递URL参数,可以填写到接口路径中。
    同样,如果参数中包含中文,可以勾选上编码。发送完请求后,可以在结果树中查看响应结果,如图2.33所示。

    图2.33  JMeter 结果树-查看响应数据

    在结果树请求列表上方,可以切换显示格式(如切换为JSON格式),以相应的格式查看响应数据。同时也可以查看请求数据或响应头数据等。

    发送POST-JSON格式请求

    发送JSON格式的POST请求,首先添加采样器HTTP请求元件,填写请求数据,请求体数据切换到消息体数据,填写相应的JSON格式的数据,点击发送即可。如图2.34所示。

    图2.34  JMeter 发送POST-JSON请求

    消息体数据要符合JSON语法格式,否则文本框中对应行前会显示出错提示。如果消息体中包含中文,要声明内容编码为utf-8。
    4.发送POST-XML格式请求
    发送XML格式的POST请求与JSON一样,在消息体数据中填入XML格式的请求数据,点击发送即可。如图2.35所示。

    图2.35  JMeter POST-XML请求

    同样,消息体数据中如果包含中文,需要声明内容编码utf-8。

    发送POST-上传文件请求

    在HTTP请求元件的中可以通过文件上传选项卡发送上传文件类型的POST请求。首先添加HTTP请求元件,填写请求数据,勾选对POST使用multipart/form-data,点击浏览,选择文件上传,选择文件路径,填写对应的参数名称,和文件MIME类型,点击发送按钮即可。如图2.36所示。

    图2.36  JMeter上传文件

    注意要勾选上面的对POST请求使用multipart/form-data即混合表单格式。每个上传的文件一般对应一个参数,同时要填写文件格式对应的MIME类型。支持添加多个文件。

    断言

    断言是接口测试以及性能测试中必不可少的一部分。断言帮我们自动判断请求的成功与否。JMeter中支持多种格式的断言,可以在断言元件中添加。

    响应断言

    响应断言是对请求、响应数据(包含请求头、响应头数据)进行的一种基本断言。添加方法为在线程组上点击右键,选择断言,选择响应断言即可。如图2.37所示。

    图2.37  JMeter 响应断言-包含指定文本

    如上图,要断言响应体数据中包含指定文本,可以在响应断言中选择响应文本,选择包含,填写要包含的文本(如“登录成功”),并可以自定义该条断言失败时的消息内容。
    响应文本的断言支持使用正则表达式匹配,如图2.38所示。

    图2.38  JMeter 响应断言-正则表达式

    如上图,选择响应文本,选择匹配,填写相应文本应匹配的正则表达式即可。

    JSON响应断言

    对于JSON格式的响应,可以使用JSON断言验证其中指定的字段的值符合预期。添加方法为,右键点击线程组,点击断言,选择JSON断言即可。
    JMeter中JSON断言中使用JSONPath语法来提取响应的指定字段。我们可以首先利用结果树元件来验证我们的JSONPath语法是否能提取到对应字段。如图2.39所示。

    图2.39  JMeter 结果树-JSONPath验证

    发送完请求,在结果树中选择“JSON Path Tester”,在“JSON Path Expression”中输入JSONPath表达式,如“\(.form.name”。“\)”代表JSON响应的根节点。使用“.”取下级节点,如果是Array数组,可以使用“[N]”来取第N项数据。
    点击Test按钮验证能获取到指定的数据后。在JMeter中对应的请求下添加JSON断言,输入JSONPath表达式。勾选“Additionally assert value”,输入“Expected Value”期望结果即可。如图2.40所示。

    图2.40  JMeter 添加JSONPath断言

    注意如果不勾选Additionally assert value则只要能根据该JSONPath表达式匹配出有值即视为通过。勾选后可以断言JSONPath表达式对应字段的值。

    如果要对多个字段进行断言,要添加多个JSON断言研究。
    点击发送请求,即可在结果树中查看请求通过与否。

    XPath断言

    XPath即XML路径选择语言,适用于XML和HTML格式的文本。对于XML或HTML格式的响应数据,我们可以使用XPath提取节点进行断言。
    添加方式为,线程组上点击右键,点击断言,选择XPath断言即可。
    同样,对于XPath,我们可以使用结果树先来验证XPath表达式。如图2.41所示。

    图2.41 JMeter 结果树-XPath验证
    发送请求后,在结果树中选择XPath Tester,在XPath query中输入对应的XPath表达式,点击Test即可。XPath使用“/”表示根路径,“//”表示任意路径,后面h1是标签名。
    在验证完XPath表达式后,在对应的请求下添加XPath断言,填写指定的XPath表达式即可,如图2.42所示。

    图2.42  JMeter 添加XPath断言

    以上XPath断言只能验证响应中该XPath表达式能匹配出结果。

    Bean Shell断言

    Bean Shell是一套符合Java语法的脚本语言,同过Bean Shell可以使用代码,灵活的对响应数据进行各种操作及判断。
    Bean Shell中可以通ResponseCode、ResponseHeaders及prev.getResponseDataAsString()来获取String格式的状态码、响应头以及响应体数据。通过if判断进行断言,断言中通过设置变量Failure=false或Failure=true来设置断言通过或失败,同时还可以通变量FailureMessage设置失败原因。
    添加方式为,线程组上点击右键,点击断言,选择Bean Shell断言即可,如图2.43所示。

    图2-43  JMeter Bean shell断言

    关联

    关联,指将上一个接口的响应数据中的某个值用于下一个接口,又称为接口依赖。关联包含两个部分的操作,一是上一个接口响应数据变量的提取和保存,二是下一个接口中使用参数化变量使用提取和存储的变量值。
    以百度OCR接口为例。该接口首先需要根据个人的id秘钥获取token值,以供百度OCR接口使用。
    -(1)在JMeter中添加一个逻辑控制器,简单控制器元件,在下面添加两个HTTP请求,如图2.44所示。

    图2.44  JMeter 发送所依赖请求

    -(2)在第一个接口获取百度token请求下添加后置处理器元件JSON提取器,使用JSONPath提取变量并设置保存的变量名为access_token。如图2.45所示。

    图2.45  JMeter 使用JSON提取器提取关联变量

    -(3)在下一个接口百度orc的路径中使用${access_token}来使用上面保存的变量。如图2.46所示。

    图2.46  JMeter 使用关联变量

    填写完其他请求数据,点击发送即可在结果树中查看两个请求状态。

    数据驱动

    对于同一个请求,我们经常要使用不同的数据进行测试。此时可以使用数据驱动的方式进行处理。
    JMeter中默认支持使用CSV文件进行数据驱动,添加方法为在线程组上点击右键,点击前置处理器,选择CSV配置元件即可。
    -(1)添加CSV配置元件并选择数据文件,如图2.47所示。

    图2.47  JMeter 添加CSV数据文件

    CSV数据文件不需要有标题行,要在CSV配置元件中声明每一列对应的编码名,以英文逗号隔开,如name,password,分隔符根据文件中的分割符设置,这里是英文逗号。
    -(2)在HTTP请求中使用\({name}和\){password}来参数化变量。如图2.48所示。

    图2-48  JMeter 使用CSV数据文件变量

    -(3)修改线程组迭代次数为数据文件数据行数。点击运行,即可在在结果树中查看每一组数据的请求结果。

    压力测试及生成报告

    JMeter一般用于压力测试,相对于调试接口请求,压力测试时的配置稍有不同。

    请求设置

    压力测试时HTTP请求一般要不勾选“跟随重定向”和“使用Keep Alive”,即如果接口进行的重定向,只请求当前接口,并且不使用Keep Alive,每次请求后断开TCP连接,以便下次请求模拟新用户重新建立TCP连接发送请求。如图2.49所示。

    图2.49  JMeter 去除重定向和Keepalive

    为避免大量的请求日志可以在结果树中勾选“仅错误日志”,如图2.50所示。

    图2.50  JMeter 仅输出错误日志

    线程组设置

    压测时需要根据实际的业务需求如并发量,压测时间等来设置线程组参数。如以200并发压测5分钟。设置如图2.51所示。

    图2.51  JMeter 设置线程组-并发量和持续时间

    Ramp-Up即准备时间,填0即可(同时启动200个线程),循环次数勾选永远,同时勾选调度器,持续时间填写300秒。

    GUI运行

    设置完请求、断言和线程组后,即可开始压测。压测分为GUI使用图形界面运行和非GUI使用命令行运行两种。一般推荐使用非GUI模式运行,客户机性能会更好一点。
    如果使用GUI运行,可以在请求中添加监听器元件中的聚合报告,如图2.52所示。

    图2.52  JMeter GUI运行-查看聚合报告

    在聚合报告元件中可填写报告保存的路径,可以使用csv格式。
    点击运行便可在聚合报告中查看到实时的平均响应时间,出错率和吞吐量等数据。

    生成报告

    聚合报告生成的csv结果数据文件要经过转换才能生成漂亮的HTML格式测试报告。选择菜单栏Tools中的Generate HTML report报告工具。选择聚合报告的结果文件,JMeter当前用户配置(bin目录下的user.properties文件)以及报告输出目录。点击Generate report按钮生成报告,如图2.53所示。

    图2.53  JMeter 生成HTML报告

    生成成功后便可以打开输出目录中的index.html,查看本次压测的结果报告,如图2.54所示。

    图2.54  JMeter HTML压测报告

  • 相关阅读:
    【UVa】And Then There Was One(dp)
    【vijos】1006 晴天小猪历险记之Hill(dijkstra)
    【UVa】Palindromic Subsequence(dp+字典序)
    【UVa】Wavio Sequence(dp)
    【UVa】Salesmen(dp)
    【UVa】Partitioning by Palindromes(dp)
    小结:特殊的技巧
    java 中 进程和线程的区别
    java中的 sleep() 和 wait() 有什么区别?
    Java 静态static 关键字作用
  • 原文地址:https://www.cnblogs.com/superhin/p/16021354.html
Copyright © 2020-2023  润新知