jmeter 学习

Jmeter零基础学习一:线程

测试计划:Threads(Users)、Test Fragment、配置元件、定时器、前置处理器、后置处理器、断言、监听器

一、Threads(Users)线程(用户)

(一)Setup thread group 
初始化的线程,每个线程只执行一次,用于执行预测试操作 
Setup thread group 执行测试前 进行定期线程组执行活动。 
线程内显示内容与线程组一致。

(二)Teardown Thread group 
做些清理工作,每个线程只执行一次,用于执行测试后动作。 
线程内容与线程组一致。 
Teardown Thread group执行测试结束后执行定期的线程组(类似Loadrunner的测试完毕后对应的清除信息的脚本)

(三)Thread group 
此线程组是我们通常使用的线程组。线程组也可以看作是一个虚拟用户组。线程组中的每一个线程都可以理解为一个虚拟用户。线程组中包含的线程数量 在测试执行过程中是不会发生改变的。 
1. 名称:填写线程组名称 
2. 注释:可以随意填写 
3. 在取样器错误后要执行的动作: 
继续:默认选中项,出现错误继续执行脚本 
Start Next Loop:开始下一循环 
停止线程:出现错误,停止线程不再执行操作 
停止测试:停止运行测试 
Stop Test Now:立即停止测试 
4. 线程数:即测试需要设置多少线程数(也可以理解为虚拟用户数) 
5. Ramp-Up Period(线程总计运行时间 ) 
Ramp-Up Period告诉Jmerter达到最大线程数据需要多长时间 。默认值为0,即Jmeter立即启动所有线程。假定共有30个线程,Ramp-Up Period 设为120秒,那么线程启动就为120/30,即每4s启动一个线程。 
6. 循环次数:决定线程循环次数,设置10次,即每个线程循环10次,100个线程要循环:10*100=1000次。 
7. 调度器:默认不选中,选中会打开 调整度器配置模块 
8. 启动时间:线程运行的启动时间 
9. 结束时间:线程运行的结束时间 
10. 持续时间(秒):线程运行的时间 
11. 启动延迟(秒):线程启动延迟的时间

Jmeter之二:逻辑控制器学习(一)

一、ForEach控制器 (循环控制器) 
这里写图片描述 
ForEach控制器在用户自定义变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。所以ForEach总是和User Defined Variables(用户名定议变量)一起使用。

这里写图片描述 
1. 名称:填写循环控制器名称 
2. 注释:可随意填写内容,不填也可以 
3. 输入变量前缀: 
4. 输出变量名称: 
5. Add ”” Before number?: 输入变量名称中是否使用“”进行间隔

二、Include Controller(包含控制器) 
这里写图片描述 
包含控制器用于使用外部的Jmx文件。 
注意说明:包含测试的测试计划中不能有线程组,仅仅只能有simple controller,然后其下可以添加任何采样器,控制器。 
这里写图片描述 
1. 名称:此控制器的描述性名称,显示在树上,并用于命名事务。 
2. 注释:非必填项,运行时控制器注释信息填写处

三、Runtime Controller(运行时控制器) 
The Runtime Controller controls how long its children are allowed to run. 
运行控制器,控件其下节点线程被运行时间。 
这里写图片描述 
1. 名称:此控制器的描述性名称,显示在树上,并用于命名事务。 
2. 注释:非必填项,运行时控制器注释信息填写处 
3. Runtime(Seconds):所需的运行时间秒

四、Switch Controller(开关控制器) 
这里写图片描述 
Switch控制器通过给该控制器中的Value赋值,确定要运行哪个采样器。有两种赋值方式: 
第一种:数值,Switch控制器下子节点从0开始计数排序,通过指定子节点所在的数值来确定执行的取样器。 
第二种:取样器名称,以采样器的名称来进行匹配。 
说明: 
当指定的名称不存在时,不执行任何元素。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在节点树上,并用于命名事务 
2. 注释:非必填项,填写控制器注释信息 
例子:在Switch Value 填写取样器名称如:page1 
这里写图片描述 
执行结果后,可以看到 只运行了page1取样器 
这里写图片描述

五、While Controller

这里写图片描述 
While Controller运行子节点直接 条件为“False”停止 
可能条件值: 
blank - exit loop when last sample in loop fails 
LAST - exit loop when last sample in loop fails. If the last sample just before the loop failed, don’t enter loop. 
Otherwise - exit (or don’t enter) the loop when the condition is equal to the string “false” 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. Condition(function or variable):条件(功能 或 变量)


 

