软件测试-接口测试流程-jmeter的使用

接口测试基础

  • 接口是什么
    • 接口是系统向外暴露的交互方式。
    • 接口可以接收来自用户的数据,并且可以返回来自系统内部的数据。
    • 负责数据的校验,加工、存储、权限控制。
    • 是系统内外的分界线。
  • 比如
    • 电脑(系统)上面的各种插口(接口)
    • 电路板(系统)上各种金属焊点(接口)
    • 12306(系统) 上各种订票方式(接口)
  • 为什么要测试接口
    • 接口本身测试通过,才能保障前端、app、各种功能顺利对接。(必要的流程)
    • 如果接口出现了bug,会比前端的bug更加严重,影响的范围更大(系统上线前降低风险的测率)
    • 接口的测试效率(比UI测试的效率要高,便于测试、收益更大)
  • 怎么去测试接口
    • 模拟软件(需要工具)
    • 对接口进行数据收发(需要专业的工具)
    • 对结果进行严格的判断(支持灵活的断言)
  • 接口测试工具
    • jmeter:开源的软件、支持多种接口类型、支持接口测试和性能测试,并且支持二次扩展。
    • postman:收费软件,简单、方便,适合开发临时调试接口。
    • apifox:市场占比较小,不是主流,适合小团队尝鲜。

jmeter安装配置

1. 安装步骤

  1. 安装jdk
    1. 下载jdk:官网下载
    2. 选择jdk下载版本和操作系统
    3. 记录安装路径
    4. 验证安装:Java  –version
    5. 配置jdk环境:
  2. 安装jmeter:
    1. 下载jmeter:官网下载
    2. 解压jmeter,并且记住解压的路径。
    3. 运行解压后目录中的jmeter.bat 或者 jmeter文件。
    4. 20250507155744991-image

    5. 20250507155834162-image

    6. 还可以终端输入 jmeter命令打开(需要配置jmeter环境变量)

2. jmeter目录

20250507160021286-image

  1. bin目录:存放可执行的文件、命令以及对应的配置文件。
  2. docs目录:文档的意思、存放的内部API文档。
  3. extras目录:额外的意思,需要和其他工具进行对接。
  4. lib目录:库的意思,存放的Java的依赖文件。
    1. 20250507160323351-image

    2. ext文件:jmeter依赖、插件。
    3. junit文件:开源许可证的内容。
  5. printable_docs文件:可打印文档,使用的说明(英文)。

核心文件、目录

  • bin/jmeter文件:启动文件
  • bin/jmeter.properties:jmeter 的配置文件
  • lib:jmeter的第三方库

3. jmeter系统结构

1.基本用法

  • 语言设置-临时设置

jmeter菜单栏选择“选项”点击“选择语言”然后选择需要的语言。

  • 语言设置-永久设置

进入apache-jmeter-5.2.1\bin目录,找到“jmeter.properties”文件,在文件的第37行后添加“language=zh_CN”,保存之后再打开jmeter就永久变为中文环境了。

20250508130923371-image

20250507174206519-image

页面放大或者缩小

20250507174304881-image

20250507174348708-image

2.元件类型

核心元件(必须要有)

  1. 测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器

    20250507174733712-image

  2. 线程组:代表一定数量的用户,它可以用来模拟用户并发发送请求。实际的请求内容在取样器中定义,它被线程组包含。

    20250508170915714-image

  3. 取样器:是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如:HTTP Request 取样器、FTP Request Sample、TCP Request Sample、JDBC Request Sampler等,每一种不同类型的sampler 可以根据设置的参数向服务器发出不同类型的请求。

    20250507175041655-image

辅助元件(按需添加)

  1. 逻辑控制器:对取样器进行逻辑控制、判断、循环
    20250507175253975-image
  2. 定时器:让取样器延迟一段时间后执行

    20250507175402541-image

  3. 监听器:记录和展示取样器执行结果

    20250507175741131-image

  4. 断言:判断取样器的执行结果
    20250507175441920-image
  5. 配置元件:配置、修改取样器中的内容
    20250507175523841-image
  6. 前置处理器:取样器执行之前,自动执行
    20250507175627487-image
  7. 后置处理器:取样器执行之后,自动执行
