上海泽众软件公司简介

● 上海泽众软件科技有限公司成立于2003年10月，公司的宗旨是通过向软件开发企业提供最优质的测试工具软件。测试解决方案和测试咨询服务，帮助国内用户提高软件的品质。我们一直致力于软件测试工具领域的探索。于2004年推出了终端自动测试引擎（Terminal AutoRunner，简称TAR）在2005年，推出了第一个测试管理工具TestCenter，TestCenter与TAR一起构成了泽众软件自动化测试解决方案。在2006年推出了自动功能测试工具：AutoRunner，在2012年推出了自动性能测试工具：PerformanceRunner。AutoRunner、PerformanceRunner与TestCenter构成了泽众软件的另外一个完整的自动化测试解决方案。经过不懈的努力，PerformanceRunner自动测试引擎、TestCenter得到了用户的认可和应用，表现出强大的生命力。PerformanceRunner测试工具、TestCenter测试管理工具已经成为测试工具软件市场的重要选择。

上海泽众软件

http://www.spasvo.com/


产品简介

自动测试简介

自动测试过程就是通过模拟人工操作，完成对被测试系统的输入，并且对输出进行检验的过程。自动测试是由软件代替人工操作，对被测试系统的 发出指令，模拟操作，完成自动测试过程。

● 测试脚本

自动测试，就是使用一个程序来测试另一个程序（被测试的应用系统）功能的正确性。如果用来测试的程序本身非常复杂，也需要被测试，或者编写困难，那么自动测试就失去了意义。因此，用来测试另外一个程序的程序往往是非常简单的，我们把这个程序称为“测试脚本”。 测试脚本通常在测试工具的 IDE 里执行，并且获得 IDE 的支持。

● 自动记录

当我们编写测试脚本的时候，往往发现编写脚本本身是很困难的：了解脚本的语法、了解测试过程、把测试过程转换成为测试脚本语句。自动记录，就是通过记录一个操作过程来自动获得测试脚本的过程。通过自动记录，我们就能够得到一个完善的脚本，通过修改这个脚本，我们得到更通用的测试脚本。

● 虚拟用户

虚拟用户通过在应用程序中执行典型业务流程来模拟真实用户的操作。虚拟用户在录制会话期间执行的操作将在虚拟用户脚本中描述。PerformanceRunner的生成器用于创建虚拟用户脚本。通过录制在客户端应用程序上执行典型业务流程的用户，可以用生成器开发虚拟用户脚本。生成器录制在录制会话期间执行的操作，仅录制客户端和服务器之间的活动。生成器将自动生成精确建模并模拟实际情况的函数，而无需手动编写应用程序对服务器的API函数调用。录制期间，生成器将监控客户端的有效操作，并跟踪用户发送到服务器以及从服务器接收的所有请求。回放期间，虚拟用户脚本通过执行对服务器 API 的调用，直接与服务器通信。当虚拟用户直接与服务器通信时，客户端接口不需要系统资源。这样，可以在一个工作站上同时运行大量虚拟用户，进而可以仅使用几台测试计算机来模拟较重的服务器负载。

● 检查点

测试的目的是检查数据是否正确。在测试的过程中，我们需要检查某次请求的响应数据是否符合预期。这个检查的位置和条件，我们称为检查点。在PerformanceRunner中，使用check（“objectname”， “property”， “期望值”）来作为检查点的脚本语句，它检查对象objectname的属性property是否和期望值一致。可以使用检查点来检 验响应数据的各个部分，如header字段的各项属性，body字段的内容。

● 循环参数表与数据驱动

测试脚本是针对一个测试过程的。一个测试过程往往需要众多的数据来测试。通过自动录制得到的脚本，所有的输入数据都是常数，是固定的。如果需要使用一个测试脚本测试多组数据，就需要对脚本进行参数化，把固定的常数修改为来自数据源变量。 这个过程我们称为参数化。 采用了参数化的脚本，我们称为数据驱动的模式。使用 PerformanceRunner完成自动测试 : 通过录制的方式自动生成测试脚本，不需要用户通过编写测试脚本来创建；通过检查点向导来创建检查点，只面向业务，不需要手工修改脚本；自动的参数化和数据驱动支持，一步到位的创建数据驱动脚本；

● 集合点

集合点用以同步虚拟用户以便恰好在同一时刻执行任务。在测试计划中，可能会要求系统能够承受100 人同时登录，在PerformanceRunner中可以通过在登录操作前面加入集合点，这样当虚拟用户运行到登录的集合点时，PerformanceRunner就会检查同时有多少用户运行到集合点，如果不到100 人，PerformanceRunner就会命令已经到集合点的用户在此等待，当在集合点等待的用户达到100 人时，PerformanceRunner命令100 人同时去登录，从而达到测试计划中的需求。

● 思考时间

从业务系统的角度来说，这个时间指的是用户在惊醒操作时、每个请求之间的时间间隔、从自动化测试的角度来说、要真实的测试模拟用户操作、就必须在测试脚本中让各个操作之间等待一段时间、体现在脚本上就是在操作之间放置一个http_thinkTime的函数，体现为脚本中两个请求语句之间的间隔时间。

PerformanceRunner性能测试工具简介

● PerformanceRunner是一款自动化压力测试工具，通过加载不同的测试组件，实现面向不同协议的测试，通过模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标，找出性能方面的问题，发现性能瓶颈，优化设计。

● PerformanceRunner自动测试工具适用于常规压力测试、极限压力测试、负载测试、可靠性测试等，可以提高测试效率，降低测试人工成本，帮助用户找被测对象的缺陷，特别是对于一些通过手工测试很难发现的缺陷。

PerformanceRunner可以进行

● 基于HTTP协议的性能测试，一般为B/S架构的Web程序。

● 基于SOKCET协议的性能测试，一般为C/S架构的桌面程序。

PerformanceRunner特点

● 使用BeanShell语言作为脚本语言，使脚本更少，更易于理解。BeanShell语法自身也兼容Java语法。

● 采用关键字提醒、关键字高亮的技术，提高脚本编写的效率。

● 提供了强大的脚本编辑功能。

● 具有优秀的录制功能，能够一次录制非常完善的脚本和资源，降低了测试人员修改脚本的工作量。对于不熟悉编程的测试人员来说，是非常有价值的。

● 支持各种需求的校验。包括对如header字段的各项属性，服务器返回的内容、数据库、Excel表格、正则表达式等的校验。

● 支持参数化，同时支持数据驱动的参数化。

● 支持测试过程的错误提示功能。

● 丰富的命令函数，有利于测试人员进行各种功能测试，熟练掌握这些命令函数，能够让测试人员编写出更简练、更高效的测试脚本。

上海泽众软件科技有限公司

www.spasvo.com

021-61079698


系统要求

在安装本软件之前请确认系统配置符合以下条件：

● 操作系统要求：Windows(32位/64位) 2000/xp/vista/2003/7/2008;

● IE浏览器要求：IE6、IE7、IE8、IE9;

● 内存要求：不少于128M;

● 磁盘空间要求：不少于150M剩余磁盘空间；


服务支持

● PerformanceRunner产品通过在线MSN、电话、电子邮件为您提供支持与服务，也可访问我们的网站 http://www.spasvo.com/。为保证服务质量，确保有效地解决用户的问题，保障用户的项目实施进度，技术支持仅向授权用户和授权试用用户提供。请您在联系泽众技术支持时，告知您的单位名称和服务代码。

技术支持

● 电话：021-61079698 分机号：8029,8035

● 电子邮件：luyf@spasvo.com

● 产品服务：有关培训、产品购买及试用授权方法的问题，请与销售代表联系，或联系泽众咨询热线：

● 电话：021-61079698

● 电子邮件： sales@spasvo.com


● 进入本公司网站www.spasvo.com注册账户。

● 进入本公司网站 www.spasvo.com 注册账户。

● 注册之后登录即可下载PerformanceRunner。

● 双击安装图标，按照提示安装完成，在安装的过程中有杀毒软件出现拦截提示时选择放行。

● PerformanceRunner的试用期为15天，如果想长期使用需要申请license,申请license的过程： 打开软件，点击菜单【许可证】->【申请许可证】，按工具提示进行申请。

● 将生成的req文件发给公司技术支持或上传到公司网站上，我们会通过用户注册时的邮箱将license 发送至您邮箱。

● 收到license文件后在软件中点击菜单【许可证】->【导入许可证】即可。


用户界面-生成器