Jmeter之二:逻辑控制器学习(二)

六、事务控制器 
这里写图片描述 
事务控制器会生成一个额外的采样器,测量执行嵌套测试元素所采取的整体时间。值得注意的是,这个时间包含该控制器范围内的所有处理时间,而不仅仅是采样器的。 
对于Jmeter2.3以上的版本,有两种模式的操作 
 事务采样器是添加到其下采样器后面的; 
 事务采样器是作为其下采样器的父采样器。 
生成事务采样器的测量时间包括:采样器以及其他的一切时间。由于时钟频率的问题,这个时间可能略大于单个采样器的时间之和。时钟开始时间介于控制器记录开始时间与第一个采样器开始之间,时钟结束时间亦然。 
事务采样器只有在其子采样器都成功的情况下才显示成功。 
在父模式下,事务控制器下的各个采样器只有在监视器才能看到。同时,子采样器的数据也不会在CSV文件中显示,但是在XML文件中可以看到。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. Generate parent sample:生成父采样器,如果检查,运行时生成的采样器要作为其他采样器的父节点,否则采样器作为一个独立的个体生成。 
4. Include duration of timer and pre-post processors in generated sample:包括在生成的采样器中的定时器和预处理器的持续时间 
说明: 
Generate parent sample 勾选中,聚合报告显示: 
这里写图片描述
Generate parent sample 不勾选中,聚合报告显示: 
这里写图片描述

七、交替控制器 
这里写图片描述 
交替控制器,一次只执行其下的一个子节点(采样器)(按顺序排序执行) 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. 忽略子控制器块 
执行结果: 
这里写图片描述

八、仅一次控制器 
这里写图片描述 
在测试计划执行期间,该控制器下的子结点对每个线程只执行一次,登录经常会使用到这个控制器。 
说明:将Once Only Controller作为Loop Controller的子节点,Once Only Controller在每次循环的第一次迭代时均会被执行。

  1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务
  2. 注释:控制器注释信息,非必填项 
    例子:在线程组内设置循环次数和3次:运行 
    这里写图片描述 
    Samples表明采样器执行次数。

九、吞吐量控制器 
这里写图片描述 
吞吐量控制器,控制其下的子节点执行次数与负载比例分配。

这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. 选择项: 
1) Total Executions:设置运行总次数 
当控制器执行了指定的执行总次数后即停止执行此控制器,吞吐量后的文本框里表示控制器将执行的次数。 
2) Percent Executions:设置运行比例(1-100之间) 
通过测试计划的总次数,使控制器执行特定的迭代次数所占的百分比,填写0-100的数字,表示执行的百分比。 
4. 吞吐量: 
1) 选择Total Executions,录入数值 
2) Percent Executions,录入百分比 
5. Per User: 
1) 勾选:会按照单独线程计算吞吐量,如线程组设置了10个线程,循环次数为5的情况,吞吐量为2时,吞吐量的子节点每个线程执行一次,总共会执行20次。 
2) 不勾选:按照全局的执行数次进行计数,如线程组设置了10个线程,循环次数为5的情况,吞吐量为2时,吞吐量的子节点仅会执行2次。 
例子: 
1. 先设置线程组的线程属性值:总共循环5次,共计50个线程 
这里写图片描述 
2. 设置吞吐量1为按次数执行 
这里写图片描述 
设置天吐量为2,表时吞吐量控制器下子节点共计运行2次,勾选中Per User 10个线程都运行。 
总计次数应为20次

  1. 设置吞吐量2按设置百比例执行 
    这里写图片描述 
    设置吞吐量为60.0%,表时吞吐量控制器下子节点共计运行6%*5为3次,勾选中Per User 10个线程都运行。 
    总计次数应为30次
  2. 运行结果查看: 
    这里写图片描述

十、如果(If)控制器 
这里写图片描述 
根据给定表达式的值决定是否执行该节点下的子节点,默认使用javascript的语法进行判断 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. 条件:填写条件判断语句,注意如果是字符串一点要在参数前加引号。返回“真”或“假”。 
4. Interpret Condition as Variable Expression?: 
勾选中:填写条件必须是一个表达式 且值为“True” 
5. Evaluate for all children?: 
勾选中:每个子结点执行前都会计算表达式




Jmeter之二:逻辑控制器学习(三)

十一、录制控制器 
这里写图片描述

使用Jmeter录制脚本的时才用到。