案例练习
  1. 请求百度

    20250507180005824-image

  2. 请求三次百度

    20250507180501193-image

    注意:逻辑控制器应在执行内容的外边。

  3. 每次请求之前打印你好

    20250507180742531-image

3.元件作用域和执行顺序

1. 元件作用域

配置元件:影响其他作用范围所有元件。

前置处理器:在其他作用范围内每一个取样器元件之前执行。

定时器:在其作用范围内每一个取样器有效。

后置处理器:在其作用范围内每一个取样器元件之后执行。

断言:在其作用范围内的对每一个取样器元件执行后结果进行校验。

监听器:在其作用范围内每一个取样器元件的信息收集并呈现

总结:从各个元件的层次结构判断每个元件的作用域。


元件执行顺序

配置元件——>前置处理器——>定时器——>取样器——>后置处理器——>断言——>监听器

注意事项:
  1. 前置处理器、后置处理器和断言等组件只能对取样器起作用,因此,如果它们的作用域内没有任何取样器,则不会被执行。
  2. 如果在同一作用域内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行。

  1. 先加载配置元件
  2. 接着加载线程组:线程组是干活的人
  3. 加载取样器:最终的目的是干活
  4. 为取样器加载各种辅助元件,
    如果没有取样器,其他的元件就失去了意义
    1. 加载父级元件
    2. 加载同级元件
    3. 加载子级元件
    4. 不加载旁系元件

练习:

20250507183007626-image

问题:

日志的打印内容是什么?

  • 一共有2个取样器,需要分析2次。
  • http请求A
    • 父级元件
    • 同级元件
    • 子级元件
  • http请求B
    • 父级元件
    • 父级元件

打印结果

20250507183409435-image

  • 父级元件
  • 同级元件
  • 子级元件
  • 父级元件
  • 同级元件

jemter接口测试实战

使用jmeter进行接口测试的基本步骤如下:

  1. 测试计划
  2. 线程组
  3. HTTP cookie管理器
  4. http请求默认值
  5. 取样器(http请求)
  6. 断言
  7. 监听器(查看接过书、图形结果、聚合报告等)

jmeter进行接口测试流程步骤详解

1.测试计划

打开jmeter,在菜单左侧出现“测试计划”。

在这里我们可以将“测试计划”理解为新建的空白项目,在这个空白项目下面可以添加一系列的接口。

20250508130612325-image

2.线程组
  • 添加方法:右键点击添加 》线程(用户) 》 线程组
  • 元件描述:一个线程组可以看作一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户。

20250508131026618-image

  1. 线程数:即虚拟用户数,设置多少个线程数也就是设置多少虚拟用户数。
  2. Ramp-Up时间(秒):设置虚拟用户数全部启动的时长。如果线程数为20,准备时长为10秒,那么需要10秒钟启动20个线程。也就是平均每秒启动2个线程。
  3. 循环次数:每个线程发送请求的个数。如果线程数为“20“,循环次数为”10“,那么每个线程数发送”10“次请求。总请求数为”20*10=200“。如果勾选了”永远“,那么所有的线程会一直发送请求,直到手动点击工具栏上的停止按钮,或者设置的线程时间结束。
3.HTTP cookie管理器
  • 添加方法:右键线程组-添加-配置元件-HTTP cookie管理器。
  • 元件描述:HTTP cookie管理器可以像浏览器一样存储和发送cookie,如果你要发送一个带cookie的HTTP请求,cookie manager会自动存储该请求的cookie,并且后边如果发送同源站点的http请求时,都会使用这个cookie。

20250508131618542-image

4.HTTP请求默认值
  • 添加方法:右键线程组-添加-配置元件-HTTP请求默认值。
  • 元件描述:HTTP请求默认值是为了方便填写后续内容而设置,主要填写【服务器名称或ip】和【端口号】,后续的HTTP请求中就不用每次都填写IP地址和端口号了。

20250508131819737-image

5.HTTP请求
  • 添加方法:右键线程组-添加-取样器-HTTP请求。
  • 元件描述:http请求包括接口请=请求方法、请求路径和请求参数等。

20250508151136124-image