测试或监控环境时，需要在系统中模拟用户的真实行为。PerformanceRunner测试工具模拟多个用户在系统中同时工作或访问系统的环境。为了进行这种模拟，用虚拟用户（即 Vuser）代替现实生活中的人。Vuser执行的操作在 Vuser 脚本中进行描述。用于创建 Vuser 脚本的主要工具是脚本生成器。生成器不仅录制 Vuser 脚本，它还运行 Vuser 脚本。使用生成器运行脚本有助于进行调试。使用生成器可模拟Vuser 脚本在大型测试中的运行情况。录制 Vuser 脚本时， 生成器会生成多个函数，用以定义录制会话期间所执行的操作。生成器将这些函数插入到脚本编辑器中以创建基本 Vuser脚本。

一、菜单栏:

PerformanceRunner中的菜单栏如上图所示，主菜单包含文件、编辑、录制、执行、设置、许可证、数据库配置、帮助等菜单项，下面对每一项做一个简介。

● 文件菜单

如上所示，所有对脚本的管理操作都可以在文件菜单下完成，包括对脚本的新建，导入，保存，另存为，关闭，改变工作空间，最近打开，退出等等。

● 编辑菜单

如上所示，所有对脚本的编辑操作都可以在编辑菜单下完成，包括对脚本的撤销，重做，查找，替换，剪切，复制，粘贴，循环参数表，对象库，以及对各种需求的校验。

● 录制菜单

如上图所示，录制菜单比较简单，只有一个“开始录制”菜单项，用来启动脚本录制功能。

● 执行菜单

如上图所示，执行菜单包含三个菜单项，“开始执行”启动回放脚本功能，在回放过程中如果时间比较长或是遇到问题需要提前关闭回放，可以点击“停止执行”以提前终止。点击“关联”则PerformanceRunner自动为脚本进行关联。

● 设置菜单

如上图所示，设置菜单中包含了语言设置、字号及网络许可模式等的设置，软件现在支持简体中文、台湾繁体和英文，在程序初次启动时，会根据系统默认语言选择初始语言类型和字号，当用户手动选择语言类别和字号时，软件再次启动才会生效。网络许可模式则可以使用户仅申请一个lic（许可证），通过License Server实现在多台电脑上使用多个PerformanceRunner。

● 许可证菜单

如上图所示，许可证菜单是PerformanceRunner新增的菜单，方便用户在软件中完成许可证的生成和导入工作，由于免费的许可证试用期为15天，当试用期过后再次使用软件后会提示LIC过期的提示，此时可以点击“申请许可证”菜单项，根据需要产生req文件，获得我公司为您配置的LIC文件后，可以

点击“导入许可证”菜单项将其导入即可

● 帮助菜单

如上图所示，帮助菜单为您提供软件使用帮助和公司产品介绍。

二、工具栏:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

● 如上图所示，工具栏共有19个按钮，下面简单介绍其功能。

按钮1：新建脚本，和【文件】→【新建】→【脚本】 菜单功能一样；

按钮2：保存改动脚本（快捷键Ctrl+S），和【文件】→【保存】菜单功能一样；

按钮3：录制脚本，和【录制】→【开始录制】菜单功能一样；

按钮4：回放脚本，和【执行】→【开始执行】菜单功能一样；

按钮5：停止回放脚本，和【执行】→【停止执行】菜单功能一样；

按钮6：脚本关联，和【执行】→【关联】菜单功能一样；

按钮7：脚本编辑时用以撤销（快捷键Ctrl+Z），和【编辑】→【撤销】菜单功能一样；

按钮8：脚本编辑时用以重做（快捷键Ctrl+Y），和【编辑】→【重做】菜单功能一样；

按钮9：脚本编辑时用以查找替换（快捷键Ctrl+F），和【编辑】→【查找/替换】菜单功能一样；

按钮10：脚本编辑时用以查找下一匹配点（快捷键F3），和【编辑】→【查找下一个】菜单功能一样；

按钮11：代码补全，和【编辑】→【补全代码 Alt-/】菜单功能一样；

按钮12：脚本调用，和【编辑】→【调用脚本】菜单功能一样；

按钮13：校验数据库，和【编辑】→【校验数据库】菜单功能一样；

按钮14：校验文件文本，和【编辑】→【校验文件文本】菜单功能一样；

按钮15：校验Excel文件，和【编辑】→【校验Excel文件】菜单功能一样；

按钮16：校验正则表达式，和【编辑】→【校验正则表达式】菜单功能一样；

按钮17：循环参数表，和【编辑】→【循环参数表】菜单功能一样；

按钮18：打印到输出，和【编辑】→【打印到输出】菜单功能一样；

按钮19：脚本对象库信息，和【编辑】→【对象库】菜单功能一样；

三、工作区:

● 项目管理区：创建项目，创建测试用例，进行项目浏览，切换对象浏览，在PerformanceRunner中位于垂直拆分条的左边；脚本编辑区：对测试脚本编辑，在PerformanceRunner中位于水平拆分条的上部；结果输出及参数表编辑：测试脚本标准输出，查看测试信息，编辑参数表，在PerformanceRunner中位于水平拆分条的下部。

● 【项目管理器】

项目管理器用来显示当前 IDE 中所有的项目，并且显示项目中的脚本。

项目管理器中的项目及脚本组织成一个树状结构，每一个项目名称是一个文件夹，其下的脚本都位于此文件夹下。

对于每一个节点，如果是项目名称，双击可以打开；如果是脚本，则双击可以把这个脚本在编辑器中打开。

树支持鼠标右键菜单，支持删除、增加等操作。

● 【脚本编辑器】

双击项目管理器中要编辑的脚本可打开脚本编辑器。

编辑器可实现关键字着色，支持多行注释（/**/）及单行注释符（//），支持脚本命令自动补全（快捷键Alt+/）。

如果脚本已被编辑过但还没有保存，在脚本表单中相应的脚本名称后会有一个星号提示符，提示你保存脚本，点击工具栏的保存按钮或是快捷键Ctrl+S保存后星号消失。

在编辑器中右击鼠标可以弹出如下快捷菜单，包含了一些常用的快捷操作菜单项：

● 【运行时刻的错误和输出】

在脚本执行时候显示错误和输出，可以显示脚本中所要求打印输出的语句，可以显示校验结果。

若运行报错，则会显示脚本中的报错语句，方便用户找出不能正确执行原因。

● 【数据参数表】

参数表用在参数化脚本过程中，可以用参数表工具栏对参数表进行各种编辑，编辑后的数据以xls文件形式被保存，每一列是一次循环。

● 【参数表工具栏】

参数表工具栏用来编辑参数表，如上图所示，每一个按钮功能如下：

1、在表头插入一列数据；

2、在表尾插入一列数据；

3、删除表头的一列数据；

4、删除表尾的一列数据；

5、在表头插入一行数据；

6、在表尾插入一行数据；

7、删除表头的一行数据；

8、删除表尾的一行数据；

9、将所有的行按名称的升序排列

10、将所有的行按名称的降序排列

11、从脚本对应的xls表中重新载入数据（参数表数据都被保存在与脚本同级同名的xls表中）；

● 【对象库】

对象库中保存了所有请求和响应的详细信息数据，不同协议的信息都不完全相同，在回放时就是根据这些属性数据来模拟真实的数据发送，让服务器响应相应的动作，并让服务器产生压力。对于http协议来说请求数据格式如下。

左边每一项代表一条url链接，右边分别代表此链接请求时的发送数据和返回的响应数据。

SOCKET协议请求数据格式如下：


用户界面-执行器

要使用 PerformanceRunner 测试您的系统，必须创建负载测试场景。场景定义每次测试期间发生的事件。场景定义并控制要模拟的用户数、这些用户执行的操作以及用于运行模拟场景的计算机。执行器负责设计场景、运行场景、控制场景、各种波形图生成等。执行器分为设计部分和运行部分两块，以及IP欺骗设置与监控远程服务器设置每一块的基本介绍如下：

一、 设计场景:

首先我们需要创建一个场景：

点击【文件】-【新建】创建场景

输入场景名称，点击【确定】完成创建

场景设计视图中包含了两个部分，分别是场景组和场景计划

场景组：在这里管理所有创建好的项目场景，可以添加新项目的场景到场景组，也可以从场景组中删除已有场景。当选中某一场景后（名称前被勾选），场景计划会有相应的变化，以显示当前场景的相关信息。具体操作如下：

添加项目：

点击添加项目按钮，弹出添加项目

选择项目

也可同时选择多个项目进行添加：

添加了多个项目

删除项目：

选择项目后，点击“删除项目”按钮即可删除项目

同样也可以一次删除多个项目：

按住“ctrl”键选择多个项目，点击“删除项目”按钮，其余步骤和删除单个项目一样

场景计划

在这里管理单个场景的运行模式。双击一个选项可以打开该选项的设计窗口。

启动组：设定了场景何时启动，可以选择立即启动，也可以选择在等待一段时间后再启动，或者是在运行完某一个项目后启动（用在执行多项目的时候）。

