web application stress tool怎么用

web application stress tool怎么用,第1张

一、准备工作

为了测试数据的准备性,首先需要删除缓存和Cookies等临时文件。启动IE后打开“工具”菜单下的“Internet”选项命令,在打开的“Internet选项”窗口的“常规”选项卡中,单击“Internet临时文件”区域的“删除Cookies”和“删除文件”按钮将临时文件删除。

二、录制测试脚本

安装并启动WAS,程序运行时会打开“Create new script”对话框,即建立一个新的脚本窗口(如图1),如果运行WAS没有打开该窗口可以单击WAS主程序窗口工具栏上第一个按钮“New Script”即可。

因为是初次使用,所以在新建脚本窗口上单击“Record”按钮打开创建向导对话框“Browser Recorder-Step 1 of 2”,其中三个选项的作用是选择要记录的内容,分别为Request(请求)、Cookies(网上信息块)以及Host headers(主机标题),可根据需要选择(图2),然后单击“Next”即会打开“Browser Recorder-Step 2 of 2”窗口,单击“Finish”按钮。这样WAS会自动启用,并且会打开一个浏览器窗口,此时我们就可以在浏览器的地址栏中输入要测试的网站网址。随着要测试的网站内容的不断显示,在WAS主界面的“Recording”选项卡中的信息会实时更新(如图3)。

当浏览器的状态栏显示为“完成”时,我们就可以返回WAS窗口,单击“Stop Recording”按钮返回脚本窗口。

三、测试设置

为了使测试更加准确,更加接按真实效果,需要对录制的测试脚本进行一些设置。

去除静态干扰

由于网页是由图片、文字以及其它动态源码组成的,而一般的静态内容消耗的带宽并不是很大,因此我们可以将其排除在外。在脚本中选中指向图像、文字以及其它静态文件项目前的灰色按钮,然后单击工具栏上的“Delete”按钮将其删除(图4)。

设置并发数

然后在单击“New Recorded Script”下的“Settings”标签,其中“Concurrent Connections”是设置并发连接数的,其下面的“Stress level (threads)”和 “Stress multiplier(sockets perthread)” 分别设置对目标服务器的压力及负载程度的,其中Level是客户端所产生的线程数目,一个线程可以产生多个Socket并发请求,因此将两者的数值相乘,所获得的数字就是客户端同时连接的并发数(图5)。

时间设置

时间设置包括“Test Run Time”(测试运行时间)和“Request Delay”(停止响应)以及“Suspend”(挂起时间)三项。其中测试运行时间是以日、小时、分钟和秒来设定的,建议该项时间不宜太短,如果设置的并发数较多,那么时间应该按比较增长,以便产生足够多的请求;而停止时间是指连接时超出这个时间即作超时处理;在挂起时间处部分为Warmup和Cooldown两项,一般可以设置为两三分钟为宜,这样做的目的是避免测试开始和结束时数据的变形,影响测试的准确性。

指定带宽瓶颈

“Bandwith”是指定带宽瓶颈的,即选择访问该网站大多数用户所使用的带宽。例如访问该网站的绝大部分用户是拨号,那么可以选择56K。

四、开始测试

做好基本的设置工作后,就可以在左侧选中新建的脚本“New Recorded Script”项,然后单击工具栏上的“Run Script”按钮,或者打开“Scripts”菜单下的“Run”命令,这样就开始测试了。测试过程中会以进度条的方式实时显示,待进度条结束我们即可进行测试结果分析了。

五、数据分析

现在我们就可以打开测试报告来查看测试结果了。单击“View”菜单,选择“Reports”,在打开的窗口左侧会按时间显示所有测试报告。根据时间选择本次测试报告,在窗口右侧即可查看具体内容。

在测试报告中最重要的部分就是“Socket Errors”部分和“Result Codes”部分。其中Socket Errors部分共分为Connect、Send 、Recv和Timeouts。其中Connect表示客户端不能与服务器取得连接的次数;Send表示客户端不能正确发送数据到服务器的次数;Recv表示客户端不能正确从服务器接次的次数;Timeouts表示超时的线程数目。由此我们可以如果这四个数值都比较小,甚至为0则说明我们的服务器是经得起考验的;如果数值居高不下,甚至接近设置的并发数,那么则要好好的检查你的服务器了(图6)。