HTTP请求详解:

  1. 名称:本属性用于标识一个取样器,建议使用一个有意义的名称。
  2. 注释:对于测试没有任何作用,仅用于记录用户可读取的注释信息。
  3. 服务器名称或IP:HTTP请求发送的目标服务器名称或者IP地址。
  4. 端口号:目标服务器的端口号,默认值为 80。
  5. 协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或者是HTTPS,默认值HTTP。
  6. 方法:发送HTTP请求的方法,可用方法包括GET、post、head、put、tarce、options、delete等。
  7. 路径:目标URL路径(不包括服务器地址和端口)。
  8. 内容编码:内容编码的方式,默认值为iso8859.。
  9. 自动重定向:如果选中该选项,当发送http请求后得到的响应是302\301时,jmeter自动重定向到新的页面。
  10. 使用keep alive:保持jmeter 和目标服务器之间的活跃状态,默认选中。
  11. 对Post使用multipart/from-data:当发送POST 请求时,使用multipart/from-data方法发送,默认不选中。
  12. 同请求一起发送参数 : 在请求中发送URL参数,对于带参数的URL ,jmeter提供了一个简单的对参数化的方法。用户可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对(对应RUL中的 名称1=值1)。

如何查看http消息请求和响应内容?

  • 如何查看请求参数:请求 -request body (请求行 + 请求体)。
  • 如何查看响应结果:响应数据 -response body (响应体)。
6.响应断言
  • 添加方法:右键HTTP请求-添加-取样器-http请求。
  • 元件描述:检查接口是否访问成功,如果检查失败的话会提示找不到断言的内容,没提示的话代表成功。

20250508133617548-image

Apply to:指断言作用范围,通常发出一个请求只触发一个请求,所以勾选“main sample only”就可以;若发一个请求可以触发多个服务器请求,就有main sample 和sub-sample之分了。

  1. Main sample and sub-samples:作用于主请求和子请求
  2. Main sample only:仅仅只作用于主请求
  3. Sub-samples only:仅仅只作用于子请求
  4. Jmeter Variable:作用于jmeter变量(输入框内输入jmeter变量名称)

测试字段:

响应文本(匹配返回的json数据)、响应代码(匹配返回码:如200, 404,500等)、响应信息(匹配响应信息如“OK”字样)、响应头(匹配响应头)、请求头(匹配请求头)、URL样本(匹配请求的url链接,如果有重定向则包含请求url 和 重定向url)、[文档(文本)](匹配响应数据的文本形式)、忽略状态(一个请求有多个响应断言,第一个响应断言选中此项,当第一个响应断言失败时可以忽略此响应结果,继续进行下一个断言。如果下一个断言成功则还是判定事务是成功的)、请求数据(匹配请求数据)

模式匹配规则:

包括:响应内容包含需要匹配的内容即代表响应成功,支持正则表达式。

匹配:响应内容要完全匹配需要匹配的内容即代表响应成功,大小写不敏感,支持正则表达式。

字符串:响应内容包含需要匹配的内容才代表响应成功,大小写敏感,不支持正则表达式

相等:响应内容要完全等于需要匹配的内容才代表响应成功,大小写敏感,不支持正则表达式

否:相当于取反,如果结果为true,勾上否就是false

或者:如果不想用AND连接(所有的模式都必须匹配,断言才算成功),用OR选项可以用于将多个断言模式进行OR连接(只要一个模式匹配,断言就是成功的)

测试模式:

其实就是断言的数据。点击“添加”按钮,输入要断言的数据。

7.监听器
  • 添加方法:线程组 ->右键添加 ->监听器 ->察看结果树。一般还会一并添加图形结果、聚合报告。
  • 元件描述:树状形式显示接口的访问结果,包括请求结果、请求内容、服务器的响应内容。

20250508133935748-image

如何解决jmeter查看结果树的响应中的中文乱码?

修改配置文件:

  1. 找到jmeter安装目录下的bin目录。
  2. 打开jmeter.properties文件,修改配置sampleresult.default.eencoding=UTF-8.
  3. 重启jmeter即可。

DDT数据驱动测试

  • 数据决定了用例的梳理和用例的内容。