启动虚拟用户：该项设定了所有虚拟用户的启动方式，可以选择所有虚拟用户同时启动，也可以选择每个指定时间内启动指定数目的虚拟用户。

虚拟用户数目会直接影响到压力的大小。在一般情况下，采用递增虚拟用户的方式来寻找系统能够承受的合理压力。比如，预估总虚拟用户数为20个，可以设置初始为2个， 每5分钟增加1或2个用户。界面可以配置虚拟用户启动方式，可以选择一次性全部启动或者按照某一个时间间隔启动指定个虚拟用户方式启动。

持续时间：该项设定了所有虚拟用户在启动之后运行的时间，可以选择执行完测试脚本后立即停止，也可选择持续运行一段时间后停止。

停止虚拟用户：该项设定了所有虚拟用户的停止方式，可以选择所有虚拟用户同时停止，也可以选择每个指定时间内停止指定数目的虚拟用户。

场景计划图

以视图的形式显示出当前场景的设置信息。当场景设置信息发生改动时，场景视图也会相应的发生更改。

二、运行场景：

设计场景完成后，即可点击【运行】标签，进入场景运行界面，如下图所示：

场景运行界面分为五个部分，主要包括项目显示区、事务统计区、图表树、性能报表图、性能数据统计分析。

项目显示区：

在这里会显示场景中包含的项目。

事务统计区：

这里主要是对事务做一个统计。

运行虚拟用户：这一栏显示场景执行的每一个时刻运行的实时虚拟用户数目；

运行时间：这一栏显示场景从开始执行到现在持续了多长时间；

每秒点击数：这一栏显示场景执行的当前一秒内的请求数，请求数越大，对服务器造成的压力也就越大；

通过事务数：这一栏显示场景执行到现在通过的总事务数，事务数越大说明服务器适时响应性越好；

失败事务数：这一栏显示场景执行到现在失败的总事务数，事务数越大说明服务器出现了性能问题越严重；

图表树：

图表树显示出当前支持的所有性能图表数目，主要分为四个大类：VUser图、事务图、web资源图和被测系统性能监控图，在每一个图表名称上双击可以在性能报表区域显示出波形图表。

VUser图中包含有：正在运行的VUser图:记录了场景执行期间运行用户、完成用户的曲线图；

事务图中包含有：事务响应时间图、每秒通过事务数图、每秒失败事务数图、每秒事务总数图；

web资源图包含有：每秒点击量图、吞吐量图、每秒下载页面图。

被测系统性能监控图中包含有：CPU利用率、物理内存使用记录、网络流量

性能报表：

这里是每一个性能指标的报表显示区域，每一个报表的横坐标代表执行时间，纵坐标的含义与报表相关，不同报表代表不同的含义。报表在场景执行期间动态变化，以适时的描述服务器性能的变化情况。

双击某个报表可以将其放大，以填充整个绘图区域，其他的图表会被隐藏，再次双击报表即可还原。

性能数据统计：

这里显示的是当前选中图表中各条曲线的统计数据，比如最小值、最大值、平均值、标准差等。


用户界面-分析器

分析图可以帮助您确定系统性能并提供有关事务及 Vuser 的信息。通过合并多个负载测试场景的结果或将多个图合并为一个图，可以比较多个图。图数据和原始数据视图以电子表格的格式显示用于生成图的实际数据。可以将这些数据复制到外部电子表格应用程序做进一步处理。使用报告功能可以查看每个图的概要。报告自动以图形或表格的形式概括和显示测试的重要数据。可以根据可自定义的报告模板生成报告。

分析器中主要包含如下几个图表：

1、运行的VUser图，横轴代表时间，纵轴代表虚拟用户数。

2、事务概要图，横轴代表不同的事务，纵轴代表各个事务执行成功和失败的次数（绿色代表成功，红色代表失败）。

3、事务响应时间图，横轴代表时间，纵轴代表各个事务执行所耗费的时间（单位秒）

4、每秒事务图，横轴代表时间，纵轴代表各个事务每秒通过的次数

5、每秒事务总数图，横轴代表时间，纵轴代表每秒通过的事务总数（包括失败事务和通过事务）

6、事务性能概要图，横轴代表事务，纵轴代表各个事务的各项性能参数值（最大值、最小值、平均值）

7、每秒点击量图，横轴代表时间，纵轴代表每秒执行的请求数

8、吞吐量（字节）图，横轴代表时间，纵轴代表每秒服务器发送的字节数

9、吞吐量（兆）图，横轴代表时间，纵轴代表每秒服务器发送的兆字节数

10、CPU使用率：横轴代表时间，纵轴代表CPU使用率

11、物理内存使用：横轴代表时间，纵轴代表内存使用情况

12、网络流量：横轴代表时间，纵轴代表网络流量


项目操作与脚本操作

项目与脚本操作

项目操作

● 新建项目、导入项目

方式一：

方式二：在项目管理器空白区域点击鼠标右键，在弹出的菜单中选中新建/导入项目

● 排除项目、删除项目、重命名项目

方法：选中一个项目，鼠标放在项目上点击右键，弹出菜单

脚本操作

● 新建脚本、导入脚本

首先需要选择一个项目，才可以新建、导入脚本

新建、导入脚本

方式一：

方式二： 选中一个项目，在项目上点击鼠标右键，在弹出的菜单中选中新建/导入脚本

● 排除脚本、删除脚本、重命名脚本

注意事项：

1、Action.bhs、Init.bhs、Uninit.bhs三个脚本不能进行删除、排除和重命名操作，新增的脚本也不能与这三个脚本名称相同。

2、排除的脚本没有被彻底删除，只是移除了项目管理器，可以通过在项目节点上右击选择【导入脚本】将其再次导入进项目中。

3、删除的脚本会被永久的从磁盘中删掉，不可再导入工程。

方法：选中脚本，鼠标放在脚本上点击右键

改变工作空间

● 在项目管理器中的所有项目及脚本都在同一个工作空间，如果想打开不在此工作空间的其他项目或脚本，可以通过切换工作空间来实现。操作方式：【文件】→【改变工作空间…】，见下图。

注意：在切换工作空间时，会清空当前项目管理器中的所有项目，然后才会加载新的工作空间的项目和脚本，不同工作空间中的脚本不会出现在同一项目管理器中；在第一次使用PerformanceRunner时会提示设定一个工作目录，如下图，默认是“我的文档”。

选好工作空间之后，如果以后要更改工作空间，必须重新启动PR，才能生效。


录制脚本

HTTP协议脚本录制

以录制打开百度网页为例，详细的介绍一下录制HTTP协议脚本的过程。

● 创建脚本

根据前面的【项目与脚本操作】一节所述方法创建一个名为baidu.bsh的脚本（脚本名可任取），双击脚本打开。

● 录制脚本

点击菜单【录制】→【开始录制】，或者是直接点击工具栏上的录制按钮 [image] ，会弹出 如下图所示的录制对话框。

第一项要求选择录制协议，可以在下拉框中选取，这里选择Http；

第二项要求填写录制程序，由于是HTTP协议，此处应该填写IE浏览器的路径；

第三项要求填写输入参数，由于是HTTP协议，此处填写待录制的网页（此参数可不填，默认是打开空白页）；

第四项要求填写程序的进程名称，由于是HTTP协议，此处应该填写IE浏览器的进程名称（此参数可不填，默认是所选择程序的进程名称）；

第五项要求填写工作路径，由于是HTTP协议，此处应该填写IE浏览器所在文件夹路径（此参数可不填，默认为可执行程序所在文件夹路径）；

第六项要求选择是否启动即录制脚本，如果没有勾选，浏览器打开将不记录脚本。

第七项要求选择是否全新录制，如果勾选，录制时新脚本会覆盖掉先前脚本。

配置好后点击确定，软件将进入录制阶段，此阶段里软件界面会被隐藏，并在屏幕的右下角显示一个录制信息窗口，显示出当前的录制相关信息。

● 暂停与继续录制

录制中有时需要暂停录制进行其他操作，点击 [image] 按钮暂停录制，此时进行操作不会录制脚本；点击 [image] 按钮可结束暂停继续录制，此时操作会录制脚本。

● 停止录制

录制完成后，点击面板左上角的停止按钮 [image] ，结束录制，此时在脚本里我们会看到录制的脚本，同时在对象库中我们能看到每条链接的请求和响应数据（点击工具栏的最后一个按钮打开对象库面板）。

录制完的脚本

● 对象库

● 生成文件

在录制好脚本后，在项目目录下会存在如下几个文件。

三个bsh脚本文件及三个对应的xls参数化文件。脚本文件用来保存脚本，其中自动录制的脚本会放入Action.bsh中另外两个脚本文件中放置的是初始化代码和结束时的各种资源清理代码，这些代码由用户在需要时手工添加，默认时文件中没有脚本；参数化文件用来保存参数化数据，默认时文件中没有数据，上面的文件都可以在软件中修改，不建议在软件外编辑。