十二、循环控制器 
这里写图片描述 
循环控制器功用是指定其子节点运行的次数。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. 循环次数: 
1) 勾选中永远:一直循环不停歇 
2) 录入数值:表明在循环控制器节点下,所有采样器运行次数 
说明: 
1、 线程组设置了循环5次(组下所有线程全部循环5次) 
2、 在循环控制器次设置 循环次数为2 
3、 运行结果查看:循环控制器下子节点每个运行次数和:5*2=10次 
这里写图片描述

十三、模块控制器 
这里写图片描述 
模块控制器:控制测试的模块,会自动的读取显示左边节点添加的控制器 
The Module Controller provides a mechanism for substituting test plan fragments into the current test plan at run-time.

这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. Module To Run:读取左边节点树添加的控制 
例子: 
1. 模块控制器内选择了 简单控制器 
2. 在线程组内设置循环一次 
3. 运行结果,简单控制器下属 节点会运行两次。 
这里写图片描述

十四、简单控制器 
这里写图片描述 
最基本的控制器,没有任何附加作用,可以用来命名某些操作(如采样器等) 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项

十五、随机控制器 
这里写图片描述 
随机控制器:其下属节点在执行中,是随机读取某一个执行的。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. 忽略控制器模块:

十六、随机顺序控制器 
这里写图片描述 
随机顺序控制器:其下的子节点全部执行,但顺序是随机的。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项


Jmeter之三:配置元件 之 CSV Data Set Config

配置元件与采样器紧密关联。虽然配置元件并不发送请求(除了Http代理服务器例外),但它可以添加或者修改请求。 
配置元件仅对其所在的测试树分支有效。例如,假设测试人员在一个简单逻辑控制器中放置了一个Http Cookie管理器,那么该HTTP Cookie管理器只对旋转在简单逻辑控制器内的其他逻辑控制器生效。 
另外,相比父分支的配置元件,子分支内部的配置元件优先级更高。

这里写图片描述

一、CSV Data Set Config 
这里写图片描述 
CSV Data Set Config:被用来从文件中读取数据,并将它们分割存储到变量中,适合处理多变量。如:登录,在文本文档内把用户名和密码参数化,执行操作时,会自动循环读取文本里的用户名和密码。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. Filename:路径名称 
4. File encoding:文件编码 默认显示为: UTF-8 
5. Variable Names(comma-delimited):变量名列表(以逗号分隔)与文件内显示参数一一对应。 
6. Delimiter (use’\t’ for table):默认逗号 
7. Allow quoted data? : 
CSV文件是否允许值被引用,默认显示True 
选择False:不允许引用 
编辑,可以在此文本框内修改允许引用值的详细情说明。 
8. Recycle on EOF?:执行到文件结尾,是否从文件开始循环重新读取(默认True)。 
当到达文件尾时,且Recycle选项设置为True,就会从文件第一行重新开始读取,如果设置为false,而Stop thread on EOF?是False,那么当到达文件尾部时所有变量都将被置为,可以通过设置JMeter属性csvdataset.eofstring来改变该值。如果Recycle选项为false,而Stop thread是True,那么到达文件尾部之后,将导致线程被终止。

  1. Stop thread on EOF? :达到文件结尾后,线程是否该终止。
  2. Sharing mode: 
    如果希望每个线程拥有自己独立的值集合,那么就需要创建一系列数据文件,为每个线程准备一个数据文件,如test1.csv、test2.csv等,使用文件名test${__threadNum}.csv,并将“sharing mode”设置为”Current thread” 
    All threads:文件在所有线程间共享 
    Current thread group: 每个文件会针对每个线程组打开一次 
    Current thread: 每个文件会针对每个线程单独打开 
    编辑:在文本框内编辑设置参数

例子: 
1. 在新建txt文档,维护用户参数信保存设置文件类型为bat 
这里写图片描述 
2. 在CSV Data Set Config内设置文件名称、代码等。 
这里写图片描述 
3. 打开http请求,设置用户名、密码的参数值 
如: user {pwd} 
User、pwd 就是在CSV Data Set Config——Variable Names(comma-delimited) 内设置的值 
这里写图片描述 
运行程序,执行引用CSV Data Set Config设置的参数文件内的用户名、密码依次执行登录操作。


Jmeter之四:断言学习(一)

(一) HTML Assertion 
这里写图片描述 
HTML Assertion,允许用户 检查返回的Html语法内空 格式是否符合指定格式的相关标准。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. Doctype: 
4. Format: 
5. Errors only:只标记错误信息 
6. Error threshold:允许误差阈值,执行请求时,误差阈值在录入值范围内通过正常,超出错误提示说明 
7. Warning threshold:允许警告阈值,执行请求时,警告阈值在录入值范围内通过正常,超出警告提示说明 
如在Html Assertion内设置Warning threshold为2,执行程序为7会给予提示 
在断言结果的显示: 
这里写图片描述 
察看结果树的显示: 
这里写图片描述