DDT数据驱动是一种计数、和工具无关。

jmeter参数化

定义:使用不同的测试数据,调用相同的测试方法进行测试。

本质:实现测试数据与测试方法的分离。

实现方式:

  • 用户定义的变量–全局变量
  • 用户参数—为每一个用户分配不同的参数值
  • CSV数据文件设置—文件方式参数化
  • 函数—随机数据
  • 数据库

1.用户定义的变量

20250508173435223-image

什么时候使用用户定义的变量?

  • 定义全局变量

使用“用户定义的变量”进行参数化的步骤?

  1. 添加线程组
  2. 添加用户定义的变量。格式:变量名 – 变量值。
  3. 添加HTTP请求,引用定义的变量名。格式 ${变量名}。
  4. 添加查询结果树。

20250508173632829-image

2.用户参数

20250508173717676-image

什么时候使用用户参数?

  • 针对同一组参数,当不同用户来访问时,可以获取到不同的值。

使用“用户参数”进行参数化的步骤?

  1. 添加线程组,设置线程数为n(表示模拟的用户数)
  2. 添加用户参数
    1. 第一列添加多个变量名
    2. 后续每一列为一组用户的数据
  3. 添加http请求,引用定义的变量名。格式${变量名}.
  4. 添加查看结果树。

20250508173844103-image

CSV数据文件设置

20250508174039613-image

什么时候使用CSV数据文件设置?

  • 当不同的用户,或者同一个用户多次循环时,都可以获取到不同的值。

使用“CSV数据文件设置”进行参数化的步骤?

  • 定义CSV数据文件

    20250508172248912-image

  • 添加线程组
  • 添加CSV数据文件设置
  • 添加HTTP请求,引用定义的变量名。格式:${变量名}.
  • 添加查看结果树

20250508174200341-image

函数

20250508174335549-image

什么时候使用__counter函数?

  • 自动生成不重复的数据,让每一个用户每次循环都能取到不同的数据,且不需要提前定义。

使用“counter函数”进行参数化的步骤?

  1. 添加线程组,设置虚拟用户数和循环次数。
  2. 生成__counter函数
  3. 添加HTTP请求,使用__counter函数。格式:${__counter(FALSE,)}
  4. 添加查看结果树

四种参数化方式的对比

什么是参数化?

  • 将测试数据组织起来,用不同的测试数据调用相同的测试方法。

4中参数化方式有何不同?如何选择适当的方式?

  • 用户定义的变量:
    • 作用:定义全局变量
    • 局限性:每次取值(无论是否相同的用户)都是固定值。
  • 用户参数:
    • 作用:保证不同的用户针对同一组参数,可以取到不不同的值。
    • 局限性:听一个用户在多次循环时,渠道相同的值。
  • CSV数据文件设置:
    • 作用:保证不同的用户及同一用户多次循环时,都可以渠道不同的值。
    • 局限性:需要手动进行测试数据的设置。
  • 函数:
    • 作用:保证不同的用户及多次循环时,都可以取到不同的值,不需要提前设置。
    • 局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户名密码)

jmeter断言

断言:让程序自动判断预期结果和实际结果是否一致。

提示:

  • jmeter在请求的返回层面有个自动判断机制(响应状态码)。
  • 但是请求成功了,并不代表结果一定正确,因此与需要检测机制提高测试准确性。

jmeter中常用断言:

  • 响应断言
    • 可以针对任意格式的响应数据进行断言。
    • 把响应看成字符串,然后检查有没有指定的字符串出现。
  • json断言
    • 当响应数据为json格式时,优先使用json断言。
    • 从json中提取数据,对这个数据进行匹配。
  • 持续时间断言
    • 检查http请求的响应时间是否满足要求时,优先使用持续时间。
  • 自定义断言
    • 根据业务的需求,自定义测试通过或者失败的标准。
    • 如果同时出现失败和成功,断言通过
    • 如果只出现失败,断言失败。

响应断言:

参数:

20250508151925498-image

20250508151950502-image

案例1:检查百度首页的接口响应中包含“百度一下,你就知道”

  1. 添加线程组
  2. 添加HTTP请求
  3. 添加响应断言
    1. 测试字段:要检查的项(实际结果)
    2. 模式匹配规则:比较方式。
    3. 测试模式:预期结果
  4. 添加查看结果树