Record文件夹中保存了录制时的请求响应数据，data文件中包含了请求和响应的header数据，requ文件中包含了请求的body数据，resp文件中包含了响应的body数据，repository文件中包含了文件序号和url链接的对应关系。

SOCKET协议录制

● SOCKET协议脚本录制和HTTP协议录制类似，同样以录制打开百度网页为例，SOCKET协议录制的脚本如下。

● 对象库

● 生成文件

生成文件和HTTP协议类似，只是在Record文件夹中保存的文件有所不同，如下图所示：

Record文件夹中保存了录制时发送和接收缓冲区的具体数据。不可见的二进制数值将进行转换，以文本方式显示出来。

repository文件中包含了缓冲区和录制序号的对应关系。


回放脚本

回放脚本的过程，实质是对先前的录入动作的一次重复操作，只是这个过程是根据录入的脚本自动完成的。对于回放来说，不管是回放HTTP协议脚本还是SOCKET协议脚本都基本相同。下面就以已完成录制的基于HTTP协议的脚本为例，介绍一下回放操作及注意事项。

● 回放

已录制完的脚本代码如下：

执行回放操作

执行回放操作有两种方法：

点击菜单【执行】→【开始执行】

或者点击工具栏的回放按钮

此时软件进入回放阶段，界面会被隐藏，回放的结果会在输出窗口中显示

回放成功：

如果回放失败，在输出窗口中会显示回放失败原因：

将脚本中的gs.gif的名字修改为gs1.gif，回放后会有如下信息输出，提示回放http_getVerb gs1.gif动作时，gs1.gif对象在对象库中没有发现。

● 注意事项

1、如果回放的脚本被手工修改过一定要及时保存，否则修改过或是被注释掉的动作在回放时会得不到体现。

2、对于HTTP协议，在回放之前要先做关联。方法是点击【执行】菜单中的【关联】菜单项

或是直接点击工具栏上的关联图标进行关联。

关联可能要进行多次，当提示关联结束时，才可以回放脚本，否则有可能导致回放失败。

3、对于SOCKET协议，在回放之前如果要进行关联的话，应手工建立关联，再进行回放。


设计场景

要使用 PerformanceRunner 测试您的系统，必须创建负载测试场景。场景定义每次测试期间发生的事件。场景定义并控制要模拟的用户数、这些用户执行的操作以及用于运行模拟场景的计算机。当脚本创建好后，需要创建测试场景，一个运行场景包括一个运行虚拟用户的机器列表，一个测试脚本的列表，及大量的虚拟用户，然后利用PerformanceRunner的执行器来组织测试方案。

● 场景组管理

如上图所示，一个场景中可能包含多个项目，场景组负责各个项目的管理。当选择某一个项目时（组名被勾选），在场景计划中会显示当前组的运行方式，在场景计划图中会 以图表的方式显示场景在执行期间虚拟用户的数目，当点击按钮删除时，可以将选中项目删除。可以点击添加项目按钮，将不在场景组中的项目添加进来。

● 场景计划

场景计划设计场景的项目启动顺序、启动方式、运行方式、停止方式等。

项目启动顺序可以选择三种方式，场景启动后立即执行；在规定的时间后启动；在场景中某一个项目后启动。后两种方式一般应用在场景中包含多个项目的情况下使用，当场景中只有一个项目时，一般选择立即启动，此项默认为立即启动。

虚拟用户数目会直接影响到压力的大小。在一般情况下，采用递增虚拟用户的方式来寻找系统能够承受的合理压力。比如，预估总虚拟用户数为20个，可以设置初始为2个， 每5分钟增加1或2个用户。界面可以配置虚拟用户启动方式，可以选择一次性全部启动或者按照某一个时间间隔启动指定个虚拟用户方式启动。


IP地址欺骗设置与监控远程服务器

1 IP地址欺骗设置与监控远程服务器

1.1 什么是IP地址欺骗？

按照Internet Protocal(IP)网络互联协议，数据包头包含来源地和目的地信息。 而IP地址 欺骗，就是通过伪造数据包包头，使显示的信息源不是实际的来源，就像这个数据包是从另一台计算机上发送的。

实际使用中，使用机器a上网，然后借用机器b的IP地址，以此实现IP地址欺骗，从而冒充机器b与服务器打交道。

1.2 如何使用IP地址欺骗

1.2.1 启用IP地址欺骗

点击【IP欺骗设置】→【启用IP欺骗】

待“启用IP欺骗”前面被勾选，启用成功

1.3 IP欺骗地址设置

点击【IP设置】

弹出【本地IP设置】窗口。选择本地IP，然后点击下一步

点击【添加】进入【添加】窗口

IP添加设计窗口

选择IP类型，输入起始IP，子网掩码，选择是否启用IP冲突检查，选择IP添加数量，点击【确定】结束设计，【添加】窗口关闭

IP开始添加：

完成IP添加，点击【确定】关闭窗口

打开windows cmd.exe，输入“ipconfig”命令，可以查看到新添加的ip信息

至此，ip欺骗配置结束

1.4 IP地址欺骗使用状况

完成IP欺骗设置后，在pr运行界面，加入项目，点击“开始”按钮，执行场景。

在场景执行时，打开windows cmd.exe，输入“netstat -n”，可以查看到虚拟ip的访问情况


监控远程服务器

1 监控被测系统前提条件：

1.1 .必须知道被测系统所在服务器的IP地址、用户名和密码，被测系统必须为windows系统，如果被测系统为win7，必须使用管理员身份运行。

1.2 需要开启必须的服务：

启动windows任务管理器，点击【服务】标签

点击【服务】查看所有服务

找到下面这些服务，如果服务没启动，将鼠标放在对应服务上，点击右键，选择【启动】启动服务

Remote Access Auto Connection Manager

Remote Access Connetion Manager

Remote Procedure Call(RPC)

Remote Procedure Call(RPC)Locator

Remote Registry

Server

2 监控设置

在执行器菜单中选择监控远程服务器按钮

弹出被测系统的设置页面

在界面输入要测试的系统的IP地址，用户名和密码，点击确定，再开始运行行场景，在执行器的图表中即可看到所监控的被测系统的cpu利用率，物理内存使用情况和网络流量。

场景运行结束后点击退出按钮退出监控。


● 函数调用

在一个脚本中调用函数方法如下图所示：

二、在两个脚本中调用函数的方法如下图所示（示例中b脚本中的自定义函数被a脚本调用）：

三、调用jar包中函数的方法如下图所示：


在进行脚本串联调用时，可能某些数据要在不同脚本之间共享，也就是参数传递。参数传递命令为getFrom、putInto，这两条命令都是ParameterData类成员函数。

参数传递

在进行脚本串联调用时，可能某些数据要在不同脚本之间共享，也就是参数传递。参数传递命令为 getFrom、putInto，这两条命令都是ParameterData类成员函数。

● 一般性的参数传递

下面是一段a.bsh中的脚本，用putInto命令把””+b保存到名为param的变量用，变量名可以任取，其中parameterData是一个ParameterData类型的全局变量。接着是调用b.bsh脚本。

b.bsh脚本比较简单，从parameterData中把param的结果取出并打印出来，这里调用的是getFrom命令。

下面是执行脚本的运行结果：

● 参数化脚本中的参数传递

下面是一段参数化脚本：

循环参数表执行一个登陆操作，第3句，这一句把临时变量pd保存在了pr.parameterData参数中，因为在test中还会用到pd参数。第12句调用test.bsh 打印参数结果。

下面是test.bsh脚本代码：

i

这段脚本用ar.parameterData.getFrom("变量名")直接获取xls表中的数据，因为在Action脚本中ar.parameterData参数已经被赋值了。运行Action脚本结果如下：


● 参数表编辑

在循环参数表之前首先要进行参数表编辑，参数表如下图所示：

第一栏是工具栏，主要是对参数表的行列进行增加删除操作、排序操作等等。以下是具体作用：

1 2 3 4 5 6 7 8 9 10 11

按钮1： 插入第一列

按钮2： 插入最后一列

按钮3： 删除第一列

按钮4： 删除最后一列

按钮5： 插入第一行

按钮6： 插入最后一行

按钮7： 删除第一行

按钮8： 删除最后一行

按钮9： 升序排列

按钮10：降序排列

按钮11：重新载入，从关联的xls文件中重新载入数据

当编辑了参数表中的某个单元格时左上角会有一个 * 标记，提示保存修改，点击菜单栏中的【文件】→【保存】或按下Ctrl+S快捷键可以保存修改，并且星号消失。

