1 背景

1.1 WEB业务

WEB2.0时代,javascript已经大量应用,它加强客户端处理能力,因此,有些复杂的计算可以由javascript进行处理。

当前,几乎所有的性能测试工具都无法解析javascript脚本,而通过录制或手动添加方式可以将javascript的行为(如Ajax,最终仍是HTTP交互)插入脚本流程中,从而实现完全模拟业务交互整个流程。

但是,由于性能测试工具无法解析javascript脚本,如果出现下面这些场景,几乎所有的性能测试工具将无法模拟正常业务交互流程。

1)     发送或接收的HTTP消息部分内容需要加密或解密

HTTP消息内容需要加密或解密,且是通过javascript处理的(可以是标准或私有算法)。

如浏览器发送用户名与密码、或者特殊标识(可能是随机的,作为该次会话的标识)给服务器,而这些内容是加密的,由于工具无法模拟加密算法,因此无法模拟业务交互过程。

如浏览器对服务器的HTTP响应消息进行javascript解析,解密获取内容,作为后面请求消息的输入。工具无法解析javascript也将无法模拟交互过程。

2)     发送的HTTP请求消息需要进一步处理

如根据随机产生的参数、或者服务器得到的参数(如会话ID),然后需要进行计算处理产生一个结果

3)     浏览器通过javascript解析HTTP响应消息内容,并进行处理(如1+1计算)后,将结果作为参数提供给后续的HTTP请求消息。

4)     性能工具支持从响应消息提取参数的功能(如通过查找左文本、右文本方式提取中间的内容作为参数)无法满足某些场景。

5)     性能工具无法识别验证码图片,因此无法提交正确的验证码。希望可以与服务器交互获取或者用户自己编写验证码算法。

1.2 其它业务

基本类似WEB业务,如果出现下面这些场景,工具将无法模拟正常业务交互流程。

1)     发送或接收的消息部分或全部内容需要加密或解密

工具提供了文本与二进制应用层协议(socket协议),而有些协议通过使用这两种协议无法满足自身需求,需要进一步的处理。如QQ协议,是二进制协议(UDP)。

2)     发送的请求消息需要进一步处理

如根据随机产生的参数、或者服务器得到的参数(如会话ID),然后需要进行计算处理产生一个结果

3)     接收的消息需要处理,从响应消息获取内容,并进行处理(如1+1计算)后,将结果作为参数提供给后续的请求消息。

4)     性能工具支持从响应消息提取参数的功能(如通过查找左文本、右文本方式提取中间的内容作为参数)无法满足某些场景。

2 解决方法

上面不支持场景可以归结为工具本身处理能力有限,无法支持所有的业务场景(业务场景复杂、或公司在标准协议上加入私有因素)。

解决方法需要测试工具提供发送与接收接口,由用户自己实现接口代码,对请求消息进行处理(如加密、计算),对响应消息进行解析(如解密、提取参数、计算结果)。

kylinPET测试工具通过扩展类的方式实现该功能。

3 如何实现扩展类功能(只支持JAVA

3.1 正常流程与扩展流程

当扩展类没修改接收消息时C等于D(如只提前内容计算参数)

3.2 用户实现扩展类KylinPETImpl

注:不需要实现sendText_JAVAsendBinary_JAVAreceive_JAVA方法,因为它们是给JAVA业务用的。

1)     KylinPETImpl.java文件的包名必须是kylinPET;注意大小写,KylinPETImpl第一个K是大小,包名的k是小写。

2)     KylinPETImpl类必须继承AbstractKylinPET类(在AbstractKylinPET.jar

3)     实现initialize(如果需要)

initialize方法在用户的业务流程开始运行时调用,用于初始化变量或对象。

4)     发送界面勾选调用外部则必须在send(不是sendJAVAText)方法里实现逻辑处理

5)     接收界面勾选调用外部则必须在 receive方法里实现逻辑处理

6)     实现destroy(如果需要)

destroy方法在用户的业务流程运行结束时调用,用于消耗变量或对象。

7)     这种result值为error表示报文接收错误,设置为assert表示断言错误,这个设置会导致虚拟用户执行被认为失败

 

KylinPETImpl.java文件的send方法插入发送消息处理代码,并返回最终的发送消息数据;receive方法插入接收消息处理代码,并返回最终的接收消息数据。

注意:

1、   sendreceive抛异常时agent会收到,如果自己捕获处理,工具无法将异常打印到前台界面(调试时)。因此建议自己捕获异常后再使用new Exception("")抛出,工具会捕获并输出到运行界面的的日志表格里;如果自己没捕获而产生异常,工具会自动捕获。

2、   父类AbstractKylinPET.java里的sendText_JAVAsendBinary_JAVAreceive_JAVA是给JAVA协议用的,HTTPRTSPSIP、文本、二进制这些协议的调用外部只需要实现sendreceive方法。

3.3 打包到JAR包,上传到平台

KylinPETImpl打成JAR包(名字无限制,只需确保包名为kylinPET),然后将其与引用的第三方的JAR包一起打包

         

请确保代码编译通过,建议使用eclipse打包插件打包。

说明:

1、   agent实现热加载而不需要重启agent,因此可根据需要重新修改KylinPETImpl代码并打包,再覆盖原来的JAR包。

2、   可以将引用第三方的JAR包也跟KylinPETImpl打包在一起,也可以不打在一起

3.4 在脚本配置需要调用外部扩展的发送或接收节点

3.4.1 发送节点勾选外部调用

在需要调用外部发送接口的发送节点界面勾选外部调用

1)     替换参数前:表示工具还没将脚本的可变参数替换就调用外部jar包,一般可以用于用户自己生成新的参数值(加密或复杂公式),然后存放到parameterMap里,工具发送前再替换脚本里的参数,实现脚本可变参数替换成jar包生成的参数值;

2)     替换参数后:表示工具已经将脚本里的可变参数全部替换成实际的参数值了,在发送给服务器前,调用外部jar。一般应用于对发送的报文整个进行加密或特殊替换。

3.4.2 接收节点勾选外部调用

在需要调用外部接收接口的接收节点界面上勾选外部调用

1)     关联之前:表示在上图关联参数之前调用jar包,如果数据是加密的,可以实现调用jar包进行解密后,再工具自动调用关联

2)     关联之后:表示关联参数之后调用jar包,如通过工具获取内容后,对内容进行计算或加密

3.5 调试脚本,通过日志检查是否调用成功

运行界面的的控制页面点击调试配置运行用例,则运行界面的会通知连接的每一个执行代理器执行一个用户,并将执行的过程日志返回给运行界面的。用户可通过日志判断配置是否正确,如果错误,可根据错误信息调整配置。

如果运行界面的日志界面打印call KylinPETImpl when send则表示发送调用了KylinPETImplsend方法;如运行界面的日志果界面打印call KylinPETImpl when receive则表示发送调用了KylinPETImplreceive方法。

4 jmeterbeanshell类似

不同之处是,beanshell是在执行过程动态编译,比较耗时耗性能;而kylinPET是调用jar包,性能更好,而且可以配合eclipse编写jar包,调试与验证。