【详细】Jmeter的安装配置与基本操作

这篇具有很好参考价值的文章主要介绍了【详细】Jmeter的安装配置与基本操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Jmeter环境搭建与配置

1、Jmeter环境搭建

安装JDK:https://www.oracle.com/cn/java/technologies/downloads/

安装Jmeter:https://jmeter.apache.org/download_jmeter.cgi

注意:下载JDK,注意电脑操作系统及位数;Jmeter版本要与JDK版本匹配;Jmeter安装路径不能有中文或空格

2、Jmeter基本配置

(1)Jmeter界面汉化

永久性:修改bin目录下的配置文件jmeter.properties,“language=zh_CN”,重启Jmeter即可

临时性:菜单“Options”->Choose Language->Chinese(Simplified)

(2)Jmeter主题修改

菜单“选项”->外观(选择自己喜欢的主题)

(3)响应结果中文不会乱码

打开bin目录下的配置文件jmeter.properties,修改“sampleresult.default.encoding=UTF-8”,重启Jmeter即可


二、Jmeter主要元件及相关的作用域

jmeter环境配置,软件测试,jmeter,测试工具

  • 取样器:调用方法发送请求
  • 逻辑控制器:控制取样器的执行顺序(要与取样器配合使用)
  • 前置处理器:对请求参数进行赋值
  • 后置处理器:提取响应中特定字段的值
  • 断言:对提取出来的值与预期结果进行对比
  • 定时器:模拟真实的业务场景
  • 配置元件:初始化测试数据
  • 监听器:在控制台查看脚本运行的结果

元件:多个类似功能组件的容器(类似于类)

元组:容器中实现独立的某个功能(类似于方法)

1、作用域的原则

  • 取样器:核心,没有作用域
  • 逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
  • 其他元件:
    • 如果是某个取样器的子节点,则该元件只对其父节点起作用
    • 如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)

2、元件的执行顺序

在同一个作用域(目录/级别/缩进)的不同元件的执行顺序:

  • 配置元件 - 前置处理程序 - 定时器 - 取样器 - 后置处理程序 - 断言 - 监听器

在同一个作用域(目录/级别/缩进)的相同元件的执行顺序:

  • 从上到下的顺序依次执行

案例:

jmeter环境配置,软件测试,jmeter,测试工具

执行顺序:定时器1 - 请求1 - 定时器1 - 定时器2 - 请求2 - 定时器1 - 定时器3 - 请求3


三、Jmeter线程组、HTTP请求、查看结果树的配置使用

1、线程组

介绍:控制Jmeter用于执行测试的一组用户

分类:

  • setUp线程组:预测试操作,所有脚本之前执行
  • 普通线程组:执行测试用例,可以有1个或多个(并行/串行)
  • tearDown线程组:测试后操作,所有脚本之后执行

参数:

jmeter环境配置,软件测试,jmeter,测试工具

2、HTTP请求

作用:向服务器发送http及https请求

位置:选中线程组->右键->添加->取样器->HTTP请求

参数:

jmeter环境配置,软件测试,jmeter,测试工具

3、查看结果树

查看请求参数:Request Body(请求行+请求体)

查看响应结果:Response Body(响应体)


四、Jmeter参数化

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

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

3、实现方式

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

(1)用户定义的变量

使用场景:定义全局变量

使用步骤:

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

jmeter环境配置,软件测试,jmeter,测试工具

(2)用户参数

使用场景:针对同一组参数,当不同的用户来访问时,可以获取到不同的值

使用步骤:

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

jmeter环境配置,软件测试,jmeter,测试工具

(3)CSV文件设置

使用场景:当不同的用户,或者同一个用户多次循环时,都可以获取到不同的值

使用步骤:

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

jmeter环境配置,软件测试,jmeter,测试工具

(4)函数(以__counter函数为例)

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

使用步骤:

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

jmeter环境配置,软件测试,jmeter,测试工具

(5)4种参数化方式对比

用户定义的变量:

  • 作用:定义全局变量
  • 局限性:每次取值(无论是否相同的用户)都是固定值

用户参数:

  • 作用:保证不同的用户针对同一组参数,可以取到不同的值
  • 局限性:同一个用户在多次循环时,取到相同的值

CSV数据文件设置:

  • 作用:保证不同的用户及同一个用户多次循环时,都可以取到不同的值
  • 局限性:需要手动进行测试数据的设置

