前言
学习Jmeter 接口自动化的难点在于场景设计和模块间的组合使用,因此实际操作过程中我们会遇到过很多难以解决的问题。本书既是对 jmeter 知识框架的一个总结,也是为了方便大家更好的学习使用它。从 jmeter 基础介绍入手,逐级深入,一直延伸到接口自动化持续集成框架和 DDT 数据驱动。内容涵盖了 jmeter 的各元件用法和组合场景使用方法,以及一些不常见的测试技巧。同时也对一些常用的性能指标和瓶颈分析做出了阐述。高阶内容涉及到了 Docker 的使用命令,java 测试脚本的编写,网络爬虫的实际操作。相信大家认真阅读完这本书之后,在技术上一定会有一个质的提升!
Jmeter 性能接口一本通
1:环境部署
1:http://jmeter.apache.org/下载最新版本的 JMeter,解压文件到任意目录2:安装JDK,配置环境变量
JDK 环境变量配置
3:应当避免jdk 路径与jmeter 路径有中文和空格,否则会有异常
2:面板介绍
3:核心组件
3.1:线程组与压力测试
3.1.1:线程组
线程组是一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。线程组控制 JMeter 执行你的测试计划中的线程数量。它允许你:
设置线程数
设置ramp-up period
设置测试要执行的次数
每个线程都会独立的运行测试计划,互不干扰。多个线程用于模仿对服务器的并发访问。
ramp-up period 指 JMeter 用于执行全部请求的时间
如果设置了 100 个线程,并且 ramp-up period 是 2 秒,那么 JMeter 将在 2 秒钟之内启动 100 个线程.如果循环次数是 2,那么 jmeter 将在 2 秒之内发送 200 个请求(100*2) 如果循环次数设置为永远,那么 jmeter 将以最大可能去发送请求,以此测试出最大并发数
3.1.2:阶梯加压线程组(Stepping Thread Group)
1:this group will start:表示总共要生成的线程数,如图:设置为:200 个,表示总共会加载到 200 个线程
2:first,wait for:第一个线程从点击执行之后多长时间开始加载,如图:设置为 0 秒,表示点击执行之后立即执行
3:then start:初次加载多少个线程,如图:设置为 0 个,表示初次不加载线程
4:next add:之后每次加载多少个线程,如图:设置为 20 个,表示每个梯次加载 20 个线程
5:threads every:当前运行多长时间后再次加载线程,及每一次加载完成之后的持续时间,如图:设置为 5 秒,每梯次加载完线程之后运行 5 秒
6:using ramp-up:加载线程的时间,如图:设置为 0 秒,表示每一次加载立刻完成
7:then hold load for:线程全部加载完之后运行多长时间,如图:设置为 50 秒,表示最后 200 个线程加载完之后再持续 50 秒
8:finally,stop/threads every:每多长时间释放多少个线程,如图:设置为 20 个和 5 秒,表示所有
持续负载结束之后每 5 秒钟释放 20 个线程
注意:阶梯加压线程组需要和 Active Threads Over Time(不同时间活动数量展示)结合起来,这样能看到动态的阶梯加压效果
3.1.3:Arrivals Thread Group(到达线程组)
官方解释,到达的意思就是一个线程迭代的开始。也可以理解为一个虚拟用户开始迭代。它是描述负载的另一种方式。试用场景:“当用户每分钟需要购买 100 张票的时候,系统能否保持良好的性能?”
脚本框架实例讲解:
1:利用我们的平台设计一个登录接请求
2:在请求下面添加常量计时器
3:添加一些监听器,比如聚合报告,吞吐量,活动线程数,响应时间,点击率等等
利用 Arrivals 线程组进行负载:
当所有 user 都开始迭代时,JMeter 将依据压力自动创建新线程,因此可能会产生大量线程并导致”内存不足”,可以使用Concurrency Limit 字段来限制最大线程数。
目标到达率:(到达/分钟):120 加速时间(分钟):1
步进(加速几次):2
保持目标到达率(分钟):2
目标到达率定义了目标负载在一分钟内开始的迭代次数。我们设置为每分钟 120(每秒2)。
加速时间:定义了达到目标负载水平的时间。步进:定义实现目标负载级别的步骤数
保持目标到达率时间:定义目标负载水平持续时间。这里我们有两个选择:分钟或秒。Thread Iterations Limit 定义为每个虚拟用户运行的迭代次数。字段为空说明每个用户将运行无限次迭代,直到测试计划结束。
调整定时器
我们将定时器修正为 0ms,它意味着每次迭代都可以快速通过,大概时间是 50ms
观察运行结果发现,jmeter 从始至终只启动了一个线程,并且在三分钟左右的时间内迭代了 331 次
它说明了这种场景下,一个线程就足够在约定时间内完成迭代次数,不需要启动多余的线程。
我们接下来尝试另一种场景
现在我们把定时器调整为一分钟,也就是 60000ms,然后再次运行脚本
观察结果发现,jmeter 在一分钟的时间点瞬时启动了 90 个线程,陆续启动了 121 个线
程去满足预期负载,最终迭代次数依然为 331 次
3.2:测试片段(Test Fragment)
jmeter 测试片段使用的时候需要和 include Controller(包含控制器)或者Module Controller(模块控制器)配合,主要的作用是模块化测试流程,将复用性高的脚本封装成模块,简化测试流程。
3.3:逻辑控制器
逻辑控制器允许我们定制JMeter 发送的请求。它控制器可能包话如下的子元件:取样器(请求),配置元件,其它的逻辑控制器。逻辑控制器能够更改它元件中的请求顺序。他们可以自己修改请求,使 JMeter 重复请求,等等。
3.3.1:ForEach 控制器
ForEach 控制器一般和用户自定义变量一起使用,用于可以遍历读取相关的返回值。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。
·Input Variable Prefix:输入变量前缀
·Output variable name:输出变量名称
·Start index for loop(exclusive):循环开始的索引(默认从 1 开始,如果没有 1 开始的变量,执行时会报错)
·End index for loop(inclusive):循环结束的索引
·Add””before number:输入变量名称中是否使用“”进行间隔。
注:foreach 控制器通常和表达式提取器一起使用。表达式提取值应为-1,表示取全部值,然后 sampler 在 foreach 控制器下执行遍历。
3.3.2:循环控制器
指定其子节点运行的次数,可以使用具体的数值,也可以设置为变量
1:勾选永远:表示一直循环下去
2:如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘。(线程数*循环控制器数值)
3.3.3:While Controller
While 控制器,与开发语言中的While 功能一致。直到条件为false 时,停止运行循环执行一个请求,仅判断一种状态下退出循环
Condition 条件如下:
1:为空(不输入任何值) -- 直到某次请求执行失败才退出循环
2:LAST -- 直到最后一个请求请求失败才退出循环
3:其它-- 条件值等于"false"时,退出循环
4:Contion 可以输入计算结果等于“false”的变量、函数。
例:\({num} ==10 判断变量num 的值是否为 10,不为 10 则退出循环
\){ javaScript(${count}<A&& \({code}=="B")}
表示同时满足\){count}<A 和${code}=="B" 两个条件才进入循环体
\({ javaScript("\){stopWhile}"!="OK")} 表示当我的控制器没有接收到stop=while 回执时, 控制器内的程序将持续进行。直到 stopwhile=ok 时,跳出循环体
3.3.4:If Controller(判断接口分支)
根据给定表达式的值决定是否执行该节点下的子节点,默认使用 javascript 的语法进行判断
Interpret Condition as Variable Expression?:判断变量值是否等于字符串true(不区分大小写)
Evaluate for all children:在每个子结点执行前都会计算表达式
3.3.5:交替控制器(交替执行控制器下的业务)
ignore sub-controller blocks:勾选后,子控制器每次只能发起一个请求Interleave accross threads:勾选之后,控制器下的子元素会依次执行
如果交替控制器挂在循环控制器之下,那么循环次数与线程数的作用相同
6:Switch Controller
Switch 控制器通过给该控制器中的 Value 赋值,来指定运行哪个采样器。有两种赋值方式:
·第一种是数值,Switch 控制器下的子节点从 0 开始计数,通过指定子节点所在的数值
来确定执行哪个元素。
·第二种是直接指定子元素的名称,比如采样器的 Name 来进行匹配。当指定的名称不存在时,不执行任何元素。
当Value 为空时,默认执行第 1 个子节点元素。例:Switch Controller 选择的值为客服登录
3.3.6:模块控制器(允许跨线程组调用)
模块控制器,用于跳转到选定的控制器位置并执行对应的控制器下的sampler。常用来做接口自动化的业务解耦。
注:sampler 一定要在某个控制器下,否则不能执行
应用场景: 业务逻辑的跳转
Module to Run: 选择需要跳转到的目标控制器
3.3.7:Runtime Controller
运行时间控制器,设置控制器中的请求运行时间,单位:秒
Runtime(seconds): 配制需要设置的运行时间,单位秒在约定时间内,脚本会持续运行
3.3.8:事务控制器
勾选了generate 之后,事务控制器下的所有 sampler 在结果树中都会被归入一个模块。并且在聚合报告中,这些sampler 的响应数据会被汇总
3.4:核心配置元件
3.4.1:CSV Data Set Config
在使用JMeter 的时候,往往需要参数化一些数据,常用到的就是CSV Data Set Config Filename:文件名,指保存信息的文件目录,可以相对或者绝对路径(比如:D:\ceshi.Txt) File encoding:csv 文件编码,可以不填
Variable Names:变量名,多个变量用“,”分开。
Delimiter:csv 文件中的分隔符(用”\t”代替tab 键)(一般情况下,分隔符为英文逗号)
Allow quoted data:是否允许引用数据
Recycle on EOF :到了文件尾处,是否循环读取参数,选项:true 和false。因为
CSV Data Set Config 一次读入一行,分割后存入若干变量交给一个线程,如果线程数超过文本的记录行数,那么可以选择从头再次读入
Stop thread on EOF:到了文件尾处,是否停止线程,选项:true 和false
2:HTTP Cookie 管理器
用来存储浏览器产生的用户信息
Clear Cookies each Iteration:每次迭代清空 cookies,GUI 中定义的任何 cookie 都不会被清除。
Implementation: 默 认 HC4CookieHandler Cookie Policy:将用于管理 Cookie 的 cookie 策略
3:HTTP 信息头管理器
3.4.2:HTTP 请求默认值
默认http 请求的值,如server、ip、port、Protocol 甚至path、parameters,都可以设置
Advanced:
Proxyserver:设置代理服务器,设置成功之后可以用 fidder 或者其它的抓包工具反向抓取jmeter 的请求:
Response timeout:设置响应超时时间,与响应时间断言配合使用。如果请求的响应时间超出该值,请求会中断并在断言结果里面打印异常
3.4.3:JDBC Connection Configuration
做JDBC 请求,首先需要两个 jar 包:mysql 驱动-mysql-connector-java-5.1.13-bin.jar 和sqlServer 驱动-sqljdbc4.jar,将这两个jar 包放到Jmeter 目录中的lib 文件下,然后重启Jmeter
Variable Nam
数据库连接池的名称,因为一个测试计划可以有多个 JDBC Connection Configuration,每个可以取不同的名称。在jdbc request 中通过这个名称选择合适的连接池进行使用。Connection Pool Connetion:连接池参数配置,基本保持默认,根据需要进行修改; Max Number of Connections: 最大连接数;如果做性能时,建议填 0,如果默认为 10, 最大只能连接 10 个线程;
Max Wait(ms):最大等待时间,单位毫秒;
Time Between Eviction Runs(ms):有空闲的线程数,释放不使用的线程; Auto Commit:自动提交,默认为true,如修改数据库时,自动 commit; Transaction isolation:事务隔离(默认);
Connection Validation by pool:验证连接池; Test While idle:
Soft Min Evictable Idle Time(ms):
Validation Query:
Database Connection Configuration:数据库连接配置:
Database URL:数据库连接url;jdbc:mysql://localhost:3306/dbname JDBC Driver class:数据库驱动;com.mysql.jdbc.Driver
Username:用户Password:密码
附上一些常用的,没用到的数据库连接配置
MySQL
Driver class com.mysql.jdbc.Driver org.gjt.mm.mysql.Driver Database URL jdbc:mysql://host[:port]/dbname PostgreSQL
Driver class org.postgresql.Driver Database URL jdbc:postgresql:{dbname} Oracle
Driver class oracle.jdbc.OracleDriver Database URL
jdbc:oracle:thin:@//host:port/service OR jdbc:oracle:thin:@(description=(address=(host={mc-name})(protocol=tcp)(port={port-no}))(c onnect_data=(sid={sid})))
Microsoft SQL Server (MS JDBC driver)
Driver class com.microsoft.sqlserver.jdbc.SQLServerDriver Database URL jdbc:sqlserver://host:port;DatabaseName=dbname
3.4.4:Random Variable
配置生成随机数,自定义输出格式,最大最小值,以及是否为每个线程单独生成
Variable Name: 随机数变量名Output Format: 生成的随机数前缀Minimum Value: 最小值
Maximum Value: 最大值
Per Thread (User): True 每个线程生成一个随机数
3.4.5:用户定义的变量
当前的线程组内所有取样器(即博主的HTTP 请求)都可以引用变量
3.4.6:计数器
启动:初始值
递增:每次执行增加的值最大值:计数上限
Number format:计数格式,如果为 0,结果就是 1,2…;如果填 00,结果就是 01,02…
引用名称:引用计算器使用的名称 ${引用名称}
与每用户独立的跟踪计数器:当使用多线程运行的时候,选择该项,会给每个线程配置一个独立的计数器
计算器以循环次数为依据,每次循环递增
3.5:各种类型的请求
取样器指示JMeter 向服务器发送请求
3.5.1:Debug Sampler
Debug Sampler 会把我们自定义的变量输出在response data 中,方便我们调试的时候使用
3.5.2:HTTP 请求
名称:用于标识一个请求
注释:对于测试没任何影响,仅用来记录用户的注释信息
服务器名称或IP:http 请求发送的目标服务器名称或者 IP 地址,比如
http://www.baidu.com
端口号:目标服务器的端口号,默认值为 80
协议:向目标服务器发送http 请求时的协议,http/https,大小写不敏感,默认 http
方法:发送http 请求的方法
路径:目标的URL 路径(不包括服务器地址和端口)
Content encoding :内容的编码方式,默认值为 iso8859
自动重定向:如果选中该项,发出的http 请求得到响应是 301/302,jmeter 会重定向到新的界面
Use keep Alive:jmeter 和目标服务器之间使用 Keep-Alive 方式进行HTTP 通信(默认选中)
Use multipart/form-data for POST:勾选之后解决请求参数中文乱码
3.5.3:JDBC Request
这个Sampler 可以通过sql 语句向数据库发送一个jdbc 请求,并对获取返回的数据进行操作。它经常需要和JDBC Connection Configuration(配置数据库连接的相关属性)一起使用
Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration 的Variable Name Bound Pool 名字保持一致
Query:填写的sql 语句
Parameter valus:参数值
Variable names:保存sql 语句返回结果的变量名
Result variable name:创建一个对象变量,保存所有返回的结果Query timeout:查询超时时间
Handle result set:定义如何处理由callable statements 语句返回的结果
3.5.4:Dummy Sampler(模拟请求)
它用于模拟一个接口请求,效果类似于Mock。
我们可以设置响应码、响应信息、延迟时间(latency)、响应时间、模仿响应时间、请求数据、响应数据;
它的意义在于:当服务器还没有开发完成时,帮助我们调试脚本;
我们可以通过后置处理器获取Dummy Sampler 里面的信息,供后面的业务使用;
3.5.5:Java 请求
Jmeter 中的 java 请求,同 Dummy Sampler 一样, 可以用来模拟一个接口的请求和返回。
Sleep_Time:预置接口响应时间ResponseCode:预置响应码ResponseMessage:预置响应信息
Status:设置接口返回状态(通过或者不通过) SamplerData:预置请求信息
ResultData:预置响应信息实例如下:
3.5.6:FTP 请求
ftp 请求分为两种,一种是从 ftp 下载文件,一种是从 ftp 上传文件。只需要配置 ftp sampler 即可。
确保ftp 的用户名和密码能正确连接,即可上传或者下载文件。
3.5.7:SSH Command(远程 ssh 连接)
在jmeter 中,可以使用SSH 协议连接主机进行相关操作,步骤如下首先添加一个ssh command
在 command 中填写远程连接的必要信息
结果树中可以看到 linux 命令执行的结果
然而在实际测试中,不能确定我们的的机器能够正常连接。这里就要用到 while 循环设置重连,如下添加 while 控制器,写入循环语句。
当提取到结果信息时,跳出循环体,同时保证只重连三次
如图,三次失败之后,跳出循环体
3.6:表达式与提取器
3.6.1:JSON 提取
Variable names : 名称
JSONPath Expression:JSON 表达式
Match Numbers:0 代表随机,1 代表第 1 个,-1 代表全部
Default Value:未取到值的时候默认值下面举例来讲解 jsonpath 的写法
$..Name:列出所有省份
\(..Province[0].Name 提取 Province 中第一个 list 中的 Name
![](/i/l/?n=24&i=blog/2796365/202406/2796365-20240614204205046-1486441521.png)
\)..[?(@.Name=='Beijing')] 筛选出省份名为 Beijing 的所有 list 数据
$.Province[:2].population 筛选前两条数据
注意:
\(.Province[:2].population 是筛选出前两条数据 ;
\).Province[2].population 是排除前两条数据;
$.Province[-2].population 是排除后两条数据,千万别弄混了哦这里做一下总结:
1: 冒号在前
:index 正序取值,取数为 index
例:1 表示正序取 1 条数据(正数第一条)
:-index 倒序过滤,取数为 index
例:-1 表示倒序过滤一条数据(倒数第一条)
2:没有冒号
index 表示顺序取 index+1 的值例: 1 取第二条数据
3:冒号在后
index: 顺序过滤,取数为 index
例: 1: 表示正序过滤第一条数据
-index:倒序取值,取数为 index
例:-1: 表示倒序取一条数据
这是一个多层嵌套的 jsonlist,需要提取所有 cabinInfos 列表下,patFlag=Y 时的cabin,standardPrice 和finallyPrice。
\(..[?(@.patFlag=="Y")].["cabin","standardPrice","finallyPrice"]
**注:JSON Extractor 使用 json path 表达式匹配,可以一次取多个变量值。\)表示响应的根对象。取子对象或对象的属性用. 取数组里的对象用[],数组索引从 0 开始**
示例:
下面这个响应是一个list 组,可以提取前两个 list 里面的 Name
1:添加一个JSON Extractor 表达式,分号分隔多个参数名;分号分隔多个 json 表达式;分号分隔多个匹配数字;分号分隔多个默认值(必填)
2:所有的个数一定要匹配,任一个不匹配该请求都不会在提取成功
也可以用表达式匹配所有值,然后用 match no 获取想要的值
提供一个mock 接口的地址,直接访问即可
https://easy-mock.com/mock/5b88b27476b79510db917603/example/query1
3.6.2:XPath 提取
Xpath 基础语法:
//[@class,'A']/@href 从根目录下定位所有 class=A 的href
//[@class,'A '] 从根目录下定位所有 class=A 标签内的文本
//[contains(@class,'A')] 从根目录下@class 值中包含A 的节点
substring-before(//[@class='A']/text(),'0') 返回根目录下[@class='A']/text()中第一个'0'前面的部分,如果不存在'0',则返回空值
substring-after(//[@class='A']/text(),'0') 返回根目录下[@class='A']/text()中第一个'0'后面的部分,如果不存在'0',则返回空值
////a/text() 返回根目录下a 标签中所有文本
//[starts-with(@class,’A’)]模糊匹配以 A 开头
//[ends-with(@class,’A’)] 模糊匹配以A 结尾
3.6.3:正则表达式提取
它通过正则表达式获取接口响应,并传入下个接口引用名称:定义一个变量,供后续请求引用
一般(.+?)和(.?)能够满足我们 80%的使用场景。所以,一般的正则表达式都可以写成下面这 2 种
左边界(.+?)右边界
左边界(.?)右边界
left 对应匹配目标的起始字符
right 对应匹配目标的结束字符
正则表达式:利用正则将需要的数据提取出来
() 括起来的部分就是需要提取的,对于你要提的内容需要用小括号括起来
. 点号表示匹配任何字符串
- 一次或多次
? 在找到第一个匹配项后停止
模板:用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来),则可以是\(N\)等,表示提取第N 个括号里面的值
-1 代表所有值,此时提取结果是一个数组,其余正整数代表第几个匹配的内容提取出来。
如果匹配数字选择的是-1,还可以通过\({XXX_1}的方式来取第 1 个匹配的内容,\){XXX_2}
来取第 2 个匹配的内容。
缺省值:正则匹配失败时取的值例 1:提取第一个Name
例 2:提取全部Name
例 3:表达式同时提取Name 和population,并传出两个参数
例 4:拆分身份证号码,提取生日
一个 18 位的身份证号码,前 1-6 位是地区,7-14 位是生日,15-17 位是顺序码,最后 1
位是校验码,试图通过正则从身份证号中提取地区和生日正则表达式:
{"(.{6})(.{8})(.{3})"}
(.{6}):任意字符匹配 6 次,对应匹配结果中的前 6 位字符(地区)
(.{8}):任意字符匹配 8 次,对应匹配结果中的第 7-14 位字符(生日) 从身份证号码中取出地区和生日,对应的正则表达式为: (.{6})(.{8})(.{3})(.)
匹配第二组→\(2\)
例 5:条件判断取值
提取population=800 的城市
3.7:接口断言
3.7.1:Bean Shell 断言
利用beanshell 脚本,获取实际响应字段与预期值进行比对,自定义断言结果
3.7.2:响应断言
要测试的响应字段:针对响应的不同部分进行匹配
响应文本:响应服务器返回的文本内容,http 协议排除header 部分响应代码:匹配响应代码,比如http 请求中 404,200,503
响应信息:匹配 message,例如”处理成功”
Response Header:匹配响应头中的信息
匹配规则:
包括:响应内容包括需要匹配的内容就算成功
匹配:响应内容要完全匹配匹配内容,不区分大小写
equals:完全相等,区分大小写
否:选择否表示预期断言结果不应存在,如果实际结果与预期值不一致,则结果树标红不选择否,表示预期断言结果应该存在,如果实际结果与预期值不一致,结果树标红可以通过添加断言结果来查看断言的执行情况。
3.7.3:断言持续时间
约定响应时间,响应时间如果超出约定,则断言为失败
3.7.4:JSON Assertion(json 断言)
判断方式:
如果响应结果不是json 格式的,fail 如果json path 找不到元素,fail
如果json path 找到元素,没有设置条件,pass 如果json path 找到元素了,不符合条件,fail 如果json path 找到元素,且符合条件,pass
如果json path 返回的是一个数组,迭代判断是否有元素符合条件,有则pass,无则fail
3.9:插件管理器
不要手动安装各种插件,jmeter 提供了用户界面来完成插件的安装、升级、卸载。
它管理的插件包括 jmeter-plugins.org 上面常用的插件,和各种第三方插件甚至核心 JMeter 插件。
安装插件管理:
1、下载 plugins-manager.jar
2、将 plugins-manager.jar 放到 ...\apache-jmeter-3.2\lib\ext 目录下。
3、双击 ApacheJMeter.jar 启动 Jmeter。
4、菜单栏会多出一个“Plugins Manager”的选项。
点击 “Plugins Manager” 选项打开 Jmeter 插件管理:
插件管理窗口分三个标签页:
Installed Plugins:显示已安装的插件。
Available Plugins: 显示可安装的插件。
Upgrades: 显示可以升级的插件。
通过勾选/取消勾选插件,并点击右下角 "Apply Changes and Restart JMeter" 按钮来卸载、安装、升级插件。
4:基础操作
4.1:代理服务器
4.1.1:录制 http 请求
工作台下创建代理服务器
配置代理,选择录制控制器
在Requests FIltering 下添加排除模式,配置正则表达式。过滤不必要的请求
..(js|css|PNG|jpg|ico)或者
..jpg
..css
添加包含模式(Patterns to Include).js(录制的请求只会包含js 文件,一般包含模式默认不限制)
添加排除模式(Patterns to Exclude):如“..html”(录制的请求不会包含.html 的请求)
过滤 url:
启动代理服务器
左侧查看录制结果
注意:如果启动代理服务器时出现如下提示
Could not create script recorder-see log for details:>>keytool 错 误 : java.lang.RuntimeException:java.io.lOException:DNSName components must begin with a letter<<
Command failed,code:1
需要确认以下几点:
1:确认 java 版本高于 7
2:确认只安装了一个 jdk
3:确认 java_home 的 jdk 路径和 path 的 jdk 路径是否一致
4.1.2:录制 app 接口请求
首先手动设置你的手机代理,配置代理 ip,需要与本机的 ip 一致!端口默认 80
配置jmeter 代理服务器ip,注意ip 与端口必须要与手机代理一致
左侧查看录制结果
4.2:四种请求
4.2.1:Post 请求
Post 请求常用于表单的提交,例如登录请求,新增请求等
4.2.2:Get 请求
GET 用于信息获取,常用于查询,请求的数据会附在 url 之后(就是把数据放置在 HTTP
协议头中),以?分割url 和传输数据,多个参数用&连接
4.2.3:PUT 请求
Put 常用于修改
4.2.4:Delete 请求
Delete 常用于删除
4.3:不同类型的参数
4.3.1:Parameters
常用于get 请求的参数填写,参数可设置为常量和变量,也可用函数填充
4.3.2:Body Data
常用于提交表单的参数填充,参数以 json 串的格式展示,可设置为常量和变量
4.3.3:File Upload
常用于上传文件,图片等。需要填写文件名称,参数名称,mime 类型,implementation 类型
常见的 MIME 类型:
超文本标记语言文本 .html,.html text/html
普 通 文 本 .txt text/plain RTF 文本 .rtf application/rtf GIF 图形 .gif image/gif
JPEG 图形 .jpeg,.jpg image/jpeg au 声音文件 .au audio/basic
MIDI 音乐文件 mid,.midi audio/midi,audio/x-midi RealAudio 音乐文件 .ra, .ram audio/x-pn-realaudio MPEG 文件 .mpg,.mpeg video/mpeg
AVI 文 件 .avi video/x-msvideo GZIP 文件 .gz application/x-gzip TAR 文件 .tar application/x-tar
5:接口自动化关联
5.1:关联的意义
关联是一种动态行为,用以后续的请求从之前的请求响应结果中直接使用指定的数据。如登录生成的token 需要被后续接口调用,或者删除请求的 id 需要从查询列表的返回值中获取。
5.2:传递 token 获取登录口令
下图是一个实际的登录接口,在响应中返回了一串 token,如下图
那么我们在接下来的接口-经验库列表中,就必须带入这一串 token,否则响应报错,如下图所示
如何获取登录的口令呢?这里详细说明一下,如图所示
在接下来的接口中可以将获取的 token 作为变量调用,变量名为${center-token},如下图
观察请求头,发现传入了一串 token,并且响应结果正确
自此,一个完整的登录关联就结束了。后续接口直接调用该 token 就可以了。
5.3:实现增删改查接口闭环
一个增删改查流程,想要做自动化检验就必须形成一个闭环,那么删除-修改-查看就必须调用同一个必填参数,例如唯一性的 id。下面是实例演示,可以看到新增的请求中返
回了一个id,我在后续接口中都必须调用此唯一性的 id
接下来写一个正则将其取出,注意与之前 token 正则的不同之处
后续接口可以调用此参数,并正确响应
一个完整的登录-查看-删除的流程到这里就可以结束了
完整目录
完整