前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JMeter详细使用手册

JMeter详细使用手册

作者头像
互联网金融打杂
发布2022-08-01 13:36:53
3.4K0
发布2022-08-01 13:36:53
举报

1. Jmeter的工作原理

Jmeter可以作为web服务器与浏览器直接的代理网关,以便捕获浏览器的请求和web服务器的响应,如此就可以很容易地生成性能测试脚本。有了性能测试脚本,jmeter就可以通过线程来模拟真实用户对web服务器的访问压力。

2. 环境安装部署

2.1 安装jdk

注意事项

JMeter 1.8 以上的版本需要JDK1.4以上的版本支持运行。JMeter可以运行在如下操作系统上: Unix,Windows和Open VMS;

JAVA的环境变量设置

代码语言:javascript
复制
a. 使用鼠标右击“我的电脑”->属性->高级->环境变量 
b. 系统变量->新建->变量名:JAVA_HOME 变量值:d:\jdk  
c. 系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%\bin;  
d. 系统变量->新建->变量名:CLASSPATH 变量值:
e:运行->cmd->java version;
a090b0e654cdba2a35bf61c6ed247ff8.png
a090b0e654cdba2a35bf61c6ed247ff8.png

2.2 安装及运行jmeter

解压zip文件到你想安装JMeter的目录;运行解压后的bin目录下的 jmeter.bat;

如图所示:

ae7b4b729d2640496d74bca7fdb3a0bd.png
ae7b4b729d2640496d74bca7fdb3a0bd.png

2.2.1jmeter 目录介绍

(1).bin目录:可执行的目录

1).jmeter.bat:windows的启动文件

2).jmeter.log:日志文件

3).jmeter.sh:linux的启动文件

4).jmeter.properties:系统配置文件

5).jmeter-server.bat :windows分布式测试要用到的服务器配置

6).jmeter-serve:linux分布式要用到的服务器配置

7).docs目录:接口文档目录

(2).extras目录:扩展插件目录

(3).lib目录:所用到的插件目录,里面都是jar包,会自动在JMETER_HOME/lib和ext目录下寻找需要的类

(4).liceses:jmeter证书目录

(5).ptinrable_docs 用户使用手册

Jmeter下载地址:Apache JMeter - Download Apache JMeter

3.建立一个基本的测试计划

62a25f69d1a7cbee1582b279e8ebc41e.png
62a25f69d1a7cbee1582b279e8ebc41e.png

4.Jmeter各元素的使用说明

4.1线程介绍

---Test plan(测试计划)

---------setup threads group(环境初始化)

---------thread group

---------thread group

---------tear down group(环境恢复)

Test plan:用来描述一个自动化测试,本次需要执行的测试范围,类似testlink上的测试计划。

thread group线程组:在自动化测试中可以是定义一个模块或者定义一个业务;在性能测试中,类似一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户;类似(LR中的action)

setup threads group 是一个特殊类型的线程组,执行测试之前的动作,做初始化的工作,类似(LR中的init)跟python unittest里面 setup函数是一个作用;自动化测试中,可以用于初始化测试环境;

tear down group 是一个特殊类型的线程组,执行测试之后的动作,做测试结束的收尾的工作,类似(LR中的end)跟python unittest里面 teardown函数是一个作用;在自动化测试中,可以用于恢复测试环境;

4.2线程组的8类可执行元件

jmeter元素

用途

用途详细说明

配置元件(Config element)

定义常量值,参数配置

配置数据库连接参数(JDBC……)

配置http包头信息

配置http请求默认值

配置获取csv文件里的数据

用户自定义变量

定时器(Timer)

等待时间

两个操作之间的等待时间

前置处理器(Per processors)

处理sample中的参数

用于在实际的请求发出之前对请求进行处理,例如需要保存请求中的参数或者修改请求中的参数值;

后置处理器

处理服务器返回值

用于对sampler发出请求后得到的服务器响应进行处理,一般用来提取响应中特定数据;

断言(assertions)

检查响应数据是否符合预期

断言用于检查测试中得到的响应数据是否符合预期,断言一般用来设置检查点,用以保证性能测试过程中的数据交互是否与预期一致

监听器

展示请求处理情况

是用来对测试结果数据进行处理和可视化展示的一系列元件

取样器(sampler)

请求包

取样器是实际向服务器发出请求的请求包

逻辑控制器

执行顺序