函数:

  • 作用:保证不同的用户及多次循环时,都可以取到不同的值,不需要提前设置
  • 局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户名和密码)

五、Jmeter断言

1、定义:让程序自动判断预期结果和实际结果是否一致

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

3、常用断言方法

  • 响应断言
  • JSON断言
  • 持续时间断言

(1)响应断言

jmeter环境配置,软件测试,jmeter,测试工具

  • 响应文本:来自服务器的响应文本,即主体
  • 响应代码:响应的状态码,例如:200
  • 响应信息:响应的信息,例如:OK
  • 响应头:响应头信息
  • 请求头:请求头信息
  • URL样本:请求URL
  • 文档(文本):响应的整个文档
  • 忽略状态:忽略返回的响应状态码
  • 包括:文本包含指定的正则表达式
  • 匹配:整个文本匹配指定的正则表达式
  • 相等:整个返回结果的文本等于指定的字符串(区分大小写)
  • 字符串:返回结果的文本包含指定的字符串(区分大小写)
  • 否:取反
  • 或者:如果存在多个测试模式,勾选代表逻辑或,不勾选代表逻辑与
  • 测试模式:即填写你指定的结果(可填写多个)

(2)JSON断言

使用场景:对HTTP请求的响应结果为JSON格式时,可以使用JSON断言

使用步骤:添加线程组->添加HTTP请求->添加JSON断言配置参数->添加查看结果树查看断言结果

jmeter环境配置,软件测试,jmeter,测试工具

  • Assert JSON Path exists:用于断言的JSON元素的路径(实际结果)
  • Additionally assert value:如果您想要用某个值生成断言,请选择复选框
  • Match as regular expression:使用正则表达式断言
  • Expected Value: 期望值(期望结果)
  • Expect null:如果希望为空,请选择复选框
  • Invert assertion (will fail if above conditionsmet):反转断言(如果满足以上条件则失败)

(3)断言持续时间

作用:检查HTTP请求的响应时间是否超出要求范围

使用步骤:添加线程组->添加HTTP请求->添加断言持续时间设置持续时间->添加查看结果树

jmeter环境配置,软件测试,jmeter,测试工具


六、Jmeter关联

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

2、常用的关联方法

  • 正则表达式提取器
  • XPath提取器
  • JSON提取器
  • JMeter属性

(1)正则表达式提取器

使用场景:任意格式的响应数据,都可以使用正则表达式提取器进行提取

使用步骤:

  1. 添加线程组
  2. 添加HTTP请求1
  3. 在后置处理器添加正则表达式提取器设置参数
  4. 添加HTTP请求2,引用正则表达式中的引用名称。如:用${title}引用它
  5. 添加查看结果树

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

公式格式:左边界(匹配符号)右边界:可以提取出想要获取的数据内容

.:是通配符,可以代表任意字符(除换行回车)

*: 代表前面的字符出现0次或者多次

.*匹配规则:找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来

?: 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;再次查找左边界和右边界

公式格式:左边界(.*?)右边界

<title>百度一下,你就知道</title>

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

jmeter环境配置,软件测试,jmeter,测试工具

(2)xpath提取器

使用场景:针对HTML格式的响应结果数据进行提取

使用步骤:

  1. 添加线程组
  2. 添加HTTP请求1
  3. 在后置处理器中选择添加xpath提取器设置参数
  4. 添加HTTP请求2,引用正则表达式中的引用名称。如:用${title}引用它
  5. 添加查看结果树

jmeter环境配置,软件测试,jmeter,测试工具

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

(3)JSON提取器

使用场景:针对JSON格式的响应数据进行提取

使用步骤:

  1. 添加线程组
  2. 添加HTTP请求1
  3. 在后置处理器中选择添加JSON提取器设置参数
  4. 添加HTTP请求2,引用正则表达式中的引用名称。如:用${title}引用它
  5. 添加查看结果树

jmeter环境配置,软件测试,jmeter,测试工具

  • Names of created variables:存放提取出的值的参数名称。如:cit
  • JSON Path expressions:用于提取值的JSON路径表达式
  • Match No:0表示随机;-1表示提取的所有结果,1表示第一个值
  • Default Values:参数的默认值

(4)JMeter属性

使用场景:在不同的线程组之间传递参数