20250508152313854-image

json断言

20250508152342290-image

让程序检查响应的json数据中,city对应的内容是否为北京

什么时候可以使用json断言?

对HTTP请求的响应结果为json格式时,优先使用json断言。

使用json断言的操作步骤?

  1. 添加线程组
  2. 添加HTTP请i去
  3. 添加json断言
    1. 填写 asset json path exists(实际结果-json路径)。
    2. 勾选additionally assert value
    3. 填写expected value(期望结果)
  4. 查看结果树

20250508153008194-image

断言持续时间

作用:检查http请求的响应时间是否产出要求范围。

位置:测试计划–线程组—HTTP请求—(右键添加)断言—断言持续时间。

20250508153358799-image

参数介绍

  • 持续时间(毫秒):HTTP请求允许的最大响应时间(单位:毫秒)。超多规则认为失败。

案例:让程序检查响应时间是否大于100毫秒

20250508154453478-image

使用断言持续时间的操作步骤

  1. 添加线程组
  2. 添加http请求
  3. 添加断言持续时间
    1. 填写持续时间(允许的最大响应时间,单位:MS)
  4. 添加查看结果树

20250508153711705-image

自定义断言

作用:根据业务的需求,自定义测试通过或者失败的标准。

添加方式:测试计划–线程组—(右键添加)断言—JSR223…

20250508181853253-image

代码:

sampler_code = prev.getResponsecode()       // 实际取样代码
sampler_data = prev.getResponseDataAsString()  // 实际取样内容

// 正则统计关键字出现次数
coun_fai1 = (sampler_data =~ /fai1/).size()
coun_success = (sampler_data =~ /success/).size()
log.info("fai1: ${coun_fai1} success:${coun_success}")

// 判断关键字出现的四处
if (coun_success == 0 && coun_fai1 > 0) {
    log.info('断言失败')
    AssertionResult.setFailure(true)
    prev.setSuccessful(false)  // 修改取样器结果
    AssertionResult.setFailureMessage("有fai1出现")
} else {
    log.info('断言成功')
    AssertionResult.setFailure(false)
    prev.setSuccessful(true)  // 修改取样器结果
    log.info("自定义断言完成")
}
  1. 获取 状态码 和 响应数据,保存为字符串
  2. 使用字符串的方法没检查字符串的内容。
  3. 根据需求和检查结果,设置断言的结果。

接口调试

  1. 接口报文:查看结果树
  2. 内部变量:debug取样器
  3. 代码的执行情况:查看日志记录

jmeter关联

关联:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。

jmeter中常用的关联方法

  • 正则表达式提取器
  • xpath提取器
  • json提取器

正则表达式介绍

正则表达式:就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容。

公式格式:左边界(匹配符号)右边界:可以提取出想要获取的数据内容
. :是通配符,可以代表任意字符(除换行回车)
* :代表前面的字符出现0次或者多次
.*匹配规则:找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来
?: 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;再次查找左边界和右边界

公式格式:左边界(.*?)右边界
<title>百度一下,你就知道</title><title>百度一下,你就知道</title>

<title>(.*?)</title>

案例:原始文本

021-1234-1234
022-1234-1235
023-1234-1236
024-1234-1237
025-1234-1238
026-1234-1239

027-1234-1230

要求:匹配出,城市号,地区号,个人号码三组。

正则表达式匹配:(.*?)-(.*?)-(.*?) \n

结论:

  • 通过一个正则表达式可以提取出多组数据,每组数据设置对应的左边界和有边界即可。
  • 每一组数据都可以有一个或者多个值。

正则表达式提取器

20250508161343341-image

什么时候可以使用正则表达式提取器?

  • 任意格式的响应数据,都可以使用正则表达式进行提取。

