LOADRUNNER高级特性应用案例

时间:2025-04-08 20:16:58

1     响应内容的关联和截取

在全流程测试中会经常涉及对响应内容的关联和截取,主要涉及下面2个场景:

Ø  获取session或cookie信息作为后续请求的依赖条件。

比如在提交订单场景,如果要模拟在线用户提交订单对应的cookie必须包含对应的状态信息。这部分状态信息需要从服务器响应中截取出来,并在后续发送的请求中一并发送给服务端。

在LR中web_reg_save_param_ex可以满足大部分常用的内容截取场景,要求在请求的前面调用该API,输入左右边界即可将需要截取的内容输入到一个LR参数中。

 

其他的关联API如下,基本使用方法相同,主要区别是在一些特定响应内容结构需要一些更灵活的截取规则来提取所需的内容,比如正则表达式和Xpath等等。

 

Ø  获取上一步操作的业务流输出作为检查点或下一步业务操作的输入

一些较特别的场景可能单个API无法解决,此时需要结合C自带的字符串函数处理。

比如下面的华为IT系统最常见的工号查询接口返回的数据,有时包含工号有时包含工号和姓名。

在某个测试场景中需要提取所有的工号此时一般的左右边界关联可能无法处理,参考下面的方法。

截取结果如下

需要注意的是sscanf函数的格式化输出为%d仅对应一般的整形,如果对应的整形数字长度过大(长整形)可能需要使用%ld等其他的格式,否则会导致截取的数字不正确,这里是容易出Bug的地方需要注意。利用C自带的字符串处理函数可以适用更灵活的场景,但相对的脚本会稍微复杂一点。完整的API可以参考下面的列表。

 

2     业务流程中的时间和日期

在很多场景都会需要对测试脚本中的时间和日期进行修改,比如业务流程中日期相关的操作,一些资源的缓存标记等。

Ø  日期的递增

假设某个业务的请求参数涉及到日期,这个日期不能重复。在请求参数较少时可以简单的将参数+1即可,但如果需要较多的请求参数由于日期的特殊性无法使用类似lr_param_increment的方法,可使用lr_save_datetime进行处理。

虽然在API文档中没有说明按天递增如何传参,但根据对该API的定义可知,第二个参数offset就是用来控制递增时间长度,测试脚本可以参考该定义灵活构造日期参数。

 

Ø  生成默认时间戳

web_save_timestamp_param("tStamp", LAST );

保存到tStamp参数。

 

Ø  生成指定格式时间戳

 

如这些样例无法匹配测试需求,可参考其他的时间相关API自行修改测试脚本。

 

3     缓存和会话状态加载

很多业务场景的测试都是在带缓存和会话状态的前提下执行。一个典型的场景是用户需要登录才能执行某些业务操作比如下订单,因此测试脚本一般会录制登录,然后再进行后续业务操作。

这种方法存在一些弊端,比如我的测试目的并不是登录而是下订单,由于登录模块的一些性能缺陷会导致返回会话状态出现异常缓慢等

利用web_dump_cache 和web_load_cache,可以在会话状态未过期的前提下跳过登录模块直接对被测业务进行压测。

需要注意的是,加载的cache中的状态信息在服务端必须存在,否则脚本会运行失败。因此一般会将应用服务器的会话超时时间适当加长以配合该API的使用。

 

4     加密解密签名

这里主要以RSA算法为例。在PTS支付接口测试中涉及到了请求参数的RSA签名(注意签名和加密并不完全是一回事),在所有需要规避伪造请求可能的业务场景中都可能会涉及到签名这个概念。

签名的业务模型如下:

1、甲方构造密钥对(公钥+私钥),公布公钥给乙方

2、甲方使用私钥对数据进行签名,然后将“签名+数据” 发送给乙方

3、乙方使用公钥+数字签名 验证数据

加密报文的构造和处理(基于javascrip的加密和解密)

这里使用的API库为/wwwtyro/cryptico/

加载第三方js库

由于第三方库的api粒度较细且很多函数返回js对象无法在LR中传递,因此需要改造该库的入口。编辑,在末尾添加3个直接返回文本的函数。

备注:该样例仅做调试用,实际测试时会直接使用服务端的公钥,到时该文件还需修改。

运行结果如下

如果是签名,则用法会有不同。

 

5     移动应用测试