使用步骤:

  1. 添加线程组1
  2. 添加HTTP请求1
  3. 添加提取器(JSON、Xpath、正则表达式)
  4. 添加BeanShell取样器(将取样器提取的值保存为JMeter属性)
    1. 保存JMeter属性:${__setProperty(变量名,${提取器提取出值的变量},)}
  5. 添加线程组2
  6. 添加HTTP请求2(读取JMeter属性)
    1. 读取JMeter属性:${__property(变量名,,)}
  7. 添加查看结果树

jmeter环境配置,软件测试,jmeter,测试工具

jmeter环境配置,软件测试,jmeter,测试工具

jmeter环境配置,软件测试,jmeter,测试工具

注意:__setProperty函数执行(JMeter属性):需要通过BeanShell取样器来执行


七、Jmeter自动录制脚本

1、定义:在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本

2、原理:录制时,JMeter作为代理服务器来拦截和转发请求与响应数据

jmeter环境配置,软件测试,jmeter,测试工具

3、jmeter脚本录制步骤

(1)添加HTTP代理服务器,并进行配置(在非测试元件中)

jmeter环境配置,软件测试,jmeter,测试工具

jmeter环境配置,软件测试,jmeter,测试工具

(2)开启windows操作系统的浏览器代理

jmeter环境配置,软件测试,jmeter,测试工具

(3)启动代理服务器,开始录制

jmeter环境配置,软件测试,jmeter,测试工具

jmeter环境配置,软件测试,jmeter,测试工具

(4)在浏览器页面中进行操作,成功后,就能在JMeter当中看到抓取的接口请求了