参数表“名称”这一栏可以是有意义的任何名字，它用于 getFrom、putInto 等命令函数的第一个参数。

在每一个单元格中双击可以对单元格进行编辑，在每一个单元格中鼠标右击可以复制单元格内容。


校验点

当前版本支持对数据库校验、文件文本校验、Excel文件校验、正则表达式校验等，插入校验命令有如下三种方式：

1、通过【编辑】菜单添加；

2、在脚本编辑器中右击添加；

3、通过工具栏添加。

所有校验命令的返回值都是一个布尔值，如果实际值和期望值相等匹配，返回结果为true，否则返回false。

● 校验数据库

校验数据库的脚本命令为 checkDatabase 命令，校验数据库对话框如下图所示：

第一栏中列举出了当前支持的数据库类型，在这里选择校验的数据库类型；

第二栏输入数据库地址、端口号、数据库名称，格式如上图所示；

第三栏输入数据库登录用户名；

第四栏输入数据库登录密码；

第五栏输入数据库查询语句；

第六栏中填入期望值。

点击确定后，在脚本编辑器中光标位置处会自动添加如下一行脚本。

回放完成后会有如下信息输出。

● 校验文件文本

校验文件文本的脚本命令为 checkFileText 命令，校验文件文本对话框如下图所示：

第一栏中列举出了常用文件的编码格式，在这里选择文件的编码格式；

第二栏中填入文件的全路径；

第三栏中填入待校验文本在文件中的行号；

第四栏中填入待校验文本在文件中的列号；

第五栏中填入期望值；

点击确定后，在脚本编辑器中光标位置处会自动添加如下一行脚本。

回放完成后会有如下信息输出。

● 校验Excel文件

校验Excel文件的脚本命令为 checkExcelCell 命令，校验Excel文件对话框如下图所示：

第一栏填入Excel文件全路径；

第二栏中填入单元格坐标；

第三栏中填入期望值；

点击确定后，在脚本编辑器中光标位置处会自动添加如下一行脚本。

回放完成后会有如下信息输出。

● 校验正则表达式

校验正则表达式的脚本命令为 checkRegex 命令，校验正则表达式对话框如下图所示：

此正则表达式校验的是电话号码

第一栏中填入待校验文本；

第二栏中填入正则表达式；

点击确定后，在脚本编辑器中光标位置处会自动添加如下一行脚本。

回放完成后会有如下信息输出。


● 脚本的串联

● 脚本的调用

脚本的调用支持不同脚本文件之间的相互调用。callScript 命令为脚本调用命令。

下面就举例介绍一下调用脚本的使用：

编写或录制两个脚本（名称分别为A.bsh、B.bsh）。

A.bsh的内容：

B.bsh的内容：

如果想在运行A.bsh脚本时调用B.bsh脚本，则在A.bsh的最后添加pr.callScript("b.bsh")：

运行结果：

注：

A、脚本调用现只能在同一项目下的脚本之间，不支持跨项目调用脚本。

B、两个脚本可以是对同一个窗口进行，也可以操作不同的窗口。

C、脚本之间不能互相调用，比如在a脚本中调用了b，那么在b脚本中可以再调用c脚本，而绝不能调用a脚本，否则会使回放进入死循环，注意在脚本调用当中不能形成调用环。


● 脚本参数化

一条普通脚本只能执行某个特定的动作，将脚本参数化后则可以执行不同的功能。脚本参数化之前，必需要编辑好参数表，具体编辑方法请查看参数表编辑一节。

下面是一段简单的参数表数据。

接下来是增加参数化脚本循环体。

首先打开【循环参数表】窗口。可以通过以下种方法实现:

A.点击菜单【编辑】→【循环参数表】

B.直接点击工具栏的循环参数表按钮

C.脚本编辑器中右击，选择【循环参数表】

通过以上操作，会弹出【循环参数表】窗口

他会从参数表中提取信息，以上图为例，获取的信息为【#0】列到【#2】列。点击确定后脚本编辑器中会添加如下循环参数表代码，这是一个循环结构的空壳，它和参数表关联，参数表中的数据都是保存在和脚本同名的xls表中的。

接下来我们看一个示例：

下面是一句邮箱登陆的脚本

对应的参数文件

将脚本的第二句和第四句进行参数化，参数化脚本如下：

最后三句是将每次循环后的参数值输出。

结果输出如下


● callScript

命令含义：脚本串联调用命令。

命令参数：一个参数，要求输入调用脚本全名称。

命令产生：在脚本之间调用时出现此命令，手工添加或点击编辑菜单中的【调用脚本】来添加。

命令举例：pr.callScript("Win.bsh");


● checkDatabase

命令含义：校验数据库。

命令参数：六个参数，第一个参数输入数据库类型，第二个参数输入数据库地址，第三个参数输入数据库访问用户名，第四个参数输入数据库访问密码，第五个参数输入数据库查询语句，第六个参数输入校验期望值。

命令产生：手工添加。

命令返回：校验成功返回true，否则返回false

命令举例：

例1，校验单个字符串返回值

pr.checkDatabase("SQL Server", "192.168.1.50:12345/mydb", "spasvo", "123", "SELECT name FROM students WHERE id=45", "Zhang san");

例2，校验数组形式的返回值(一维数组返回一行)

String [] strExpect = {"Zhang san", "男", "18"};

pr.checkDatabase("SQL Server", "192.168.1.50:12345/mydb", "spasvo", "123", "SELECT name, sex, age FROM students WHERE id=45", strExpect);

例3，校验二维表形式的返回值（二维数组返回一个表）

String [][] strExpect = {{"Zhang san", "男", "18"}, {"Li si", "男", "20"}};

pr.checkDatabase("SQL Server", "192.168.1.50:12345/mydb", "spasvo", "123", "SELECT name, sex, age FROM students WHERE id > 45 AND id < 50", strExpect);

相关命令：getDatabase


● checkExcelCell

命令含义：校验Excel单元格文本。(目前只支持*.xls)

命令参数：四个参数，第一个参数输入Excel文件全路径，第二个参数输入单元格行号(从0开始)，第三个参数输入单元格列号(从0开始)，第四个参数输入期望值。

命令产生：手工添加或向导添加。

命令返回：校验成功返回true，否则返回false

命令举例：pr.checkExcelCell("C:\\Test.xls", 0, 0, "Spasvo");

相关命令：getExcelCell


● checkExcelColumn

命令含义：校验Excel某列文本。

命令参数：三个参数，第一个参数输入Excel文件全路径，第二个参数输入单元格列号(从0开始)，第三个参数输入期望值(字符串一维数组)。

命令产生：手工添加或向导添加。

命令返回：校验成功返回true，否则返回false

命令举例：

String [] strColumn = {"18", "18", "19"};

pr.checkExcelColumn("C:\\Test.xls", 2, strColumn);

相关命令：getExcelColumn


● checkExcelRow

命令含义：校验Excel某行文本。

命令参数：三个参数，第一个参数输入Excel文件全路径，第二个参数输入单元格行号(从0开始)，第三个参数输入期望值(字符串一维数组)。

命令产生：手工添加或向导添加。

命令返回：校验成功返回true，否则返回false

命令举例：

String [] strRow = {"Name", "Sex", "Age"};

pr.checkExcelRow("C:\\Test.xls", 0, strRow);

相关命令：getExcelRow


● checkExcelWhole

命令含义：校验Excel文本。

命令参数：两个参数，第一个参数输入Excel文件全路径，第二个参数输入期望值(字符串二维数组)。

命令产生：手工添加或向导添加。

命令返回：校验成功返回true，否则返回false

命令举例：

String [][] strCheck = {{"Zhang san", "男", "18"}, {"Li si", "男", "20"}};

pr.checkExcelWhole("C:\\Test.xls", strCheck);

相关命令：getExcelWhole


● checkFileText

命令含义：校验文件文本。

命令参数：五个参数，第一个参数输入文本格式，第二个参数输入文件全路径，第三个参数输入行号，第四个参数输入列号，第五个参数输入期望值。

命令产生：手工添加。

命令返回：校验成功返回true，否则返回false

命令举例：pr.checkFileText("ANSI", "c:\\test\\test.txt", 1, 1, "a");

相关命令：getFileText


● checkRegex

命令含义：校验正则表达式。

命令参数：两个参数，第一个参数输入校验文本，第二个参数输入正则表达式。

命令产生：手工添加。

命令返回：校验成功返回true，否则返回false

命令举例：pr.checkRegex("021-87888822", "\\d{3}-\\d{8}|\\d{4}-\\d{7}");


● endTransaction

命令含义：指定事务的结束。

协议类型：所有协议。

命令参数：两个参数，第一个参数为事务名称，第二个参数输入执行事务是否通过（true通过，false未通过）。

命令产生：手工添加。

命令举例：pr.endTransaction("transaction-baidu");