另外在“Result Codes”部分,如果Code列表下的数值都为200,那么表示所有请求都经服务器成功返回,如果数值出现400或大于400,例如404,那么则需要在左侧找到“Page Data”节点,查看具体的错误项目,然后作出改正了。

其实要完整的反映出一个网站在服务器上的运行情况,需要不断增减其并发数,并且进行多次测试,才能了解服务器所能承受的限度,然后才可以在IIS中设置允许连接的最大数目,从而保证网站正常运行。

WAS 的负载使用说明(二)

测试脚本的准备

1、在测试客户端机器上启动Web Application Stress Tool,在弹出的“建立新脚本”对话框中选择“Record”按钮;

2、在“Record”参数设置第一步中,所有的checkbox都不用选择

到 第二步时直接点击“finish”,过几秒钟会弹出一个IE窗口,在此窗口中访问测试数据生成页面(http://192.168.1.4: 8086/Apply/test),依次点击5个测试用例连接,然后返回Web Application Stress Tool,停止Record;

3、将一些没用的记录删去(比如:/Apply/test/index.htm),只留下如下图所示的五条记录:

在Server输入框中输入服务器的IP,端口号不用输入。改一下脚本名字,比如改为Joinwork Test

4、5个测试用例在实际使用环境中被访问的概率是不一样的。我们可以在Page Groups中定义几个Page Group来模拟这种访问分布:

在上图中我们定义了5个Group,分别对应:查询可启动流程列表、启动流程、查询个人待办工作任务、显示任务执行表单和执行任务,它们被点击的次数比率为:1 : 1 : 5 : 5 : 4。

回到脚本主页面,分别将5条记录的Group改为刚才建立的Page Group。这样在运行脚本的时候就会按Group定义的比率来产生点击了;

5、下面设置测试并发用户数和测试时间长度。 到 如下图的Settings页面,通过Stress Level (threads)和Stress mulitiplters来设置并发用户数,Test RUn Time来设置测试时长。因为我们要做性能压力测试,不要设置延时时间(Request Delay)。可以在实际测试时间之前,设置一段warm up运行时间,这段时间的数据是不会记录到最后的报告里的;其他设置可以保持缺省值不变;

测试运行

一切准备完成后,回到脚本主页面,然后点击工具条上的“Run Script”按钮就开始测试了;

测试报告查看

测试运行结束后,我们就可以通过点击工具条上的”Reports”按钮查看测试报告了;

测试报告里比较重要的数据是:每秒处理的请求数(Requests per Second)和每个页面的平均响应时间。

上面两张图的数据是笔者直接使用Joinwork开发版的缺省配置(JBoss 3.2.2和JBoss自带的数据库Hsql),一台主频1.5M HZ(奔腾移动)、内存725M的笔记本作服务器,一台主频2.0M HZ的台式机作客户端,测试的数据。

数据显示在100并发用户数下,每秒可处理89.26个请求,其中响应时间最长的页面是任务执行,平均响应时间是1.66秒。

Web Application Stress Tool也可以采集服务器的CPU利用率等服务器端数据,有兴趣的话可以查看帮助文件。

Web Application Stress 是Microsoft免费提供的一款软件专门对WEB服务进行压力测试用的工具软件。我经常会需要测试一些服务器的运行状态和响应时间什么的,比如在网络中新加了一台防火墙做好设置以后,它的改动对于网络中应用层的服务影响怎么样,客户会不会明显感觉到IE 打开站点的速度明显减慢等等,尤其是在防火墙工作在透明代理模式下加上了一些对于应用服务的内容限制以后,设置前后速度上的改变都是非常重要参考数据的,我需要知道到底速度的影响有多大是否可以忽略不计。

部分数据解析

下面我们用其进行一次简单的压力测试。

1. 打开主程序,点击”Record”按钮

2. 选择”Record Delay between request”

3. 然后”next”,再”finish”4

4. 接下来会弹出一个浏览器,输入所要测试的WEB服务器地址,随便浏览一些页面,然后将其关闭,返回到Web Application Stress中

5. 点击”stop recording”按钮。点击”Settings”,就可以进入设置界面,填入一些参数。在此例中,threads我填入了50,run time我填入了2分钟,其它默认。然后选择”Scripts”菜单项中的”Run”,对服务器进行压力测试,等待2分钟。

6.结束后,选择”Window”下的”Reports”,可以看到类似于下面的压力测试结果(我已经将其简化了)。

============================================================

Number of test clients: 1

Number of hits: 6121

Requests per Second: 51.01

Socket Statistics

————————————————————

Socket Connects: 6163

Total Bytes Sent (in KB): 1750.10

Bytes Sent Rate (in KB/s): 14.58

Total Bytes Recv (in KB): 29227.62

Bytes Recv Rate (in KB/s): 243.55

Socket Errors

————————————————————

Connect: 0

Send: 0

Recv: 0

Timeouts: 0

RDS Results

————————————————————

Successful Queries: 0

下面对其进行简单解释。测试时间内,虚拟的用户点击页面6121次,平均每秒51个请求,Socket连接数6163,其中没有连接、发送、接收、超时错误。从这个压力测试报告来看,服务器对于50个用户同时操作,应该没有任何问题。需要特别说明的是,这个只是简化的部分结果。

这只是一个简单的示例,Web Application Stress的功能远不止于此,还需要在实践中总结才是。

负载测试报告分为两种:运行比较 这将创建使用表和条形运行,比较两个负载测试结果的数据。报表集。趋势 在两个或多个可以生成趋势分析负载测试结果。其结果以折线图显示,但可从数据透视表获得数据。要求Visual Studio 旗舰版提示也可以通过从摘要视图、关系图视图和表视图中复制和粘贴数据来手动创建 Microsoft Word 报告。有关更多信息,请参见 如何:使用 Microsoft Word 手动创建负载测试性能报告.这两种报告都可用于与利益干系人共享性能数据,传达系统的整体性能和运行状况是变好还是变差。报告定义存储在负载测试数据库中。保存报告后,报告定义保存在数据库中,以后可以重用。此外,可将 Excel 工作簿与利益干系人共享 ,以便利益干系人不必连接到数据库就可以查看报告。说明可以共享 Excel 工作簿;但是,只有计算机上已安装 Visual Studio 旗舰版的用户能够修改任意电子表格。其他用户不会看到在 Office 功能区的 负载测试报告 选项,但是,它们能够查看工作簿。警告最终 的Visual Studio 2012 与 Microsoft Office 2007 兼容。必须升级到 Microsoft Office 2010。在升级到 Microsoft Office 2010 之后中,Excel 负载测试插件可能不会正确加载。若要更正此问题,在 Microsoft Excel 2010 中,执行以下步骤:在Office 功能区,选择 文件。选择选项 然后选择 外接程序。在下拉列表中 管理下,选择 COM 加载项,然后选择 执行。为负载测试报告 Addin选中复选框。下图是显示处理(更新购物车)速度的下降和(% 处理器)计数器的退化之间的相关性的报告示例。这指向应用程序代码而不是数据库或网络中的潜在问题,并且适于使用 ASP.NET 探查器进行诊断。生成Excel 报告的方法有两种:一种是在负载测试分析器中使用工具栏中的“创建 Excel 报告”按钮,另一种是在 Excel 中使用 Office 功能区的“负载测试”选项卡中的“负载测试报告”选项。说明如果向负载测试中添加注释,注释将出现在 Excel 报告中。有关更多信息,请参见如何:使用负载测试分析器在分析完成的负载测试时添加注释和如何:使用负载测试分析器向运行负载测试中添加注释。使用Excel 生成负载测试比较报告在生成报告之前,必须先运行负载测试。有关更多信息,请参见运行负载测试。可采用两种方法创建 Excel 负载测试报告:在完成负载测试后,在 负载测试结果 页,在工具栏上选择 创建Excel 报告 按钮。说明如果“创建 Excel 报告”按钮在“Web 性能测试结果查看器”工具栏中处于禁用状态,可能需要运行一次 Microsoft Excel 才能启用该按钮。安装Visual Studio 旗舰版时,Visual Studio 旗舰版负载测试外接程序将会复制到您的计算机以便用于 Microsoft Excel;但是必须运行 Microsoft Excel 才能完成该外接程序的安装过程。Microsoft Excel 将打开“生成负载测试报告”向导。-或 -打开Microsoft Excel,选择 Office 功能区的选项 负载测试 然后选择 负载测试报告。此时将显示“生成负载测试报告”向导。在选择包含负载测试的数据库 页上,在 服务器名称下,键入包含的服务器名称负载测试结果。在的数据库名称 下拉列表中,选择包含的数据库负载测试结果。在要如何生成您的报告 页上,确认 创建报告 上选择并选择 下一个。在您希望生成哪种类型的报告 页上,确认 运行比较 上选择并选择 下一个。在“输入负载测试报告详细信息”页上,在“报告名称”中键入报告的名称。选择负载测试要生成报表并选择 下一个。在为报告选择运行 页上,在 选择一个或多个要添加到报告中的运行下,选择负载测试结果要在报告中比较并选择 下一个的两个。说明只能针对两个负载测试结果生成一个比较报告。如果选择一个负载测试结果或两个以上负载测试结果,则将显示一条警告消息。在“为报告选择计数器”页上的“选择一个或多个要添加到报告中的计数器”下面,有一个可用于自定义报告的可扩展计数器列表。默认情况下,已为报告选择以下计数器:LoadTest:Page - Avg.(负载测试:页 - 平均)页面时间LoadTest:Request - Requests/Sec(负载测试:请求 - 每秒请求数)LoadTest:Scenario - User Load(负载测试:方案 - 用户负载)LoadTest:Test - Avg.(负载测试:测试 - 平均)Test Time(测试时间)LoadTest:Test - Total Tests(负载测试:测试 - 总测试次数)LoadTest:Transaction - Avg.(负载测试:事务 - 平均)Response Time(响应时间)LoadTest:Transaction - Total Transactions(负载测试:事务 - 事务总数)Memory - Available MBytes(内存 - 可用的兆字节数)Network Interface - Bytes Total/sec(网络接口 - 每秒总字节数)PhysicalDisk - %Idle Time(物理磁盘 - 空闲时间百分比)Process - %Processor Time(进程 - 处理器时间百分比)Processor %Processor Time(处理器 - 处理器时间百分比)选择要从报告中两个所选的测试运行比较并选择 完成的计数器。将生成带有以下电子表格选项卡的 Excel 工作簿:目录 - 显示负载测试报告名称,并提供一个目录,其中包含指向报告的各选项卡的链接。运行- 提供有关正在比较报告中的哪两个运行的详细信息。测试比较 - 提供有关正在比较的两个运行之间的性能衰退和改进的条形图详细信息。页面比较 - 提供测试运行中的各个页面上两个运行之间的条形图和百分比性能比较数据。计算机比较 - 提供基于所使用的计算机的两个运行之间的比较数据。错误比较 - 比较在两个运行中所遇到的错误类型以及出现的次数。提示为了获得更好的报告,支持更多报告的负载测试和 Web 性能测试提供了几个属性。页面请求具有两个呈现在报告中的属性:“目标”和“报告名称”。将针对目标来报告页面响应时间,并且在报告中将使用报告名称而不是 URL。在负载测试“运行设置”的“管理计数器集”下面,“计算机标记”属性呈现在报告计算机名称中。若要在报告中描述特定计算机的角色,这非常有用。使用Excel 生成负载测试趋势报告在生成报告之前,必须运行负载测试。有关更多信息,请参见运行负载测试。可采用两种方法创建 Excel 负载测试报告:在完成负载测试后,在 负载测试结果 页,在工具栏上选择 创建Excel 报告 按钮。说明如果“创建 Excel 报告”按钮在“Web 性能测试结果查看器”工具栏中处于禁用状态,可能需要运行一次 Microsoft Excel 才能启用该按钮。安装Visual Studio 旗舰版时,Visual Studio 旗舰版负载测试外接程序将会复制到您的计算机以便用于 Microsoft Excel;但是必须运行 Microsoft Excel 才能完成该外接程序的安装过程。Microsoft Excel 将打开“生成负载测试报告”向导。-或 -打开Microsoft Excel,选择 Office 功能区的选项 负载测试 然后选择 负载测试报告。此时将显示“生成负载测试报告”向导。在选择包含负载测试的数据库 页上,在 服务器名称下,键入包含的服务器名称负载测试结果。在的数据库名称 下拉列表中,选择包含的数据库负载测试结果。在要如何生成您的报告 页上,确认 创建报告 上选择并选择 下一个。在您希望生成哪种类型的报告 页上,确认 趋势 上选择并选择 下一个。在“输入负载测试报告详细信息”页上,在“报告名称”中键入报告的名称。选择负载测试要生成报表并选择 下一个。在为报告选择运行 页上,在 选择一个或多个要添加到报告中的运行下,选择负载测试要在报告中比较并选择 下一个的结果。在“为报告选择计数器”页上的“选择一个或多个要添加到报告中的计数器”下面,有一个可用于自定义报告的可扩展计数器列表。默认情况下,已为报告选择以下计数器:LoadTest:Page - Avg.(负载测试:页 - 平均)页面时间LoadTest:Request - Requests/Sec(负载测试:请求 - 每秒请求数)LoadTest:Scenario - User Load(负载测试:方案 - 用户负载)LoadTest:Test - Avg.(负载测试:测试 - 平均)Test Time(测试时间)LoadTest:Test - Total Tests(负载测试:测试 - 总测试次数)LoadTest:Transaction - Avg.(负载测试:事务 - 平均)Response Time(响应时间)LoadTest:Transaction - Total Transactions(负载测试:事务 - 事务总数)LoadTest:Transaction - Transactions/Sec(负载测试:事务 - 每秒事务数)Memory - Available MBytes(内存 - 可用的兆字节数)Network Interface - Bytes Total/sec(网络接口 - 每秒总字节数)PhysicalDisk - %Idle Time(物理磁盘 - 空闲时间百分比)Process - %Processor Time(进程 - 处理器时间百分比)Processor %Processor Time(处理器 - 处理器时间百分比)从报告中所选的测试运行中,选择要比较来进行趋势分析并选择 完成的计数器。将生成带有一个目录的报告,该目录包含指向报告中生成的各个 Excel 工作簿选项卡的链接。这些链接基于为趋势报告选择的计数器。例如,如果在步骤 7 中将默认计数器保留为选中状态,则报告所生成的数据将针对步骤 7 中列出的每个计数器,呈现在 Excel 中的各个选项卡上。针对每个计数器生成的数据呈现在趋势图中。

在进行性能测试执行之前,需要进行场景的设计:

以什么方式启动,如何持续进行,直至测试结束

三部曲:启动---持续进行---结束

PS:一般情况下,建议限制Jmeter的的线程数在300及以内,这样能更好的发挥出jmeter的性能

测试步骤:

测试计划---线程组--HTTP请求---监听器---运行脚本---查看报告

PS:默认情况下,JMeter运行需要占用1 GB的内存,这可能还不够,取决于你的测试计划和需要运行的线程数

一个测试计划描述了一系列Jmeter运行时需要执行的步骤,可以包含一个或者多个线程组,逻辑控制器,取样发生控制,监听器,定时器,断言和配置元件。

启动JMeter,会出现一个空的测试计划,此次练习通过手写脚本来实现

(不熟悉操作的,也可以通过模板的形式创建,在菜单栏文件--Templates,下拉列表中选择Recording,点击Create,一个完整的Test Plan就生成了,当然我们可以删除不需要的内容)

作用:模拟用户个数、发送请求的频率及次数

PS:设置合理的线程数对能否达到测试目标有着决定性的影响,另外,设置合理的循环次数也很重要

此处添加3个HTTP请求

1、添加响应断言 :设置响应码为200

2、查看结果树,验证请求

调试时线程数和循环次数设为1就可以了,记得调试好之后再改回去

3、禁用查看结果树,命令行执行脚本

我们在启动Jmeter时就会看到命令行的提示信息,进行负载测试时请不要使用GUI模式,也就是用命令行模式运行 JMeter 测试脚本,这样可以大大缩减所需要的系统资源

备注:GUI 即图形用户界面模式,只应用于创建测试脚本、调试脚本

图中也给出了命令格式: jmeter -n -t [jmx file] -l [result file] -e -o [Path to output folder] ,JMeter 默认去当前目录寻找脚本文件,并把日志记录在当前目录,当然也可以使用绝对路径来执行

参数说明:

(1)直接生成HTML报告

PS:输出文件(-l后的文件)必须是不存在的,report文件夹为空文件夹或者不存在(-o后面的),不然无法生存报告

启动CMD窗口,输入以下命令:

jmeter -n -t C:\Users\zhangXXX\Desktop\baidu.jmx -l C:\Users\zhangXXX\Desktop\html.csv -e -o C:\Users\zhangXXX\Desktop\baidu-reports

(2)使用之前的测试结果,生成测试报告

启动CMD窗口,先生成测试结果,再生成报告,输入以下命令:

PS:-g 指定已存在的测试结果文件

以上两种方法,其实最终都依赖生成的测试报告。双击报告文件夹中的index.html就可以查看报告

Dashboard:

Test and Report informations:指的是测试和报告信息

APDEX(Application Performance Index):应用程序性能满意度的标准,范围在0-1之间,1表示达到所有用户均满意,越接近1满意度越高

Requests Summary:请求的通过率(OK)与失败率(KO),百分比显示

Statistics:数据分析,基本将Summary Report和Aggrerate Report的结果合并

Errors:错误情况,依据不同的错误类型,将所有错误结果展示

Charts: 用图表的形式展示测试数据,让测试报告更加直观**

主要有如下特点:

(1)将测试过程中经常使用的数据,用图表的形式展示,让测试结果更加直观

(2)每个图表数据,有两种展示形式

(3)支持请求样例过滤显示

(4)支持导出PNG图片格式

Over Time Charts:

Throughput Charts:

Response Times Charts:

4、添加所需监听器,导入日志文件即可查看

在性能测试过程中,我们往往需要将测试结果保存在一个文件当中,也可以为日后的性能测试报告提供更多的素材

在Jmeter中,结果都存放在 .jtl 文件中,格式有很多种,可以根据需要进行更爱,选择某个监听器,在 configure页面 进行相应配置,让我们来查看下保存后的文件有哪些内容:

接下来添加一个聚合报告,然后导入日志文件,查看结果,还可以添加其他的监听器,操作方法一样

PS:如果测试计划中增加了监听器(生成概要结果),在执行命令时就可以看到每个线程的执行情况

PS:设置好线程数、循环次数、集合点、事务、断言、关联等等后即可执行压力测试

原理和LR的agent差不多,因为jmeter由Java开发,耗内存、cpu,所以需要采用分布式

步骤:

1、关闭防火墙

2、在所要运行jmeter并作为负载生成器的机器上安装jmeter(确保在所有系统中使用了相同版本号的Jmeter和jdk)

PS:目标服务器需要在相同网段,确保Jmeter可以访问目标服务器

3、确定其中一台机器作为主controller,其他的机器作为agent,然后运行所有agent机器上的jmeter-server文件

4、在controller机器的jmeter中bin目录下,找到jmeter.properties文件,添加节点IP,修改localhost为压力机IP

5、启动conttoller机子上的jmeter应用,选择菜单【运行】---远程启动来分别启动agent,也可以直接选择【远程全部启动】来将所有个agent启动

在性能测试过程中,我们通常需要将测试结果保存在一个文件当中,既可以保存测试结果,也可以为日后的性能测试报告提供更多的素材

Jmeter中,结果都存放在.jtl文件,一般以csv文件格式记录,只需要选择某个监听器,点击页面的configure按钮,建议勾选如下项:Save Field Name,Save Assertion Failure Message

技术点:HTTP相关设置+参数化+断言+关联+简单控制器+查看结果树

关联:通过Json控件或正则表达式获取

(1)线程组建议替换为jp@gc - Stepping Thread Group,功能比线程组多很多

(2)可以加事务控制器

(3)查看结果树替换为聚合报告或类似的报告,如果还是想看查看结果树记得勾选仅日志错误(查看结果树打印的日志比较多,会影响性能)

(4)造数据

总结:

一个子系统建议放在同一个 “测试计划”中,流程测试可以通过“线程组”来区分,这样也便于设定不同的测试数据个数。

比较独立的接口,可以统一放在一个线程组内,顺序完成测试。

流程性接口的测试:如果要测试的接口可以组成一个流程,只需要顺序添加多个“HTTP 请求”的Sampler,各请求之间可以提取需要在上下文传递的数据作为参数,以保证流程中数据的一致性


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/340387.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存