当使用代理的过程中,发现抓不到包,可能发生以下情况:

  • 过滤规则设置有问题
  • 重启Jmeter代理服务器或者重启Jmeter
  • 换浏览器来使用(ChromeIE
  • 检查PC机中的代理设置是否处于可用状态
  • 拔掉网线,抓包

八、Jmeter连接数据库

1、直连数据库的作用

  • 用作请求的参数化。例如:登录时需要的用户名可以从数据库中查询获取
  • 用作结果的断言。例如:添加购物车下单时,检查接口返回的订单号,是否与数据库中生成的订单号一致
  • 清理垃圾数据。例如:添加商品(商品名/编号等不能重复),再执行该脚本不能成功,需要在下次执行前删除该商品数据
  • 准备测试数据。例如:通过数据库来准备大量的性能测试数据

2、直连数据库的步骤

(1)添加Mysql驱动jar包

jmeter环境配置,软件测试,jmeter,测试工具

(2)配置数据库连接信息

添加方法:测试计划->线程组->配置元件->JDBC Connection Configuration

jmeter环境配置,软件测试,jmeter,测试工具

(3)添加JDBC请求

添加方法:测试计划->线程组->取样器->JDBC Request

jmeter环境配置,软件测试,jmeter,测试工具

(4)使用SQL语句返回结果的变量名替代原有的固定数据


九、Jmeter常用逻辑控制器

1、如果(if)控制器

作用:if控制器用来控制它下面的测试元素是否运行

位置:测试计划->线程组->逻辑控制器->IF控制器

jmeter环境配置,软件测试,jmeter,测试工具

2、循环控制器

作用:控制下面的测试元素循环执行一次或多次

位置:测试计划->线程组->逻辑控制器->循环控制器

jmeter环境配置,软件测试,jmeter,测试工具

注意:线程组也可以控制循环次数,但是与循环控制器的作用范围不同。线程组的循环对线程组下的所有HTTP请求有效,而循环控制器对子节点下的HTTP请求有效

3、ForEach控制器

作用:一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值。该控制器下的所有取样器都会被执行一次或多次,每次读取不同的变量值

位置:测试计划->线程组->逻辑控制器->ForEach控制器

jmeter环境配置,软件测试,jmeter,测试工具

例如:

jmeter环境配置,软件测试,jmeter,测试工具

jmeter环境配置,软件测试,jmeter,测试工具

那么后续的请求使用${kw}时就会依次赋值1、2、3


十、Jmeter常用定时器

1、同步定时器

定义:阻塞线程(积累一定的请求),当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力

位置:测试计划->线程组->添加定时器->Synchronizing Timer

jmeter环境配置,软件测试,jmeter,测试工具

  • 模拟用户组的数量:模拟用户的数量,即指定同时释放的线程数数量。若设置为0,等于设置为线程组中的线程数量
  • 超时时间以毫秒为单位:超时时间,即超时多少毫秒后同时释放指定的线程数;如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。如果大于0,那么如果超过设置的最大等待时间后还没有达到设置的线程数,就不再等待直接释放已到达的线程。默认为0

超时时间建议设置,不然会一直死等;也不能设置太小,不然没有达到指定的线程数就释放

2、常数吞吐量定时器

定义:模拟用户真实的使用场景,让Jmeter按指定的吞吐量执行,以每分钟为单位

位置:测试计划->线程组->添加定时器->Constant Throughput Timer

jmeter环境配置,软件测试,jmeter,测试工具

  • 目标吞吐量:每个用户每分钟发送的请求数

案例:

—模拟用户真实的业务场景要求:20 QPS(每秒的请求数)

—如果线程数设置为1,则目标吞吐量设置为 20 * 60 = 1200

—如果线程数设置为2,则目标吞吐量设置为 20 * 60 / 2 = 600

3、固定定时器

定义:指定线程等待的时间(以毫秒为单位)

位置:测试计划->线程组->添加定时器->固定定时器

jmeter环境配置,软件测试,jmeter,测试工具


十一、Jmeter分布式测试

1、应用场景:在使用Jmeter进行性能测试时,如果并发数比较大(比如项目需要支持10000并发),单台电脑的(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能

2、原理:

jmeter环境配置,软件测试,jmeter,测试工具

  • 分布式测试时分为一台控制机(Master)和多台代理机(Slaves)
  • 控制机负责发送测试任务给代理机
  • 代理机接收任务并向服务器发送请求,并接收服务器返回的响应,将测试结果返回给控制机
  • 由控制机对测试结果数据进行汇总统计

3、注意事项

  • 所有的测试机防火墙都已经关闭
  • 所有的测试机及服务器在同一个网络内
  • 所有的测试机Jmeter版本和JDK版本完全相同
  • 关闭Jmeter里的RMI SSL开关

 4、分布式测试步骤

(1)代理机配置

  • 代理机上需要安装Jmeter
  • 修改服务端口。注意:非必要,如果是在同一台机器上演示需要使用不同的端口,多台机器可以不修改
  • 打开bin/jmeter.properties文件,修改‘server_port’,比如:‘‘server_port=2001’
  • 运行代理机上的jmeter-server.bat文件,启动Jmeter

注:代理机可以是自己电脑上安装有多个Jmeter,也可以是其他电脑上的Jmeter

(2)控制器配置

  • 修改Jmeter的bin目录下jmeter.properties配置文件,修改‘remote_hosts’
    • 示例:‘remote_hosts=192.168.182.100:1099,192.168.182.200:2099’
    • IP和Port是代理机的IP以及自定义的端口,多台代理机之间用“,”隔开
  • 启动Jmeter
  • 选择菜单:运行 - - > 远程启动/远程全部启动

十二、Jmeter生成图形化报告

1、应用场景:在Jmeter中可以以图形化(饼状图、柱状图...)的方式显示脚本运行结果,比聚合报告或查看结果树组件实现更直观,用户体验更好

2、使用方法

命令:jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录

-n 无图形化运行
-t 被运行的脚本
-l 将运行信息写入日志文件
-e 生成测试报告
-o 指定报告输出目录

注意:

1、脚本文件必须指定目录或者将脚本文件放置在jmeter的bin目录下

2、日志文件和目录可以不填写,默认在当前目录;如填写必须保证文件和目录为空

3、实例

jmeter环境配置,软件测试,jmeter,测试工具

jmeter环境配置,软件测试,jmeter,测试工具文章来源地址https://www.toymoban.com/news/detail-778429.html

到了这里,关于【详细】Jmeter的安装配置与基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • anaconda 2023.7 安装、配置、开机启动和基本操作 (windows+linux 详细)

    包括notebook的开机启动,启动脚本、配置等,2023年12月4日更新教程 anaconda是conda中的一种,也可以选用其它的conda anaconda会把python、pip等直接安装上,不用额外装配了,省心 conda对于需要多个python环境的开发者非常方便 演示版本2023.09 安装方法对于其它版本基本一致 官网: an

    2024年02月15日
    浏览(70)
  • anaconda 2023.3 安装、配置、开机启动和基本操作 (windows+linux 详细)

    包括notebook的开机启动,启动脚本、配置等,2023年12月4日更新教程 anaconda是conda中的一种,也可以选用其它的conda anaconda会把python、pip等直接安装上,不用额外装配了,省心 conda对于需要多个python环境的开发者非常方便 演示版本2023.09 安装方法对于其它版本基本一致 官网: an

    2024年02月05日
    浏览(66)
  • Jmeter安装教程【5.5】【Windows】jmeter详细安装配置教程,装不好你打我

    目录 一、检查电脑是否有java的JDK,需要1.8以上版本 二、下载Jmeter安装包 三、配置jmeter运行环境 四、验证Jmeter是否配置成功 五、将Jmeter修改成中文  按win+r键打开命令提示窗,输入 java  -version  查看自己是否安装了JDK,后面的后缀版本号无所谓,前面是1.8就可以   如果没有

    2024年02月08日
    浏览(42)
  • Jenkins的下载、配置、安装和基本操作

    下载路径(镜像):http://mirrors.jenkins-ci.org/ 下载路径(官方):https://jenkins.io/download/ 可选择下载.msi文件(下载后点击进行安装)或者.war压缩包(直接放在对应文件夹下) 安装前,首先得下载安装JDK,配置Java环境(另外下载安装配置,见其他文章Java(JDK)下载安装及配置

    2024年02月09日
    浏览(48)
  • ZooKeeper 分布式协调服务: 概述及原理, 安装配置, 基本操作

    作者:禅与计算机程序设计艺术 Apache Zookeeper 是 Apache Hadoop 的子项目之一,是一个开源的分布式协调服务。它负责存储和维护关于网络中各个节点的数据。Zookeeper 提供了以下功能:配置维护、域名服务、同步和共享、软/硬件负载均衡、集群管理、Master 选举等。它的架构使得

    2024年02月08日
    浏览(39)
  • 【详细教程】关于如何使用Git&GitHub的基本操作汇总&GitHub的密钥配置 ->(个人学习记录笔记)

    点击 官网链接 后,进入Git官网,下载安装包 然后根据系统类型进行下载,一般为windows 一般选择64位的安装器版本 下载好后开始安装 点击Next 默认即可,Next 默认即可,Next Next Next Next Next Next Next Next Next Next install即可 我们在桌面随便创建一个文件夹例如code 进入code文件夹 鼠

    2024年02月06日
    浏览(55)
  • docker基本操作:安装部署、设置ssh远程登入、配置docker镜像文件并创建docker容器

    Docker 是一个流行的应用程序容器化和部署平台,允许开发人员轻松地创建、部署和管理容器中的应用程序。 请注意运行此命令需要 root 或 sudo 权限,因此可能需要在命令前加上 sudo 并输入密码。 一、更新系统工具(ubuntu) 安装docker 查看docker版本 启动docker服务 二、一些基本

    2024年02月04日
    浏览(62)
  • Git的基本操作(安装Git,创建本地仓库,配置Git,添加、修改、回退、撤销修改、删除文件)

    Git 是开放源代码的代码托管⼯具,最早是在Linux下开发的。开始也只能应⽤于Linux平台,后⾯慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这⼏⼤平台上正常运⾏了。 如果你的的平台是centos,安装git相当简单,以我的centos7.6为例: 我们还可以用下面的指令来

    2024年03月28日
    浏览(64)
  • Fiddler抓包工具配置+Jmeter基本使用

    一、Fiddler抓包工具的配置和使用 在编写网关自动化脚本之前,得先学会如何抓包,这里以Fiddler为例。会抓包的同学可以跳过这一步,当然看看也是没坏处的…… 局域网络配置     将要进行抓包的手机与电脑连入同一局域网,电脑才能够抓到手机APP的请求,这里介绍一种我

    2024年02月07日
    浏览(45)
  • Git基本操作(超详细)

    仓库是进⾏版本控制的⼀个⽂件⽬录 我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来。 首先创建一个 gitcode 目录来存放git, 创建⼀个Git本地仓库对应的命令为 git init 查看当前目录,发现多了个隐藏文件 .git .git ⽬录是Git来跟踪管理仓库的,不要⼿动修改这个⽬录

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包