pr.endTransaction("transaction-baidu", false);

相关命令：startTransaction


● getDatabase

命令含义：查询数据库。

命令参数：五个参数，第一个参数输入数据库类型，第二个参数输入数据库地址，第三个参数输入数据库访问用户名，第四个参数输入数据库访问密码，第五个参数输入数据库查询语句。

命令产生：手工添加。

命令返回：返回查询结果。

命令举例：

String [][] str = pr.getDatabase("SQL Server", "192.168.1.50:12345/mydb", "spasvo", "123", " SELECT name, sex, age FROM students WHERE id > 45 AND id < 50");

相关命令：checkDatabase


● getExcelCell

命令含义：获取Excel单元格文本。

命令参数：三个参数，第一个参数输入Excel文件全路径，第二个参数输入单元格行号(从0开始)，第三个参数输入单元格列号(从0开始)。

命令产生：手工添加或向导添加。

命令返回：以字符串形式返回指定单元格文本。

命令举例：String str = pr.getExcelCell("C:\\Test.xls", 0, 0);

相关命令：checkExcelCell


● getExcelColumn

命令含义：获取Excel某列文本。

命令参数：两个参数，第一个参数输入Excel文件全路径，第二个参数输入单元格列号(从0开始)。

命令产生：手工添加或向导添加。

命令返回：以一维字符串数组形式返回指定列文本。

命令举例：String [] str = pr.getExcelColumn("C:\\Test.xls", 2);

相关命令：checkExcelColumn


● getExcelRow

命令含义：获取Excel某行文本。

命令参数：两个参数，第一个参数输入Excel文件全路径，第二个参数输入单元格行号(从0开始)。

命令产生：手工添加或向导添加。

命令返回：以一维字符串数组形式返回指定行文本。

命令举例：String [] str = pr.getExcelRow("C:\\Test.xls", 0);

相关命令：checkExcelRow


● getExcelWhole

命令含义：获取Excel文本。

命令参数：一个参数，第一个参数输入Excel文件全路径。

命令产生：手工添加或向导添加。

命令返回：以二维字符串数组形式返回指定的Excel文件文本。

命令举例：String [][] str = pr.getExcelWhole("C:\\Test.xls");

相关命令：checkExcelWhole


● getFileText

命令含义：获取文件文本。

命令参数：五个参数，第一个参数输入文本格式，第二个参数输入文件全路径，第三个参数输入行号，第四个参数输入列号，第五个参数输入待获取的文本长度。

命令产生：手工添加。

命令返回：以String类型返回文件文本

命令举例：String str = pr.getFileText("ANSI", "c:\\test\\test.txt", 1, 1, 1);

相关命令：checkFileText


● http_correlateBody

命令含义：关联HTTP响应的Body数据。

协议类型：HTTP协议。

命令参数：两个参数，第一个参数为左边界字符串，第二个参数为右边界字符串。

命令产生：点击关联菜单命令后自动添加。

命令返回：返回当前左右边界之间的字符串。

命令举例：String corBody0 = pr.http_correlateBody("n.jsp?sid=", "\"");

相关命令：http_correlateCookie


● http_correlateCookie

命令含义：Cookie关联。

协议类型：HTTP协议。

命令参数：两个参数，第一个参数为DOMAIN名称，第二个参数为Cookie的属性名称。

命令产生：手工添加。

命令返回：返回当前的Cookie值。

命令举例：String corCookie0 = pr.http_correlateCookie(".163.com", "S_INFO");

相关命令：http_correlateBody


● http_downloadVerb

命令含义：下载资源文件（GET请求）。

协议类型：HTTP协议。

命令参数：四个参数，第一个参数为对象名，第二个参数为下载的URL地址，第三个参数为引用页地址，第四个参数为下载文件保存路径。

命令产生：HTTP协议录制时自动生成。

命令举例：

pr.http_downloadVerb("readdata.jsp",

"http://cwebmail.mail.163.com/js4/read/readdata.jsp?sid=TByQaLtuVZOGTbPWikuuFFAadlqRjydp&mid=387:xS2BgxmcM09opXyI2gAAsZ&part=3&mode=download&l=read&action=download_attach",

"http://cwebmail.mail.163.com/js4/index.jsp?sid=TByQaLtuVZOGTbPWikuuFFAadlqRjydp",

"C:\\prSpace\\aa\\Record\\Resp_66.dat");

相关命令：http_getVerb


● http_getConnectTimeout

命令含义：获取连接超时时间，单位毫秒。

协议类型：HTTP协议。

命令参数：无参数。

命令产生：手工添加。

命令返回：返回当前连接超时时间。

命令举例：int iTimeout = pr.http_getConnectTimeout();

相关命令：http_setConnectTimeout


● http_getPostCharset

命令含义：获取POST请求函数发送数据时使用的字符集。

协议类型：HTTP协议。

命令参数：无参数。

命令产生：手工添加。

命令举例：String strCharset = pr.getPostCharset();

相关命令：http_setPostCharset


● http_getReadTimeout

命令含义：获取读取资源的超时时间，单位毫秒。

协议类型：HTTP协议。

命令参数：无参数。

命令产生：手工添加。

命令返回：返回当前读取资源的超时时间。

命令举例：int iTimeout = pr.http_getReadTimeout();

相关命令：http_setReadTimeout


● http_getResponseBody

命令含义：获取响应的Body数据。

协议类型：HTTP协议。

命令参数：无参数。

命令产生：手工添加。

命令举例：String str = pr.http_getResponseBody();

相关命令：http_getResponseHeader


● http_getResponseHeader

命令含义：获取响应的Header数据。

协议类型：HTTP协议。

命令参数：一个参数，输入请求头字段。

命令返回：返回请求的头数据，如果没有指定请求头字段则返回整个请求头数据。

命令产生：手工添加。

命令举例：String str = pr.http_getResponseHeader("status");

String str = pr.http_getResponseHeader();

相关命令：http_getResponseBody


● http_getVerb

命令含义：访问指定URL资源（GET请求）。

协议类型：HTTP协议。

命令参数：三个参数，第一个参数为对象名，第二个参数为访问的URL地址，第三个参数为引用页地址。

命令产生：HTTP协议录制时自动生成。

命令举例：

pr.http_getVerb("index.jsp",

"http://cwebmail.mail.163.com/js4/index.jsp?sid=TBSjzsiuhMyNRbjZLkuuzSEcCJjngewb",

"http://cwebmail.mail.163.com/js4/main.jsp?sid=TBSjzsiuhMyNRbjZLkuuzSEcCJjngewb");

相关命令：http_downloadVerb


● http_postVerb

命令含义：数据提交（POST请求）。

协议类型：HTTP协议。

令参数：四个参数，第一个参数为对象名，第二个参数为提交的URL地址，第三个参数为引用页地址，第四个参数为POST数据。

命令产生：HTTP协议录制时自动生成。

命令举例：

pr.http_postVerb("ntesdoor2",

"https://ssl.mail.163.com/entry/coremail/fcg/ntesdoor2?df=webmail163&from=web&funcid=loginone&iframe=1&language=-1&net=c&passtype=1&product=mail163 &race=-2_-2_-2_db&style=-1&uid=liaoguobao19860822@163.com",

"http://mail.163.com/",

"savelogin=0&url2=http://mail.163.com/errorpage/err_163.htm&username=liaoguobao19860822&password=4305242774");

关命令：http_writedataVerb、http_uploadVerb


● http_removeCorrelatedCookie

命令含义：移除指定的Cookie关联。

协议类型：HTTP协议。

命令参数：两个参数，第一个参数为DOMAIN名称，第二个参数为Cookie的属性名称。

命令产生：手工添加。

命令举例：pr.http_removeCorrelatedCookie(".163.com", "S_INFO");

相关命令：http_correlateCookie


● http_setConnectTimeout

命令含义：设置连接超时时间，单位毫秒。

协议类型：HTTP协议。

命令参数：一个参数，输入超时时间。

命令产生：手工添加。

命令举例：pr.http_setConnectTimeout(3000);

相关命令：http_getConnectTimeout


● http_setPostCharset

命令含义：设置POST请求函数发送数据时使用的字符集。

协议类型：HTTP协议。

命令参数：一个参数，输入字符集名称。

命令产生：手工添加。

命令举例：pr.http_setPostCharset("utf-8");

相关命令：http_getPostCharset


● http_setReadTimeout

命令含义：设置读取资源数据的超时时间，单位毫秒。

协议类型：HTTP协议。

命令参数：一个参数，输入超时时间。

命令产生：手工添加。

命令举例：pr.http_setReadTimeout(3000);

相关命令：http_getReadTimeout


● http_setRequestHeader

命令含义：获取响应的Header数据。

协议类型：HTTP协议。

