1 背景
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) 性能工具无法识别验证码图片,因此无法提交正确的验证码。希望可以与服务器交互获取或者用户自己编写验证码算法。
基本类似WEB业务,如果出现下面这些场景,工具将无法模拟正常业务交互流程。
1) 发送或接收的消息部分或全部内容需要加密或解密
工具提供了文本与二进制应用层协议(socket协议),而有些协议通过使用这两种协议无法满足自身需求,需要进一步的处理。如QQ协议,是二进制协议(UDP)。
2) 发送的请求消息需要进一步处理
如根据随机产生的参数、或者服务器得到的参数(如会话ID),然后需要进行计算处理产生一个结果
3) 接收的消息需要处理,从响应消息获取内容,并进行处理(如1+1计算)后,将结果作为参数提供给后续的请求消息。
4) 性能工具支持从响应消息提取参数的功能(如通过查找左文本、右文本方式提取中间的内容作为参数)无法满足某些场景。
2 解决方法
上面不支持场景可以归结为工具本身处理能力有限,无法支持所有的业务场景(业务场景复杂、或公司在标准协议上加入私有因素)。
解决方法需要测试工具提供发送与接收接口,由用户自己实现接口代码,对请求消息进行处理(如加密、计算),对响应消息进行解析(如解密、提取参数、计算结果)。
kylinPET测试工具通过扩展类的方式实现该功能。
3 如何实现扩展类功能(只支持JAVA)
当扩展类没修改接收消息时C等于D(如只提前内容计算参数)
注:不需要实现sendText_JAVA、sendBinary_JAVA及receive_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、
send与receive抛异常时agent会收到,如果自己捕获处理,工具无法将异常打印到前台界面(调试时)。因此建议自己捕获异常后再使用new Exception("")抛出,工具会捕获并输出到运行界面的的日志表格里;如果自己没捕获而产生异常,工具会自动捕获。
2、
父类AbstractKylinPET.java里的sendText_JAVA、sendBinary_JAVA与receive_JAVA是给JAVA协议用的,HTTP、RTSP、SIP、文本、二进制这些协议的调用外部只需要实现send与receive方法。
将KylinPETImpl打成JAR包(名字无限制,只需确保包名为kylinPET),然后将其与引用的第三方的JAR包一起打包
请确保代码编译通过,建议使用eclipse打包插件打包。
说明:
1、
agent实现热加载而不需要重启agent,因此可根据需要重新修改KylinPETImpl代码并打包,再覆盖原来的JAR包。
2、
可以将引用第三方的JAR包也跟KylinPETImpl打包在一起,也可以不打在一起
在需要调用外部发送接口的发送节点界面勾选“外部调用”
1)
替换参数前:表示工具还没将脚本的可变参数替换就调用外部jar包,一般可以用于用户自己生成新的参数值(加密或复杂公式),然后存放到parameterMap里,工具发送前再替换脚本里的参数,实现脚本可变参数替换成jar包生成的参数值;
2) 替换参数后:表示工具已经将脚本里的可变参数全部替换成实际的参数值了,在发送给服务器前,调用外部jar包。一般应用于对发送的报文整个进行加密或特殊替换。
在需要调用外部接收接口的接收节点界面上勾选“外部调用”
1)
关联之前:表示在上图”关联参数”之前调用jar包,如果数据是加密的,可以实现调用jar包进行解密后,再工具自动调用关联
2) 关联之后:表示关联参数之后调用jar包,如通过工具获取内容后,对内容进行计算或加密
在 运行界面的的“控制”页面点击“调试配置”运行用例,则运行界面的会通知连接的每一个“执行代理器”执行一个用户,并将执行的过程日志返回给运行界面的。用户可通过日志判断配置是否正确,如果错误,可根据错误信息调整配置。
如果运行界面的日志界面打印“call KylinPETImpl when send”则表示发送调用了KylinPETImpl的send方法;如运行界面的日志果界面打印“call KylinPETImpl when receive”则表示发送调用了KylinPETImpl的receive方法。
4 与jmeter的beanshell类似
不同之处是,beanshell是在执行过程动态编译,比较耗时耗性能;而kylinPET是调用jar包,性能更好,而且可以配合eclipse编写jar包,调试与验证。