控制test plan 中sampler节点发送请求的逻辑控顺序的控制器

用来组织可控制sampler节点的事物控制器,吞吐量控制器

5.配置元件

5.1 CSV Data Set Config

用途:从csv文件中逐行读取数据;适合需要读取大批量数据的应用场景;

d0de2c3757b25b76fe1104e436106893.png
d0de2c3757b25b76fe1104e436106893.png

5.2 HTTP信息头管理器

用途:通知jmeter发送请求包的参数格式;是键值对,还是json格式;

19b8cad53d9bb3a94363f62e806cc2cf.png
19b8cad53d9bb3a94363f62e806cc2cf.png

5.3 HTTP请求默认值

用途:如果后续的多个Sample请求的服务器地址和端口都是同一个,可以统一配置一个http请求默认值,这样不需要每个sample上都配置一遍服务器地址和端口;

39374c9d39bf14ffdbed4e0fa65bc799.png
39374c9d39bf14ffdbed4e0fa65bc799.png

5.4 数据库连接信息配置

用途:配置jmeter中需要使用的数据库连接信息

af676cfd420b956ed5beb831782c59f6.png
af676cfd420b956ed5beb831782c59f6.png

5.5 用户定义的变量

用途:配置整个线程组里的sample需要用到的变量,便于统一维护变量的值;

1db3cc01263b35f225515d7e19b1a94d.png
1db3cc01263b35f225515d7e19b1a94d.png

6.逻辑控制器

6.1 ForEach控制器

ForEach控制器在用户自定义变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。所以ForEach总是和User Defined Variables(用户定义的变量)一起使用。下面会以实例的形式介绍它的用法。

349b3dffc40fc33be658780e7b0ce151.png
349b3dffc40fc33be658780e7b0ce151.png
d7520c4e689d0dda9d43820c37374a41.png
d7520c4e689d0dda9d43820c37374a41.png
a8e118ecadb5818998d3b8189ae64560.png
a8e118ecadb5818998d3b8189ae64560.png
b85adf6fba2904f26fbe124d1fd676e3.png
b85adf6fba2904f26fbe124d1fd676e3.png
f7756392c5c2e01e60b1615eb4429e28.png
f7756392c5c2e01e60b1615eb4429e28.png

6.2 简单控制器(Simple Controller)

作用:这是Jmeter里最简单的一个控制器,它可以让我们组织我们的采样器和其它的逻辑控制器(分组功能),提供一个块的结构和控制,并不具有任何的逻辑控制或运行时的功能。

a84e0619790ae78907497f1755ccdea7.png
a84e0619790ae78907497f1755ccdea7.png

6.3 仅一次控制器

用途:当一个循环逻辑里的有个业务只需要运行一次时,这个业务可以定义到仅一次控制器里;例如环境初始化

6f4818a2371dc9b4ab39ec056e3a70fd.png
6f4818a2371dc9b4ab39ec056e3a70fd.png

6.4 循环控制器

用途:当需要循环执行一组sample,例如需要针对一个接口测试一组数据,就可以使用循环控制器;

8d5b1ea21f816d780c66198223e538d9.png
8d5b1ea21f816d780c66198223e538d9.png

6.5 如果(If)控制器

用途:当需要进行if/else处理时选择,例如注册结果为用户已存在,则直接登录;

函数(默认是Javascript语句)或变量,只要运行结果为true或false即可。使用上有些区别,举个例子,原先我们可以使用条件为:{__jexl({VAR} == 23)},这将被评估为true或false,结果将被传递到JavaScript,然后返回true或false。如果选中“Interpret Condition as Variable Expression?”,直接会对变量表达式进行评估是否为true,而不需要使用Javascript进行解析。此外,变量表达式可以返回任何值,而JavaScript的条件必须返回true或false,否则将记录错误。

当选择“Evaluate for all children?”时,该条件会对每个子节点进行判断,不选则默认只执行第一个子节点。

Javascript作为条件的例子:

(1)${COUNT} < 10

(2)"${returnVar}"=="http://www.baidu.com"

(3)"${returnVar}"=="http://www.baidu.com"

d0fdc01e027b2535dc180996a4d375bf.png
d0fdc01e027b2535dc180996a4d375bf.png

7. 取样器sample

用途:向服务器发出的请求包参数及值;

ce9543be218e1198999e6f1159034cc1.png
ce9543be218e1198999e6f1159034cc1.png