使用“正则表达式提取器”的操作步骤。

  1. 添加线程组
  2. 添加HTTP请求-博客
  3. 添加正则表达式提取器
    1. 引用名称:存放提取出的值的“参数名称”,如填写 title。
    2. 正则表达式:左边界(.*?)有边界。
    3. 模板:用$$引用起来,表示解析出第几个的值,比如$1$解析出第一个的值。
    4. 匹配数字:1表示第一个值,-1表示所有取值。
  4. 添加http请求百度-百度
    1. 引用正则表达式中的引用名称,使用${参数}引用他。
  5. 添加查看结果树

20250508162059252-image

xpath提取器

//a[@id=’kw’]:在HTML页面中,找出a标签(有一个属性为id,且id的值为kw)。

//a:找出所有的a标签。

作用:针对HTML格式的响应结果数据进行提取。

添加方式:测试计划—线程组—HTTP请求—(右键添加)后置处理器—XPATH提取器。

20250508163136611-image

参数介绍:

  • Use Tidy (tolerant parser):当需要处理的页面是HTML格式时,必须选中该选项。
    • 当需要处理的页面是XML格式时,取消选中该选项。
  • 引用名称:存放提取出的值的参数名称。
  • Xpath query:用于提取值的xpath表达式。
  • 匹配数字:如果xpath路径查询出许多结果,则可以选择提取哪个。
    • 0:表示随机,
    • -1:表示提取所有结果,
    • 1:表示第一个值。
  • 缺省值:参数的默认值。

案例:获取博客首页的title,并作为参数传递。

  1. 添加线程组
  2. 添加HTTP请求-博客
  3. 添加xpath提取器
    1. 勾选Use Tidy (tolerant parser)
    2. 引用名称:存放提取值的参数名称。如填写title。
    3. xpath query:用于提取xpath表达式。
    4. 匹配数字:0(表示随机)-1(表示提取所有结果)1(表示第一个值)
  4. 添加HTTP请求-百度
    1. 引用正则表达式中的引用名称。
  5. 添加查看结果树

20250508164545666-image

什么时候可以使用xpath提取器?

  • 针对HTML格式的响应数据,可以使用xpath提取器进行提取。

使用xpath提取器的操作步骤

  1. 添加线程组
  2. 添加HTTP请求
  3. 添加xpath提取器
    1. 勾选Use Tidy (tolerant parser)
    2. 引用名称:存放提取值的参数名称。如填写title。
    3. xpath query:用于提取xpath表达式。
    4. 匹配数字:0(表示随机)-1(表示提取所有结果)1(表示第一个值)
  4. 添加HTTP请求
    1. 引用正则表达式中的引用名称。
  5. 添加查看结果树

json提取器

作用:针对json格式的响应结果数据进行提取。

添加方式:测试计划—线程组—HTTP请求—(右键添加)后置处理器—json提取器。

20250508164850296-image

参数介绍

  • name of created variables:存放提取出的值的参数名称。
  • json path expressions:json路径表达式。
  • match no:如果json路径匹配出许多结果,则可以选择提取哪个。
    • 0:表示随机,
    • -1:表示提取所有结果。
    • 1:表示提取第一个值。
  • default values:参数的默认值。

案例:提取天气接口中的城市信息,作为参数访问百度首页时传递

  1. 添加线程组
  2. 添加HTTP请求-天气
  3. 添加json提取器
    1. name of created variables:存放提取出的值作为参数名称。
    2. json path expressions:用于提取值的json路径表达式。
    3. match no:
      1. 0:表示随机。
      2. -1:表示提取虽有结果。
      3. 1:表示提取第一个结果。
  4. 添加HTTP请求-百度
    1. 引用正则表达式中的引用名称。
  5. 添加查看结果树。

20250508165832527-image

20250508165851443-image

jmeter属性

为什么要使用jmeter属性?

  • 当有关联关系的两个请求在同一个线程组中时,可以使用三种提取器的变量来使用数据传递。

当有关联关系的两个请求在不同线程组中时,如何进行数据传递呢?

20250508174521133-image

20250508174552389-image

jmeter接口加密解密

在普通接口的基础上,对参数(数据)进行动态修改,从而隐藏原始内容。

原理:根据对应加密算法,对于内容进行变换,实现隐藏、无法伪造。