下面将几种典型的移动应用的录制场景进行了总结,Vmall后续的移动应用测试任务可以参考这个表格使用对应的录制方法。

录制场景类型

适用条件

录制方法

代理录制

移动设备可以连接到相同的网络,应用支持代理设置。

在移动app中配置代理服务器,代理地址添加VuGenProxy的地址。

注意:如果录制包含ssl流量,需要在设备上安装LoadRunner Proxy SSL CA证书(访问http://lr_proxy_ip:80/

服务端录制

不能从真实的设备录制。设备、服务器和VuGen所在机器都在一个网络内,只需对一个服务器进行录制。

在服务端安装VuGen’s Mobile Sniffer Agent

填写服务端的Sniffer Agent地址

网络抓包生成

已经有现成的网络包,比如使用WireShark或tcpdump -s 0 -w 命令生成的pcap文件

使用流量分析选项录制

手机模拟器录制

不能从真实设备录制,测试范围仅限于安卓设备,有可用的安卓模拟器。

选择对应的模拟器后录制

手机上录制

被测设备是安卓且已经root

在手机上安装LoadRunner Mobile Recorder,使用该app生成的pcap文件在VuGen中生成脚本。

 

6     浏览器模拟

Ø  不同浏览器的模拟

可以模拟的部分

User-Agent消息头:必须和所模拟的浏览器一致,可通过在不同的浏览器上查看httpwatch的抓包数据获取。

单域名连接数:一般旧版本的浏览器的单域名连接数配置的都比较低,当前流行的浏览器普遍将该限制放宽到6-8个连接。如果测试脚本使用默认的浏览器配置将导致并发的连接数过低和实际压力不符。注意下面截图中红框部分。

在你修改了浏览器模拟配置后(比如将浏览器版本由低改高),测试工具的行为会发生变化,你的测试结果也会产生改变。

 

不能模拟的部分:

在浏览器和Web应用的交互中,有些内容是无法用性能测试工具模拟的,即使想模拟也是没有意义的。

 

浏览器弹出下载文件的窗口:

该动作性能测试无法模拟,测试人员只需要模拟读取Http的buffer然后写入到文件即可。

 

JS的运算:

一般来说除了Ajax相关的js,其他类型的js主要涉及本地DOM的渲染和绘制以及请求的加密或签名等。这些本地js任务的快慢和远程服务器的性能完全无关因此想在LoadRunner中通过模拟浏览器的方式达到覆盖这些js运行逻辑的想法是不可行的,因为所有本地运行的逻辑都和网络层无关,这在典型的Web应用性能测试场景中是应该忽略的,除非打算对Web的前端性能进行测试但这已超出了LR的范畴。

 

7     Port Mapping使用场景

PortMapping是LR中一个比较重要的部件,设计该部件的目的是在录制脚本过程中对某些IP+Port的流量进行一些特殊的处理,随着LR版本的迭代更新目前该部件的功能已经非常丰富。

下面给出了一些典型场景的PortMapping的配置可作为参考。

1.      录制所有的http请求

使用默认配置即可,不需要修改。

2.      录制所有的http请求,但排除发送到指定IP的请求

3.      录制所有的http请求,但排除发送到指定IP端口的请求

4.      录制指定IP和指定端口的请求

注意该配置有2个Entry

5.      录指定IP和指定端口的SSL请求

6.      录制使用了TSL 1.0的请求

由于上面的配置会影响到所有的地址和端口,因此下面的配置可以留空。

 

7.      录制发送到多个IP、使用不同SSL、TSL配置但端口相同的请求

 

8.      利用PEM证书和密码录制发送到指定IP的SSL3请求

PEM证书是通过CER证书用openssl转换得到,具体操作方法略过。

配置完毕后可用TestSSL按钮进行测试。

 

9.      当录制流程比手工操作慢,且未使用ssl时。使用直连模式录制。

直连模式的录制最大区别是和被测服务端直接连接,而非代理模式下通过代理和服务端通讯。LR默认的录制模式是代理模式,当遇到类似录制慢的问题时可尝试用这个方法解决。

8     基于异步通讯模式的测试

该章节主要讲解基于异步通讯模式的测试(poll、long poll、push以及websocket的概念和适用场景,异步事务的识别规则,对应的测试脚本录制和编写,关联技巧)

Ø  几种典型的异步通讯模型图示:

每种模式在消息传递的实时性、性能上都有很大的不同,因此有不同的适用场景。

Polling

 

Long Polling

 

PUSH

 

Ø  异步通讯模式的识别

可通过下面的界面进行通讯模式识别规则的配置,注意通讯匹配的URL、间隔以及大小是非常关键的参数,设置不当将导致测试脚本以错误的方式和服务端通讯。业务调不通还好可以继续排查,如果业务可以调通但模型错误会是更大的隐患,导致测试结果的失真。

 

Ø  异步通讯模式脚本的生成和调试

在配置了正确的识别规则后,录制完毕时LR会自动将异步通讯请求脚本使用特定的API进行包装生成初步的测试脚本,这样就可以将通讯请求和普通的Http请求区别开,因为这些请求是用来保持通讯而不是用来返回Web页面或调用接口。测试人员可在这些初步生成的测试脚本基础上根据API的说明进行进一步的增强和修改。包装的API主要有以下几种:

web_reg_async_attributes 定义了异步通讯的开始

web_stop_async 定义了异步通讯的结束

 

上面的API的调用参数包含了回调函数的调用,主要的使用场景如下:

 

完整的API列表如下

 

Ø  WebSocket的测试

以上几种异步通讯模式随着IT技术的发展已经慢慢被淘汰,目前在实时性和性能均有较好表现的WebSocket已经越来越普及,LoadRunner在

 

 

9     DFE应用场景-复杂请求构造

什么是DFE?

例如下面这个基于GWT-RPC(GoogleWeb Toolkit)的应用的请求脚本

测试人员如何处理这种Body请求来模拟这类RPC调用?

DFE主要功能是简化各种编码请求消息的处理(包括GWT-RPC、Base64、Json等等),提升测试脚本的编写效率。

 

DFE的流程图

当请求消息比较复杂时,可以利用多个DFE链生成最后测试人员容易处理的消息。

结合上面的例子,未经处理的GWT-RPC消息格式如下

在配置GWT的DFE后,脚本中的消息格式经过了转换(目标格式是XML),此时进行参数化或消息构造将容易很多。

 

如何使用DFE?

Ø  复杂消息报文的构造和处理

在各种服务接口的调用中json使用非常普及,这里主要以构造复杂的json请求为例来进行说明。

在LR12.53版本中已经增加了对json数据的操作API(据海涛说7月底LR将升级到12.52),在这之前只能使用变通的方法构造。

这里以2015年华为配置云项目的一个CSPart关系导入的接口测试脚本为例

原始的简单请求格式大致如下:

 

如果测试场景需要在这种消息格式的基础上构造更复杂的结构,除了直接拼接字符串构造json,还可利用DFE特性构造复杂的请求消息,脚本更灵活也容易维护。

开启DFE

配置DFE链,这里选择Json toXml扩展因为我们需要将原始的json请求转换为xml进行处理,因为LoadRunner没有处理Json的API但是有XML的API。

设计一个请求模板,无论哪种场景的CS关系导入均可从这个模板的结构中进行提取、更新和复制。

一个小窍门,手工编写该模板容易出错可以使用DFE函数将原始的json请求转换为xml。

所有DFE相关的API如下

下面是构造消息的模板。

下面的代码包含了XML的提取、替换属性、插入和复制,用到的API如下

其中比较关键的一点是XML元素的定位使用的是Xpath,如果XML API的调用参数使用了错误的Xpath脚本将运行不成功或输出错误的json请求,如果对Xpath不是很熟悉建议不要手写,这里提供一个小窍门,将XML模板用Chrome打开,利用Chrome的Copy功能生成Xpath。

特别需要注意的是,测试脚本越复杂出现Bug的几率也越高。

本例中随着脚本的迭代拼接的xml会越来越大,如果超过了声明的大小将导致内存溢出报错。该问题比较隐蔽,因为在脚本初始运行是一切正常,只有超过特定次数才会出错。这里使用了strcpy将all_xml这个变量在每次Action迭代前进行初始化,或给该变量重新分配内存可修复该问题。

注意在进行多个节点属性参数化时,这些XML API的输出是下个XML API的输入,如果填写错误将导致Bug。

注意web_convert_from_formatted这个函数,它将拼接后的XML转换为接口对应的Json。

 

调试的时候可以将LR脚本构造的json请求放到POSTMan或其他类似工具里面测试,这样效率更高。

下面是稍复杂的一个Cpart挂载3个Spart节点的配置生成的测试请求,经格式化后显示如下:

 

Ø  利用javascript构造请求消息

 

 

10  基于Java 接口的测试

由于目前集成验证中心没有Java Vuser 的License,因此暂不考虑。类似场景优先使用Jmeter压测。

需要注意的是,使用这种方式压测无论使用什么测试工具,由于jar包中的很多逻辑对测试人员不透明因此需要仔细分析实际压力模型的差异。以Dubbo为例,由于Dubbo的连接是一个单例模式总是使用一个长连接,单个实例下无论你配置并发线程组的值是多少,并发的压力都是通过这一个长连接传递的。在真实场景中调用压力并不一定是在某个固定的连接数(Consumer实例数)上增加,而且单个长连接能够承载的网络IO也会受接口传递对象的复杂程度影响也存在一个上限。如果这种特别的压力模型没有考虑到可能导致测试结果出现偏差。

 

11  请求序列化

在接口的测试中会经常涉及请求和响应的序列化,目前主要有php和json两种。

由于序列化的方式对性能也会产生影响,因此在条件允许的情况下建议对同一接口的多个序列化方式都进行测试。

 

PHP序列化

在Vmall OPENGW网关的测试中有些场景是用PHP序列化的方式调用接口,例如下面的例子。

OPENGW接口中NSP服务请求参数(PHP序列化):

a:1:{i:0;a:18:{s:7:"cmbCono";s:0:"";s:15:"isMultiPayOrder";i:0;s:9:"isRiskPay";i:0;s:6:"openId";s:0:"";s:9:"orderCode";s:10:"5200008038";s:13:"paymentAmount";d:24380.0;s:14:"paymentChannel";i:8;s:10:"paymentFee";d:0.0;s:13:"paymentMethod";s:7:"SBERPAY";s:9:"paymentNo";s:10:"5200008038";s:13:"paymentStatus";s:1:"1";s:11:"paymentTime";s:24:"2016-03-01+14:47:09+0800";s:11:"paymentType";i:63;s:7:"salesId";i:25;s:17:"tradeSerialNumber";s:25:"CP20160301144710514391289";s:12:"uniOrderCode";s:0:"";s:16:"uniPaymentAmount";d:0.0;s:6:"userId";s:18:"260086000000723101";}}

这里请求的参数不能简单的通过参数化替换,原因如下:

PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的 Using Serialized PHP withYahoo! Web Services 一文中给出了所有的字母标示及其含义:

a - array

b - boolean

d - double

i - integer

o - common object

r - reference

s - string

C - custom object

O - class

N - null

R - pointer reference

U - unicode string

一些类型后面的数字代表的是长度,简单的参数化无法修改这个长度标识。当参数长度发生变化将导致服务端的反序列化失败使测试脚本无法执行。

一个workaround的方法是使用其他工具提前生成好测试需要的参数,LR直接调用这些现成的参数即可。下面是使用python生成参数的例子,当然你也可以使用其他熟悉的程序。

上面的python脚本可根据已有的订单号批量生成PHP序列化请求参数,然后导入LoadRunner的参数文件进行参数化。如需要修改其他参数可在脚本中修改对应output的键值即可。

 

弊端的显现

随着测试参数的规模变大,最后的参数文件可能会变得非常大甚至超过LR的限制。此时需要使用另外一种变通的方法,在OrderCode长度不变的情况下对该参数进行替换,此时的参数文件只需要准备足够的OrderCode因此可大大减小参数文件的体积。

1.      在中添加字符替换的自定义函数

char *strReplace(const char *src, const char *from, const char *to)
{
char *value;
char *dst;
char *match;
int size;
int fromlen;
int tolen;
// Find out the lengths of the source string,text to replace, and
// the replacement text.
size = strlen(src) + 1;
fromlen = strlen(from);
tolen = strlen(to);
// Allocate the first chunk with enough for theoriginal string.
value = (char *)malloc(size);
// We need to return 'value', so let's make acopy to mess around with.
dst = value;
// Before we begin, let's see if malloc wassuccessful.
if ( value != NULL )
{
// Loop until no matches are found.
for ( ;; )
{
// Try to find the search text.
match = (char *) strstr(src, from);
if ( match != NULL )
{
// Found search text at location 'match'.
// Find out how many characters to copy up to the'match'.
size_t count = match - src;
// We are going to realloc, and for that we willneed a
// temporary pointer for safe usage.
char *temp;
// Calculate the total size the string will beafter the
// replacement is performed.
size += tolen - fromlen;
// Attempt to realloc memory for the new size.
//
// temp = realloc(value, size);
temp = (char *)realloc(value, size);
if ( temp == NULL )
{
// Attempt to realloc failed. Free the previouslymalloc'd
// memory and return with our tail between ourlegs.
free(value);
return NULL;
}
// The call to realloc was successful. But we'llwant to
// return 'value' eventually, so let's point itto the memory
// that we are now working with. And let's notforget to point
// to the right location in the destination aswell.
dst = temp + (dst - value);
value = temp;
// Copy from the source to the point where wematched. Then
// move the source pointer ahead by the amount wecopied. And
// move the destination pointer ahead by the sameamount.
memmove(dst, src, count);
src += count;
dst += count;
// Now copy in the replacement text 'to' at theposition of
// the match. Adjust the source pointer by thetext we replaced.
// Adjust the destination pointer by the amountof replacement
// text.
memmove(dst, to, tolen);
src += fromlen;
dst += tolen;
}
else //No match found.
{
// Copy any remaining part of the string. Thisincludes the null
// termination character.
strcpy(dst, src);
break;
}
//For Loop()
}
return value;
}

int lr_replaceconst char *lrparam, char *findstr, char *replacestr )
{
int res = 0;
char *result_str;
char lrp[1024];
// Finalize the LR Param Name
sprintf( lrp, "{%s}", lrparam);
// Do the Search and Replace
result_str = strReplacelr_eval_string(lrp), findstr, replacestr );
// Process results
if (result_str != NULL )
{
lr_save_string( result_str, lrparam );
free( result_str );
res = 1;
}
return res;

 

2.      修改脚本

 

利用第三方JS库进行PHP序列化

/topics/0/270/

使用上面的js库,参考加密解密签名章节中的js调用方法来增强LR测试脚本直接在脚本中进行序列化,这里省略具体的操作。可参考对应的章节自己实践。

 

 

12  自定义错误页面处理

Ø  什么是自定义错误页面?

自定义错误页面的http返回码一般是2xx或3xx,假设业务流程出现异常测试工具不会在此种情况下设置事务状态为失败。

Ø  目的

解决非标准业务流程错误的检测问题。

Ø  方法

当仅涉及接口测试的时候只需要添加少量的检查点即可。但在涉及全流程的场景由于请求数量非常多此时要处理非标准错误的业务错误添加太多的检查点是十分繁琐且容易出错。

正确的做法是将非标准的错误标示配置到ContentCheck页面的规则列表中。

样例:

如果指定标示在任意请求的响应Body中有找到则会将脚本运行结果设置为失败。

下面是配置的一个反例,没有找到则标记为失败。

这些配置可以很方便的在不同的测试项目中导入和导出,复用起来非常方便。

 

Ø  局限性

检查的范围仅限于Body,Headers不在检查范围内。

 

13  跨脚本测试数据共享

目的:解决Vuser或脚本之间的参数共享问题.

特点:该工具使用的是基于NoSQL的引擎,因此有较好的性能,可以支撑较大规模的测试参数。

典型应用场景:脚本A将商品添加到购物车,脚本B修改购物的商品,脚本C将购物车的商品下单。可利用VTS将商品数据进行共享,在全流程测试中非常有用。

 

目前测试机上都未安装VTS,可参考62压力机的安装路径安装。

C:\Users\Administrator\AppData\Local\Temp\2\LR11.52Trial\AdditionalComponents\Standalone Applications

 

使用本地4000端口启动, http://localhost:4000 界面如下

开启API访问端口,默认是8888

导入数据,数据源可以是mysql或CSV文件,这里以CSV为例

在LR脚本中,init部分编写VTS的连接逻辑,action部分编写数据操作逻辑,end部分编写断开连接逻辑。如下

运行结果如下

 

 

具体的细节可以参考官方API文档

 

 

14  一种业务指标的度量方法

在订单支付业务流程中,曾经有消费者抱怨支付后订单长期处于未支付状态。为了验证该问题,在PTS和OMS系统的联调测试中需要度量支付成功后到订单显示为已支付的延迟这个业务指标。

由于是跨系统的调用,直接统计这种业务指标相对困难。下面是一个变通的方法。

 

在支付回调时将调用的时间戳传递到接口的paymentMethod参数上(因该参数的修改不影响业务逻辑),这样就在数据库中记录了支付的开始时间。对应为tbl_ord_payment.paymentMethod,测试脚本对应的处理如下。

当更新订单状态后,其结束时间为tbl_ord_payment.payment_date。因此这个延迟的统计可用下面的sql查询。黄色部分是构造测试数据时特意设计的一个批次标记,可直接按该标记清理和分析测试结果。

 

 

15  分布式测试

当单个压力机无法构造足够压力时需要开启多个压力机进行分布式测试,配置过程主要的问题是防火墙导致的Agent连接不成功,参照下面的方法设置。

Windows

除防火墙的配置外LR Agent的权限设置也需要检查,默认是选择无需登录就可以运行vuser,如下图。

 

远程压力机的Agent安装并启动后就可以在主控机器上的Controller中配置,下面的样例使用了一台远程压力机和一台本地压力机作为负载生成器。如果远程压力机状态不是Ready则说明Agent没启动或对应端口不能访问需要进行排查。

LR Agent也可以安装在Linux上,因为涉及到License配置可以暂不考虑。

 

压测端瓶颈

当主控节点挂载的LoadGenerator较多或使用的Vuser较多时,LoadGenerator可能会成为瓶颈,因此在实施较大并发的分布式测试时需要监控压力机本身的CPU、内存和带宽开销,以免压测端成为瓶颈。

 

 

 

16  脚本录制问题排查

测试全流程不可避免的会经常用到脚本录制,虽然录制不复杂但也会遇到很多问题导致录制失败,下面列举一些常见的录制问题和解决方案。

 

Ø  录制结束后没有脚本生成,但录制工具条上的事件计数器是增长的

这说明LR识别http流量失败,可能被测程序使用了ssl,此时需要选择正确的ssl协议版本,比如ssl2、ssl3或TSL。这些可以通过Port Mapping界面的Option按钮进行配置。

 

Ø  录制结束后没有脚本生成,录制过程工具条上的事件计数器增长很少

这说明没有任何流量被测试工具识别,被测程序在网络上没有流量产生。比如杀毒软件导致的连接失败或PortMapping配置错误。有时浏览器的多标签也会对此产生影响。

 

Ø  特定的事件录制不到

这种情况有可能这类事件直接被LR丢弃,因为测试工具默认只录制http响应为2xx和302的请求,如果是其他的返回码则会被忽略,比如304.

可通过修改注册表在下面的路径增加一个值

 [HKEY_CURRENT_USER\Software\MercuryInteractive\Networking\Multi Settings\QTWeb\Recording]

"GenerateApiFuncForCustomHttpStatus"="304"

 

Ø 录制程序在录制过程中不响应

一般是LR无法连接到某个服务器,原因可通过Recording Log查看,比如下面这种

在华为IT应用的测试中经常出现的情况是由于测试环境和生产环境的隔离,有些地址是无法连接的。一般这些地址和业务流程没有关系,比如是收集用户行为数据等和被测对象无关的地址。这是可以忽略掉的。

在本例中说明服务器IP+5222这个端口无法访问,经排查该地址和端口和被测业务无关,可以在录制选项中通过PortMapping将该IP和端口忽略掉,参照下面的配置。

如果这个地址和端口和被测业务有关联则需要将checkbox勾上。

 

Ø  录制过程中出现服务器认证错误信息.

目前Vmall的测试场景基本不涉及https,随着https的普及后面测试任务会遇到类似的问题。

该问题主要是由于测试端不能验证服务端证书的有效性导致,可将LR的CA证书添加到信任的根证书节点下。LR证书的文件名叫wplusCAOnly_Expiration_2022.crt,可在安装目录下的bin/certs下找到。

 

Ø  录制过程中出现浏览器崩溃.

原因不明,可尝试更换浏览器版本和类型。

 

 

17  附录

17.1   工具更新说明

/en/latest/help/WebHelp/Content/WelcomeContent/c_WhatsNew.htm

/en/latest/help/WebHelp/Content/LR_TopNav_contentPDFs.htm

 

17.2   脚本增强插件

VuGen PowerPack

/HPSoftware/VuGenPowerPack

该工具是一个插件包,可以提升测试脚本编写的效率

 

17.3   网络模拟工具

之前在PTS测试中使用的是TC,推荐使用 AugmentedTraffic Control ATC ),模拟的场景更丰富使用也较简单。