(二) Size Assertion 
这里写图片描述 
Size Assertion每个响应包含了正确的字节数。您可以指定大小等于、大于、小于或不等于给定字节数的大小。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. Apply to :适用范围: 
Main sample only、Sub-samples only、Main sample and sub-samples、Jmeter Variable 
4. Response Size Field to test :响应字段大小测试 
Full Response、Response Headers、Response Body、响应代码、响应信息 
5. Size to Assert:返回结果文件大小的标准维护 
比较类型:=、!=、>、<、>=、<= ; 选择的比较类型,在字节大小控件录入bytes。 
例子: 
1、 在Size Assertion内维护判断 字节大小值 
这里写图片描述 
2、 运行结果后,在断言结果会根据录入字节大小,给出判断说明。 
这里写图片描述

(三) 响应断言: 
这里写图片描述 
响应断言:对服务器的响应进行断言校验。 
这里写图片描述 
1. 名称:控制器的描述性名称,显示在左边节点上,并用于命名事务 
2. 注释:控制器注释信息,非必填项 
3. Apply to:适用范围 
1) Main sample only:初始默认选中项,主采样器 
2) Sub-samples only:子采样器 
3) Main sample and sub-samples:主采样器和子样器 
4) Jmeter variable[]:Jmeter变量,断言是用来命名变量的内容 
4. 要测试的响应字段: 
1) 响应文本:服务器响应文本,一般普通http响应,都选中这个。 
2) URL样本:是对sample的url进行断言。如果请求没有重定向(302),那么就是这个就是请求url。 如果有重定向(且跟随重定向),那么url就包含请求url 和 重定向url 
3) 响应代码:http响应代码,如101,200,302,404,501等。但当我们要验证404,501等http响应代码时,需要勾选“ ignore status”。因为当http 响应代码为400,500时,jmeter默认这个请求时失败的。 
4) 响应信息:http响应代码对应的响应信息。 
5) Response Headers:响应头信息 
6) Ignore Statue:忽略对象 
5. 模式匹配规则: 
1) 包括:返回结果包括指定的内容(即要测试模式内添加的内容) 
注:模式的内容是一定要包含在要检查的请求页面内,否则会运行后会弹出: 
Assertion error: false 
Assertion failure: true 
2) 匹配:返回结果与指定结果要匹配 
3) Equals:返回结果与指定结果一致 
4) Substring:返回结果是指定结果的字串 
5) 否:不进行匹配 
6. 要测试的模式: 
即填写指定测试结果(可填写多个,若希望返回文本中包含有2个指定的字符串,只有当同时包含了这2个字符串值,这个断言才算通过,否则,算失败。) 
1) 添加:新增测试模式的按钮 
2) 删除:删除添加的内容



Jmeter之五:websocket测试(一)


    一、添加Jmeter对WebSocket协议的支持插件

1、到 https://github.com/maciejzaleski/JMeter-WebSocketSampler下载Jmeter的WebSocket协议的支持插件:JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar,并直接将这个jar包放到Jmeter软件的\lib\ext\目录下。
2、另外,查阅 https://github.com/maciejzaleski/JMeter-WebSocketSampler/wiki/Dependencies看到,这个插件需要以下几个jar包的支持:
1、jetty-http-9.1.2.v20140210.jar
2、jetty-io-9.1.2.v20140210.jar
3、jetty-util-9.1.2.v20140210.jar
4、websocket-api-9.1.1.v20140108.jar
5、websocket-client-9.1.1.v20140108.jar
6、websocket-common-9.1.1.v20140108.jar
对于1.0.1的版本,这些可以到 http://download.eclipse.org/jetty/updates/jetty-bundles-9.x/9.1.1.v20140108/网站下载。网上也有整理好的,可以到360云盘下载 http://yunpan.cn/cFDUNhHywxsMh (提取码:2c0b),也可以到 http://download.csdn.net/detail/qq_14913813/8568431CSDN网站下载。直接放到Jmeter目录的\lib\ext\目录下即可。
3、以上jar包都准备好并放到Jmeter目录的\lib\ext\目录下后,重启Jmeter之后可以在sampler中看到websocket sampler这一项。

  二、WebSocket Sampler简介