算法:

  1. 不需要还原:哈希算法
    1. 速度快,但是无法还原
    2. 用于:签名、文件校验
    3. 常用算法:MD5、SHA
  2. 需要还原:加密算法
    1. 速度慢,但是可以还原
    2. 对称加密:加密、解密过程对称:AES
    3. 非对称假面:加密、解密过程不对称:RSA

接口加密实战

20250508202303382-image


添加方法:测试计划—线程组—(右键添加)HTTP请求—(右键添加)前置计划—JSR223预处理程序。

20250509125549448-image

import org.apache.commons.code.digest.DigestUtils;

username_md5 = DigestUtils.md5Hex("admin");
password_md5 = DigestUtils.md5Hex("123");


vars.put("username_md5",username_md5);
vars.put("password_md5",password_md5);
  • 使用的apache中的MD5

调用:

  • ${变量名}
  • 例如${password_md5}

jmeter自动录制脚本

原理:

jmeter录制脚本,在没有接口文档的就项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本。

jmeter录制脚本原理

20250508174750681-image

录制时,jmeter作为代理服务器来拦截和转发请求与响应数据。

20250508174826333-image

jmeter脚本录制

  1. 添加HTTP代理服务器,并进行配置
    1. 测试计划(右键)—非测试元件—HTTP代理服务器
  2. 配置代理服务器的参数
  3. 20250508174947164-image

  4. 开启Windows操作系统的浏览器代理
  5. 20250508175025671-image

  6. 启动代理服务器,开始录制
  7. 20250508175042215-image

  8. 在浏览器页面中进行操作,成功后,就能在jmeter当中看到抓取到的接口请求了。
  9. 20250508175131999-image

当使用代理的过程中,发现抓不到包,几个可能的情况

  1. 过滤规则设置问题
  2. 重启jmeter代理服务器或者重启jmeter
  3. 换浏览器来使用
  4. 检查PC机中的代理设置是否处于可用状态。
  5. 拔掉网线,抓包

jmeter外部集成

  1. MySQL等中间件
  2. 系统命令、外部程序
  3. Java系统工具(and、jenkins)

jmeter直连数据库

20250508175640501-image

步骤

添加MySQL驱动jar包

  • 方式一:在测试计划面板点击“浏览”按钮,将你的jdbc驱动添加进来。
  • 方式二:将MySQL驱动jar包放入到lib/ext目录下,重启jmeter

20250508175758133-image

  • 配置数据库连接信息
    • 添加方式:测试计划—线程组—(右键添加)配置元件—JDBC Connection…(连接数据库)

20250508175921233-image

参数介绍:

  1. varilable name:mysql数据库连接名称(jdbc请求时要引用)
  2. database url:jdbc:mysql://localhost:3306/数据库名称
    1. 组成:协议 + 数据库ip + 数据库端口 + 连接数据库的名称
  3. jdbc driver class:MySQL驱动包位置固定格式–可下拉框选择。
  4. username:root(连接数据库用户名,如实填写)。
  5. password:MySQL数据库密码,如实填写,如果密码为空不写。
  • 添加JDBC请求
    • 添加方式:测试计划—线程组—取样器—JDBC request(执行SQL)

20250508180016797-image

参数介绍

  1. variable name:数据库连接池的名字,需要与JDBC Connection Configurtion 的 varilable name bound pool名字保持一致。
  2. query type:
    1. 查询操作:选择 select statement。
    2. 增加、删除、修改操作:选择updata seatement
  3. query:填写的sql语句,末尾不要加“;”
  4. variable names:保存sql语句返回结果的变量名。

jmeter调用python

使用python的方式去获取特殊的加密结果,并作为接口请求参数。

  1. python代码就绪
  2. jmeter调用python代码
  3. 将结果保存到变量中
  4. 添加方式:测试计划–线程组–(右键添加)取样器–JSR223

20250509152948510-image

20250509153239857-image

jmeter+ant+Jenkins持续集成

1. jmeter命令行调用模式

jmeter # 启动gui界面

jmeter -n -t jmeter脚本路径 # 不启gui界面,直接执行用例。

jmeter -n -t <测试脚本.jmx> -l <结果文件.jtl> -e -o <报告输出目录>