命令参数：一个参数，输入请求头字段。

命令返回：返回请求的头数据，如果没有指定请求头字段则返回整个请求头数据。

命令产生：手工添加。

命令举例：String str = pr.http_getResponseHeader("status");

String str = pr.http_getResponseHeader();

相关命令：http_getResponseBody


● http_uploadVerb

命令含义：上传资源文件（POST请求）。

协议类型：HTTP协议。

命令参数：五个参数，第一个参数为对象名，第二个参数为上传的URL地址，第三个参数为引用页地址，第四个参数为上传参数，第五个参数为上传文件路径。

命令产生：HTTP协议录制时自动生成。

命令举例：

pr.http_uploadVerb("upload",

"http://t5hz.mail.163.com/upxmail/upload?sid=TAtaUBMAHnrVdKHiUQAAasPmjZGBcTef&uid=liaoguobao19860822@163.com&cid=c:1340852664746&host=g2a17.mail.163.com&ver=js4&agent=flash",

"", "Filename=test.txt&urs=JmMpr0KXe6YlKX1PiZpDCsb2UQN13gviEwhc5Sv9SzdbbtsWYb2sMPQo0inffDYRklVWsQp5MJjn6Ijom4jQtZgweii.nHFRyHFTqZ8q0V.ZiUoP63n4CFR1Vfeen5LooZxOLJDUpBVusOzS_ErDbhVJPPuNKOhcI&cmc=1340852660025%TAtaUBMAHnrVdKHiUQAAasPmjZGBcTef%g2a17.mail.163.com&size=226&name=test.txt&type=0&Upload=Su bmit Query",

"C:\\prSpace\\xx\\Record\\Requ_69.dat");

相关命令：http_postVerb、http_writedataVerb


● http_writedataVerb

命令含义：提交数据（用于大数据的POST请求）。

协议类型：HTTP协议。

命令参数：四个参数，第一个参数为对象名，第二个参数为数据提交的URL地址，第三个参数为引用页地址，第四个参数为数据文件保存的路径。

命令产生：HTTP协议录制时自动生成。

命令举例：

pr.http_writedataVerb("s",

"http://cwebmail.mail.163.com/js4/s?sid=TAobiBMAAPFVdKeldQAATfDLaAzCSJBQ&func=global:sequential&from=nav&action=showHideFolder&showAd=true&uid=liaoguobao19860822@163.com",

"http://cwebmail.mail.163.com/js4/index.jsp?sid=TAobiBMAAPFVdKeldQAATfDLaAzCSJBQ",

"C:\\prSpace\\xx\\Record\\Requ_37.dat");

相关命令：http_postVerb、http_uploadVerb


● rendezvous

命令含义：创建集合点。

协议类型：所有协议。

命令参数：一个参数，第一个参数为集合点名称。

命令产生：手工添加。

命令举例：pr.rendezvous("rendezvous-baidu");


● sleep

命令含义：停顿命令。

命令参数：一个参数，输入停顿时间，单位是毫秒。

命令产生：手工添加。

命令举例：pr.sleep(3000);


● socket_close

命令含义：关闭指定SOCKET

协议类型：SOCKET协议。

命令参数：一个参数，第一个参数为socket名称。

命令产生：SOCKET协议录制时自动生成。

命令举例：pr.socket_close("socket3");


● socket_correlate

命令含义：SOCKET脚本关联。

协议类型：SOCKET协议。

命令参数：三个参数，第一个参数为左边界字符串，第二个参数为右边界字符串，第三个参数为参数化名称。

命令产生：手工添加。

命令举例：pr.socket_correlate("sid=", "\"", "param_sid");

相关命令：http_correlateCookie、http_correlateBody


● socket_parameterize

命令含义：将指定的数据保存到某个变量中，参数化时用到，动态设置某变量的值。

命令参数：两个参数，第一个参数指定变量名称，第二个参数指定变量被赋予的值。

命令产生：手工添加。

命令举例：pr.socket_parameterize("sdi", "123456");

相关命令：socket_correlate


● socket_tcp_create

命令含义：创建长连接SOCKET

协议类型：SOCKET协议。

命令参数：三个参数，第一个参数为socket名称，第二个参数为远程服务器地址，第三个参数为远程服务器端口号。

命令产生：SOCKET协议录制时自动生成。

命令举例：pr.socket_tcp_create("socket0", "61.135.169.125", "80");

相关命令：socket_udp_create


● socket_tcp_getKeepAlive

命令含义：获取SOCKET是否一直保持连接。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：pr.socket_tcp_getKeepAlive();

相关函数：socket_tcp_setKeepAlive


● socket_tcp_getOOBInline

命令含义：获取SOCKET是否启用OOBINLINE功能。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：boolean b = pr.socket_tcp_getOOBInline();

相关函数：socket_tcp_setOOBInline


● socket_tcp_getReceiveBufferSize

命令含义：获取SOCKET接收缓冲区大小。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：int iLen = pr.socket_tcp_getReceiveBufferSize();

相关函数：socket_tcp_setReceiveBufferSize


● socket_tcp_getSendBufferSize

命令含义：获取SOCKET发送缓冲区大小。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：int iLen = pr.socket_tcp_getSendBufferSize();

相关函数：socket_tcp_setSendBufferSize


● socket_tcp_getSoLinger

命令含义：获取SOCKET的SO_LINGER的设置。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：int iLen = pr.socket_tcp_getSoLinger();

相关函数：socket_tcp_setSoLinger


● socket_tcp_getSoTimeout

命令含义：获取SOCKET的SO_TIMEOUT的值，单位毫秒。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：int iLen = pr.socket_tcp_getSoTimeout();

相关函数：socket_tcp_setSoTimerout


● socket_tcp_getTcpNoDelay

命令含义：获取SOCKET是否启用TCP_NODELAY。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：boolean b = pr.socket_tcp_getTcpNoDelay();

相关函数：socket_tcp_setTcpNoDelay


● socket_tcp_getTrafficClass

命令含义：获取SOCKET上发送的包的 IP 头中的流量类别或服务类型。

协议类型：SOCKET协议。

命令参数：无。

函数返回：已经设置的流量类别或服务类型,整型值。

命令产生：手工添加。

命令举例：int i = pr.socket_tcp_getTrafficClass();

相关函数：socket_tcp_setTrafficClass


● socket_tcp_receive

命令含义：TCP SOCKET 接收数据

协议类型：SOCKET协议。

命令参数：两个参数，第一个参数为socket名称，第二个参数为接收缓冲区名称。

命令产生：SOCKET协议录制时自动生成。

命令举例：pr.socket_tcp_receive("socket2", "buf1");

相关命令：socket_udp_receive


● socket_tcp_send

命令含义：TCP SOCKET 发送数据

协议类型：SOCKET协议。

命令参数：两个参数，第一个参数为socket名称，第二个参数为发送缓冲区名称。

命令产生：SOCKET协议录制时自动生成。

命令举例：pr.socket_tcp_send("socket2", "buf3");

相关命令：socket_udp_send


● socket_tcp_setKeepAlive

命令含义：设置SOCKET是否一直保持连接。

协议类型：SOCKET协议。

命令参数：一个参数，输入布尔型的值，true表示保持连接，false表示不保持连接。

命令产生：手工添加。

命令举例：pr.socket_tcp_setKeepAlive(true);

相关函数：socket_tcp_getKeepAlive


● socket_tcp_setOOBInline

命令含义：设置SOCKET是否启用OOBINLINE功能。

协议类型：SOCKET协议。

命令参数：一个参数，输入true此SOCKET将启用OOBINLINE功能，否则不启用，默认不启用。

命令产生：手工添加。

命令举例：pr.socket_tcp_setOOBInline(true);

相关函数：socket_tcp_getOOBInline


● socket_tcp_setReceiveBufferSize

命令含义：设置SOCKET接收缓冲区大小。

协议类型：SOCKET协议。

命令参数：一个参数，输入预设值的缓冲区大小。

命令产生：手工添加。

命令举例：pr.socket_tcp_setReceiveBufferSize(8192);

相关函数：socket_tcp_getReceiveBufferSize


● socket_tcp_setSendBufferSize

命令含义：设置SOCKET接收缓冲区大小。

协议类型：SOCKET协议。

命令参数：一个参数，输入预设值的缓冲区大小。

命令产生：手工添加。

命令举例：pr.socket_tcp_setSendBufferSize(8192);

相关函数：socket_tcp_getSendBufferSize


● socket_tcp_setSoLinger

命令含义：设置SOCKET的SO_LINGER。

协议类型：SOCKET协议。

命令参数：两个参数，第一个参数输入布尔值，启用或禁用SO_LINGER功能，第二个参数输入时间，单位是秒。

命令产生：手工添加。