1、WebServer
(1)Server Name or IP:WebSocket发送的目标服务器的地址或者名称
(2)Port Number:WebSocker服务器监听的端口号。(一般是HTTP 80端口,可以通过WireShark数据包得到)

2、Timeout: 
(1)Connection – 发送一个连接请求后,Jmeter等待连接完成的最长时间,单位是毫秒。
(2)Response - 对响应消息的最大等待时间。

3、WebSocket Request
(1)Implementation – 只支持RFC6455(v13) ,WebSocket协议标准的最新版。
(2)Protocol – 有ws与wss之分,  ws前缀是WebSocket连接的辨别标识,wss前缀是WebSocket安全连接的辨别标识。根据自己的实际情况填写
(3)Streaming Connection – 选择这个TCP session要不要保持,如果勾上标识连接会一直存在,如果没有勾上,那么得到第一次响应后该链接就会被关闭。
(4)Request data:填入将要发送的请求,要跟开发沟通好,这个是什么格式的消息。

4.WebSocket Response
(1)Response Pattern – 采样器将等待含有该标识的消息并继续通信(或者直到timeout,该连接关闭)
(2)Close Connection Pattern – 如果服务器返回的消息含有这样的字符,就结束会话。
(3)Message Backlog – 定义服务器返回消息保留的最大长度。

   三、试验

按照网上的例子,可以用 http://www.websocket.org/echo.html这个网站做一些试验,网站会将收到的数据(你的request数据)在服务器响应中原样返回。
将网站提供的host等信息填入即可与网站通信,下面是我的实验,用于理解Jmeter中websocket sampler

1、streaming选项的影响


(1)不勾选streaming

test plan设置如下:

不勾选streaming connection结果如下:





       可以看出发送的Ground control to Major Tom被返回,这个实验是成功的,从result tree的sampler result中Execution FLow中可以看出测试的结果与上面我们的设置之间的关系:用了5000毫秒的时间等待服务器的连接,用了20000毫秒的时间等待服务器的消息,且在接受到第一条消息后,关闭了这个websocket会话。


(2)勾上streaming connection



可以看到在结束测试的时候,勾上streaming那个小勾后,测试结束时streaming connection还是开着的。


(3)发送两条消息

         只发送一条消息可能看不出什么区别,将Websocket sampler复制一下,发送两条信息。这样就可以看出第二条消息发送时是直接用的第一条消息打开的连接,服务器的响应被归类到一次会话的响应窗口。





 

(4)、参照参考文档设置一个测试(添加一个loop controller,设置循环次数为3)



结果如下:


         循环中的sampler都勾选了streaming,最后一个sampler没有勾选此选项,结果中可以看出:在loop controller中的sampler使用的是一个连接,在loop外面的这个sampler会打开一个新的连接,可以得出一个结论,实际上,当勾选了streaming connection时,不仅会在结束会话后保留连接,而且勾选了的sampler会在有可用连接是直接使用,而没有勾选的sampler即使存在可用连接也会重新打开一个新的连接。因此,如果是要在一个会话中发送多条消息,请勾选这个streaming connection。

2、如何人为的结束一段对话

这就要用到之前提到过的response pattern和close pattern,先给出三个请求在没有设置response pattern和close pattern的运行结果以便于比较



然后在第一个sampler中设置response pattern和close pattern如下(由于只建立一次连接,所以只会读取第一个sampler中的pattern设置信息)




         这样在第二个请求的响应返回不符合father这个标识,又符合了close pattern时,就会断开连接了,此时第三个websocket勾选了streaming使用上一个连接,但实际上却连接不上这个远程终端时就会报错了。(response响应在这种情况下不能设置为空,如果先检测到返回的内容符合response pattern,就不会再去判断是否符合close pattern了)



3、Message Backlog的设置

上面的试验使用的都是默认的3,因此如果试验中的三个socket都是是在一个会话中通信,点击第三个是可以看到最近的三个服务器响应的。当这个选项设置为1时,就只能看到最近的一条响应信息了




Jmeter学习中遇到问题(一):请求参数有中文,post传过去显示乱码

从网上找到的方法: 
在jmeter.properties中: 
sampleresult.default.encoding=ISO-8859-1 改 成 sampleresult.default.encoding=utf-8 保存后,重新Jmeter 
还要注意将 sampleresult.default.encoding=ISO-8859-1 前的# 去掉

尝试了上主面的方法没有效果: 
仔细查看后,在HTTP请求的Content encoding 中维护utf-8 
这里写图片描述 
再次尝试,执行,不会出现乱码


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值