​参数说明​​:

  • -n:非 GUI 模式运行 JMeter
  • -t:指定 JMX 测试脚本路径
  • -l:生成 .jtl 或 .csv 格式的测试结果文件
  • -e:测试完成后生成 HTML 报告
  • -o:指定报告输出目录(​​目录必须为空或不存在​​)

问题:

如果产生了报告,无法重复产生。

同一个命令,无法重复执行。

2. ant执行自动化操作

Apache Ant 是一个基于 Java 的构建工具,主要用于自动化编译、测试和部署 Java 项目。以下是 Ant 的详细配置方法,适用于 ​​Windows​​ 和 ​​Linux​​ 系统:

1. 安装前准备​

  • ​JDK 环境​​:确保已安装 JDK(Java 8+),并配置 JAVA_HOME 环境变量
     
  • 验证命令:Java -version

​2. 下载并安装 Ant​

  1. ​下载 Ant​​:
    • 从 Apache Ant 官网 下载最新版本(如 apache-ant-1.10.12-bin.zip
       
  2. ​解压安装​​:
    • 将压缩包解压到指定目录(如 Windows 的 D:\apache-ant-1.10.12 或 Linux 的 /opt/ant

​3. 配置环境变量​

  1. 新增系统变量 ANT_HOME,值为 Ant 的安装路径(如 D:\apache-ant-1.10.12
     
  2. 在 Path 变量中添加 %ANT_HOME%\bin
     
  3. 验证安装:ant -version

4.基本使用

  1. 创建文件buidl.xml文件(自动化脚本,可以同时兼容Linux、macos、Windows)

代码:

<project name="ShellScriptExecution" basedir="." default="execute-scripts">
<property name="jmeter.home" value="E:\temp\apache-jmeter-5.6.3" />
<property name="jmx" value="JMeter从小白到大神.jmx" />
<!-- 以下无需修改 --><target name="task1">
<delete file="result.jtl"/>
</target>
<target name="task2">
<delete dir="report"/>
</target>
<target name="task3">
<exec executable="cmd" dir="${basedir}">
<arg value="/c"/>
<arg value="${jmeter.home}/bin/jmeter.bat"/>
<arg value="-n"/>
<arg value="-t"/>
<arg value="${jmx}"/>
<arg value="-l"/>
<arg value="result.jtl"/>
<arg value="-o"/>
<arg value="./report"/>
<arg value="-e"/>
</exec>
</target>
<target name="execute-scripts" depends="task1,task2,task3">
</target>
</project>

执行命令:ant

Jenkins持续集成

CI/CD:持续集成/持续部署

一个软件是由多个组件共同构成的。

  1. 集成
  2. 编译
  3. 测试
  4. 部署/发布

持续的进行集成、编译、测试、部署。


实际工作中的风格

  1. 分别对接每一个接口,最后整理元件的关系,后期往往忘记了整理。
  2. 全面分析项目,根据项目特征、元件之间的关系,使用公共组件,减少后期的维护。

接口协议

  • HTTP:默认端口号80,明文传输,没有安全可言,在可发测试环境中使用。
  • HTTPS:默认端口号44.,加密传输,证书校验,防止中间人攻击,生产环境标配。

cookies:常用的鉴权机制,还有session、token(多用户)、api-key(单用户)。

  • 接口发送给客户端一个数据,并要求下次请求自动带上。

session:基于cookies,只不过在cookies里面存储了id。

  • cookies规则比较复杂,通常使用cookies管理器元件自动处理。

第一种风格

分别对接每一个接口,最后整理元件的关系。

参数格式

  • 表单:用来发送键值对的数据,“application/x-ww-form-urlencoded”
  • json:发送json数据(支持多层嵌套、支持多种数据类型)。“application/json”
  • 文件上传:上传文件“multiparty/form-data;xxxx”

通过请求头声明参数的格式。

20250508142735520-image

20250508143234643-image

第二种风格

  1. 先进项项目的分析。
  2. 创建公共元件。
  3. 补全取样器和私有元件。

cookies管理器:

在jmeter配置文件中修改。 

20250508150050958-image

CookieManager.save.cookies=true  //将cookie自动的保存为变量

20250508145537822-image

20250508145707512-image

THE END
喜欢就支持一下吧
赞赏 分享