命令举例：pr.socket_tcp_setSoLinger(true, 3);

相关函数：socket_tcp_getSoLinger


● socket_tcp_setSoTimeout

命令含义：设置SOCKET的SO_TIMEOUT，单位毫秒。

协议类型：SOCKET协议。

命令参数：两个参数，第一个参数输入布尔值，启用或禁用SO_TIMEOUT功能，第二个参数输入时间，单位是毫秒。

命令产生：手工添加。

命令举例：pr.socket_tcp_setSoTimeout(true, 3000);

相关函数：socket_tcp_getSoTimeout


● socket_tcp_setTcpNoDelay

命令含义：设置SOCKET是否启用TCP_NODELAY。

协议类型：SOCKET协议。

命令参数：一个参数，布尔类型值，输入true表示启用TCP_NODELAY，否则禁止。

命令产生：手工添加。

命令举例：pr.socket_tcp_setTcpNoDelay(true);

相关函数：socket_tcp_getTcpNoDelay


● socket_tcp_setTrafficClass

命令含义：设置SOCKET上发送的包的 IP 头中的流量类别或服务类型。

协议类型：SOCKET协议。

命令参数：一个参数，整型数字（0-255），输入具体数值。

命令产生：手工添加。

命令举例：pr.socket_tcp_setTrafficClass(2);

相关函数：socket_tcp_getTrafficClass


● socket_udp_create

命令含义：创建短连接SOCKET

协议类型：SOCKET协议。

命令参数：一个参数，第一个参数为socket名称。

命令产生：SOCKET协议录制时自动生成。

命令举例：pr.socket_udp_create("socket1");

相关命令：socket_tcp_create


● socket_udp_getBroadcast

命令含义：获取SOCKET是否启用了SO_BROADCAST。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令返回：返回布尔类型，放回true表示启用SO_BROADCAST，返回false表示没有启用。

命令举例：boolean b = pr.socket_udp_getBroadcast();

相关函数：socket_udp_setBroadcast


● socket_udp_getReceiveBufferSize

命令含义：获取SOCKET接收缓冲区大小。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令返回：整型值，返回接收缓冲区大小。

命令举例：int iLen = pr.socket_udp_getReceiveBufferSize();

相关函数：socket_udp_setReceiveBufferSize


● socket_udp_getSendBufferSize

命令含义：获取SOCKET发送缓冲区大小。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：int iLen = pr.socket_udp_getSendBufferSize();

相关函数：socket_udp_setSendBufferSize


● socket_udp_getSoTimeout

命令含义：获取SOCKET的SO_TIMEOUT的值，单位毫秒。

协议类型：SOCKET协议。

命令参数：无。

命令产生：手工添加。

命令举例：int iLen = pr.socket_udp_getSoTimeout();

相关函数：socket_udp_setSoTimerout


● socket_udp_getTrafficClass

命令含义：获取SOCKET上发送的包的 IP 头中的流量类别或服务类型。

协议类型：SOCKET协议。

命令参数：无。

函数返回：已经设置的流量类别或服务类型,整型值。

命令产生：手工添加。

命令举例：int i = pr.socket_udp_getTrafficClass();

相关函数：socket_udp_setTrafficClass


● socket_udp_receive

命令含义：UDP SOCKET 接收数据

协议类型：SOCKET协议。

命令参数：四个参数，第一个参数为socket名称，第二个参数为接收缓冲区名称，第三个参数为接收源主机的IP地址，第四个参数为接收源主机的端口号。

命令产生：SOCKET协议录制时自动生成。

命令举例：pr.socket_udp_receive("socket3", "buf3", "182.118.22.111", "53");

相关命令：socket_tcp_receive


● socket_udp_send

命令含义：UDP SOCKET 发送数据

协议类型：SOCKET协议。

命令参数：四个参数，第一个参数为socket名称，第二个参数为发送缓冲区名称，第三个参数为目的主机IP地址,第四个参数为目的主机端口号。

命令产生：SOCKET协议录制时自动生成。

命令举例：pr.socket_udp_send("socket3", "buf5", "182.118.22.119", "53");

相关命令：socket_tcp_send


● socket_udp_setBroadcast

命令含义：设置SOCKET是否启用SO_BROADCAST。

协议类型：SOCKET协议。

命令参数：一个参数，布尔类型，true表示启用，false表示不启用。

命令产生：手工添加。

命令举例：pr.socket_udp_setBroadcast(true);

相关函数：socket_udp_getBroadcast


● socket_udp_setReceiveBufferSize

命令含义：设置SOCKET接收缓冲区大小。

协议类型：SOCKET协议。

命令参数：一个参数，输入预设值的缓冲区大小。

命令产生：手工添加。

命令举例：pr.socket_udp_setReceiveBufferSize(8192);

相关函数：socket_udp_getReceiveBufferSize


● socket_udp_setSendBufferSize

命令含义：设置SOCKET接收缓冲区大小。

协议类型：SOCKET协议。

命令参数：一个参数，输入预设值的缓冲区大小。

命令产生：手工添加。

命令举例：pr.socket_udp_setSendBufferSize(8192);

相关函数：socket_udp_getSendBufferSize


● socket_udp_setSoTimeout

命令含义：设置SOCKET的SO_TIMEOUT，单位毫秒。

协议类型：SOCKET协议。

命令参数：两个参数，第一个参数输入布尔值，启用或禁用SO_TIMEOUT功能，第二个参数输入时间，单位是毫秒。

命令产生：手工添加。

命令举例：pr.socket_udp_setSoTimeout(true, 3000);

相关函数：socket_udp_getSoTimeout


● socket_udp_setTrafficClass

命令含义：设置SOCKET上发送的包的 IP 头中的流量类别或服务类型。

协议类型：SOCKET协议。

命令参数：一个参数，整型数字（0-255），输入具体数值。

命令产生：手工添加。

命令举例：pr.socket_udp_setTrafficClass(2);

相关函数：socket_udp_getTrafficClass


● startTransaction

命令含义：指定事务的开始。

协议类型：所有协议。

命令参数：一个参数，第一个参数为事务名称。

命令产生：手工添加。

命令举例：pr.startTransaction("transaction-baidu");

相关命令：endTransaction


● stopRunning

命令含义：停止回放。

命令参数：无。

命令产生：手工添加。

命令举例：pr.stopRunning();


● HTTP协议录制不出脚本

A、目前软件只支持基于IE内核的浏览器HTTP协议的录制，如果你使用的浏览器不是基于IE内核（比如火狐浏览器），HTTP协议录制不出脚本。

B、请确认在录制脚本时，杀毒软件弹出的拦截消息被放行，如果选择禁止的话，HTTP协议录制不出脚本。

C、请确认您申请的lic文件时是否选中了支持HTTP的录制，如果没有选的话，HTTP协议录制不出脚本。

D、请确认您的应用程序使用了HTTP协议，如果没有使用HTTP协议，则录制不出脚本。


● SOCKET协议录制不出脚本

A、请确认在录制脚本时，杀毒软件弹出的拦截消息被放行，如果选择禁止的话，SOCKET协议录制不出脚本。

B、请确认您申请的lic文件时是否选中了支持SOCKET的录制，如果没有选的话，SOCKET协议录制不出脚本。

C、请确认您的应用程序使用了SOCKET协议，如果没有使用SOCKET协议，则录制不出脚本。

D、请确认您的网络连接是否正常，如果网络出现故障导致通信失败，SOCKET录制不出脚本。


● 回放不停止或回放时间过长

回放不能停止，很大一部分是发生在脚本的串联调用过程中，由于串联调用的脚本形成了一个调用环（A脚本调用B脚本，而在B脚本中又调用了A脚本），导致回放进入死循环，解决的办法可以通过热键强行终止执行（Alt+Ctrl+Shift+S）。对于回放时间过长，有可能是执行的脚本过多导致，也有可能是脚本没有做关联导致。


●回放对象不在对象库中

所有的回放对象在对象库中都要存在才能回放成功，如果没有则会报这个错误，此时必需重新录制脚本，把刚才回放失败的对象包含进来。


● 安装出错

此问题多发生在Win7操作系统上。由于软件安装时要进行各种读写操作、电脑硬件信息获取、插件的注册等，每一项操作都需要程序有最高权限，而在Win7下默认是没有最高权限的，所以安装往往会出现问题。解决方法是：右击安装包，在弹出菜单中选择以【管理员权限运行】即可。


● 循环参数表未执行

A、检查参数表数据设计的是否正确；

B、对参数表进行的任何修改是否都已保存；

C、循环参数表的循环体脚本是否编写得当；

D、检查参数化后，回放时的实际对象在对象库中是否存在。

E、循环参数表是很高级的脚本流程设计，在编写之前请认真查看“高手进阶”的相关内容和例子。