8. 前置处理

Sample请求包发出前的处理;

8.1 BeanShell PreProcessor

用途:修改、保存,sample请求包中的数据;

baab64692fbf3aeb46da68e6f1478ce7.png
baab64692fbf3aeb46da68e6f1478ce7.png

JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);

vars-(JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:

a) vars.get(String key):从jmeter中获得变量值

b) vars.put(String key,String value):数据存到jmeter变量中

更多方法可参考:org.apache.jmeter.threads.JMeterVariables

prev-(SampleResult):获取前面的sample返回的信息,常用方法:

a) getResponseDataAsString():获取响应信息

b) getResponseCode() :获取响应code

080d219c908909dfcdb2b5bf7d0628fa.png
080d219c908909dfcdb2b5bf7d0628fa.png

9. 后置处理

Sample请求包请求后的结果处理;

9.1 BeanShell PostProcessor

用途:处理sample请求包发出去后的,服务器返回的结果值;

6341a919edbb076f7cb494570273288c.png
6341a919edbb076f7cb494570273288c.png

9.2 JDBC PostProcessor

用途:处理sample请求后,检查数据库中数据的变化;

3b2366b37a484f48f757c908a83a89f9.png
3b2366b37a484f48f757c908a83a89f9.png

9.3 正则表达式提取

用于提取Sample请求发送后,服务器返回的响应结果的数据提取;

af2be0cfa8688ab518525d83d7b4345f.png
af2be0cfa8688ab518525d83d7b4345f.png
6b68cb49bdce89e7cb451ae6ddfa8799.png
6b68cb49bdce89e7cb451ae6ddfa8799.png

允许用户从服务器的响应中通过使用perl的正则表达式提取值。作为一个后置处理器,该元素会作用在指定范围的取样器,应用正则表达式,提取所需要的值,生成模板字符串,并将结果存储到给定的变量名中。

在此简单地向大家介绍一下常用的正则表达式的基础:

  • .:匹配任何单个字符。例如Perl正则表达式r.t匹配这些字符串:rat、rut、rt,但是不匹配root
  • :匹配行结束符。例如Perl正则表达式weasel能够匹配字符串"He'saweasel"的末尾,但是不能匹配字符串"Theyareabunchofweasels."
  • ^:匹配一行的开始。例如Perl正则表达式^Whenin能够匹配字符串"Wheninthecourseofhumanevents"的开始,但是不能匹配"WhatandWheninthe"
  • *:匹配0或多个正好在它之前的那个字符。例如Perl正则表达式.*意味着能够匹配任意数量的任何字符
  • \:这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配。例如Perl正则表达式\$被用来匹配美元符号,而不是行尾,类似的,Perl正则表达式\.用来匹配点字符,而不是任何字符的通配符
  • []、[c1-c2]、[^c1-c2]:匹配括号中的任何一个字符。例如Perl正则表达式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括号中使用连字符-来指定字符的区间,例如Perl正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如Perl正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如Perl正则表达式[^269A-Z]将匹配除了2、6、9和所有大写字母之外的任何字符
  • |:将两个匹配条件进行逻辑“或”(Or)运算。例如Perl正则表达式(him|her)匹配"itbelongstohim"和"itbelongstoher",但是不能匹配"itbelongstothem."。注意:这个元字符不是所有的软件都支持的 +:匹配1或多个正好在它之前的那个字符。例如Perl正则表达式9+匹配9、99、999、98、93dsf、9.....等。注意:这个元字符不是所有的软件都支持的
  • ?:匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的 {i}、{i,}、{i,j}:匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如Perl正则表达式A[0-9]\{3\}能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。Perl正则表达式[0-9]\{4,\}匹配连续的任意4个或4个以上数字字符。Perl正则表达式[0-9]\{4,6\}匹配连续的任意4个、5个或者6个数字字符。注意: 这个元字符不是所有的软件都支持的
  • \d:任意数字 [0-9]
  • \D:除数字外的任意字符 [^0-9]
  • \w:任意单词字符 [_0-9a-zA-Z]
  • \W:任意非单词字符 [^_0-9a-zA-Z]
  • \s:空白 [ \r\t\n\f] \S:非空白 [^ \r\t\n\f]

10. jmeter断言

用于判断返回的响应结果是否满足预期;

10.1 响应断言

一个sample的请求响应结果如下:

dc66114f486fba878de0ea503bd54ede.png
dc66114f486fba878de0ea503bd54ede.png

则可以设置断言如下:

29b761fad10a3dce009a415f74350469.png
29b761fad10a3dce009a415f74350469.png

备注:包括:返回结果包含指定的内容。

匹配:根据置顶内容进行匹配:

Equals:返回结果与指定的一致

substring:返回结果是指定的字符串

否:不匹配

11.内置函数

11.1 _CSVread读取参数文件

两个值:1.读取文件的全路径2.文件序列号(从第几列读取,0是第一列)

11.2 _StringfromFile读取文件

三个值分别是:1.读取文件的全路径2.从第几行开始读3.从第几行结束读取(0是第一行)

11.3 _counter计数器

两个值分别是:

1.当第一个值为true表示每个用户都有自己的计数器,当 为false时,作为全局计数器

2.存储结果的变量名

12.jmeter执行原理

12.1 元件作用域

jmeter中元件的作用域是靠测试计划的树形结构中元件的父子关系确定的,作用域的原则是:

1.取样器不和其他元件交互:不存在作用域的问题;

2.逻辑控制器(logic controller)元件只对子节点中的取样器和逻辑控制器作用

3.除取样器和逻辑控制器外,其他6类元件,如果是某个取样器的子节点,则该元件对其父子节点起作用,如果其父子节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点)

12.2 元件的执行顺序

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

执行顺序tip:

前置处理器,后置处理器,断言等元件功能对取样器起作用,因此,如果他们的作用域内没有任何取样器,不会执行

如果同一作用域范围有多个同一类的元件,按照测试计划树依次进行。

关于Jmeter生成CVS数据流的 方法

1. 导入jar包

2. Jmeter中设置参数,设置路径。 BeanShell Sampler 代码如下:

代码语言:javascript
复制
import handle.handlepath;
//解决盘符问题
handlepath hp=new handlepath();
//log.info("-------------");
//log.info(vars.get("outputdatapath"));
String dir=vars.get("userDir");
//log.info(dir);
dir=hp.recodePath(dir);
//log.info(dir);
vars.put("outputdatapath",dir);
177b77648447c8b0b56b3bef1976481d.png
177b77648447c8b0b56b3bef1976481d.png

3. 导入数据

bec09e245571b3069a835eb9ba6f395c.png
bec09e245571b3069a835eb9ba6f395c.png

4. CSV数据的的引用

e7605a97690dd5740902538834cdca95.png
e7605a97690dd5740902538834cdca95.png

13.Jmeter做性能测试

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库, FTP服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。

1. 启动JMeter

这里就在win下进行,图形界面较为方便 在目录apache-jmeter-2.9\bin 下可以见到一个jmeter.bat文件,双击此文件,即看到JMeter控制面板。

2. 运行预准备

现在来对LinuxEye进行压力测试,压力测试对象为随机的几个网页链接,这几个链接是写在一个文本文件中的,在压力测试的时候会随机读取。

1) 建立一个线程组

为什么要建立线程组?

原因很简单,因为我们要模拟多个线程(用户)来访问LinuxEye。线程属性部分中,线程数是启动多少个线程,我这里填写的是10,Ramp-Up Period (in seconds)表示线程之间间隔多少时间允许,单位是秒,比如如果填写10,那么10/10=1表示10个线程间每隔1秒钟请求网站。循环次数:60个线程运行完毕算是一次,循环次数就是这样的一个请求过程运行多少次,我这里测试就填写的是2。每次修改一个设置后,别忘记了保存一下。

2) 设置请求服务器、压力链接等信息

接下来很自然的是,我们要测试的网站地址是什么?链接是什么?所以现在我们就来设置这些信息。右键点击我们刚创建的线程组,在弹出的菜单中,选择添加->Sampler->Http请求,弹出如下图界面:

路径:

假如你只是对一个链接进行压力测试,直接填写一个链接就ok,比如 http://www.linuxeye.com,但是大多数情况下都不是这样的,我们这里需要多个链接,就如同刚开始讲到的那样,我们要将多个链接保存到一个文本文件中,然后随机读取进行压力测试。我们可以这么做,如图:

在选择一个功能下拉列表中选择_StringFromFile,然后在本机新建一个测试文件C:\Users\root\Desktop\apache-jmeter-2.9\test.txt,在第一行(你也可以不在第一行)的值中填写测试文件的路径,如下图:

然后点击“生成”按钮,在生成按钮的左边文本框中将生成一个字符串如:

代码语言:javascript
复制
${__StringFromFile(C:\Users\root\Desktop\apache-jmeter-2.9\test.txt,,,)}

在test.txt测试文件中,我们每行写一个URL链接,如下格式:

代码语言:javascript
复制
1. /command
2. /linuxrumen
3. /program
4. /jianzhan
5. /command/cat.html
6. /command/chmod.html
7. /command/lsattr.html

注意,每行前面并没有http://www.linuxeye.com这样的信息,因为我们在前面已经填写了服务器地址为www.linuxeye.com,这里就没必要再为每个url填写这个相同前缀了;另外,上面的url格式也只是个例子,表示域名后的部分。

这样一来,当我们并非请求的时候,就会从test.txt中随机选择url来进行压力测试。

另外值得注意的一个地方是,如果参数中有中文的情况,运行的时候可能会出现乱码,这个时候就需要注意你在Jmeter中的编码设置与你要请求的网页编码是一致的。

路径文本框下面的选项,可以按默认的就成,Use multipart/form-data for HTTP POST是当请求中有附件的情况,一般情况下都不用选中的。

3) 查看运行结果

鼠标右键点击线程组,在弹出的菜单中选择添加->监听器->用表格查询结果,如下图:

3. 运行

当然,在运行前,请把所有修改都保存好

运行后的结果表格如下:

各属性如下:

· Sample:每个请求的序号

· Start Time:每个请求开始时间

· Thread Name:每个线程的名称

· Label:Http请求名称

· Sample Time:每个请求所花时间,单位毫秒

· Status:请求状态,如果为勾则表示成功,如果为叉表示失败。

· Bytes:请求的字节数

如果Status为叉,那很显然请求是失败了,但如果是勾,也并不能认为请求就一定完全成功了,因为还得看Bytes的字节数是否是所请求网页的正常大小值,如果不是则说明发生了丢包现象,也不是完全成功。

在下面还有几个参数:

· 样本数目:也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数

· 平均:每个线程请求的平均时间

· 最新样本:表示服务器响应最后一个请求的时间

· 偏离:服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布(这个我不是很理解)。

术语:

1. 线程组:测试里每个任务都要线程去处理,所有我们后来的任务必须在线程组下面创建。可以在“Test Plan(鼠标右击) -> 添加 ->Threads(Users) -> 线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。

2. 取样器(Sampler):可以认为所有的测试任务都由取样器承担,有很多种,如:HTTP请求。

3. 断言:对取样器返回的请求结果给出判断是否正确。

4. monitor:它的功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等

14.Jmeter脚本编写规范:

1. 熟悉业务逻辑(若有web页面显示,则熟悉前端接口逻辑)

2. 编写脚本过程中,做到闭环

3. 掌握其他技术要求,比如sql语句、正则表达式提取、脚本编写

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Jmeter的工作原理
  • 2. 环境安装部署
    • 2.1 安装jdk
      • 2.2 安装及运行jmeter
        • 2.2.1jmeter 目录介绍
    • 3.建立一个基本的测试计划
    • 4.Jmeter各元素的使用说明
      • 4.1线程介绍
        • 4.2线程组的8类可执行元件
          • 5.配置元件
            • 5.1 CSV Data Set Config
            • 5.2 HTTP信息头管理器
            • 5.3 HTTP请求默认值
            • 5.4 数据库连接信息配置
            • 5.5 用户定义的变量
          • 6.逻辑控制器
            • 6.1 ForEach控制器
            • 6.2 简单控制器(Simple Controller)
            • 6.3 仅一次控制器
            • 6.4 循环控制器
            • 6.5 如果(If)控制器
          • 7. 取样器sample
            • 8. 前置处理
              • 8.1 BeanShell PreProcessor
            • 9. 后置处理
              • 9.1 BeanShell PostProcessor
              • 9.2 JDBC PostProcessor
              • 9.3 正则表达式提取
            • 10. jmeter断言
              • 10.1 响应断言
            • 11.内置函数
              • 11.1 _CSVread读取参数文件
              • 11.2 _StringfromFile读取文件
              • 11.3 _counter计数器
            • 12.jmeter执行原理
              • 12.1 元件作用域
              • 12.2 元件的执行顺序
            • 13.Jmeter做性能测试
              • 14.Jmeter脚本编写规范:
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档