APP下载

C/S架构系统性能测试虚拟用户脚本编写技术研究与实现

2018-02-09侯建华黄兆森房春荣李良英

计算机与数字工程 2018年1期
关键词:序列化服务器端脚本

侯建华 黄兆森 房春荣 李良英

(1.珠海南方软件网络评测中心 珠海 519000)(2.南京慕测信息科技有限公司 南京 210000)

1 引言

性能测试[1]的目的通常是评估被测软件服务器端的性能,它通过性能测试脚本模拟大量客户端同时对服务器端发起请求来测试服务器端的性能。

客户端/服务器端的架构一般可分为B/S架构和C/S架构。目前B/S架构的系统比较流行,且B/S架构的系统客户端逻辑简单,采用了标准协议,因此对B/S架构的系统进行性能测试脚本录制就比较简单。目前业界供参考的性能测试脚本录制资料大部分都是针对B/S架构系统的,缺乏针对C/S架构系统的性能测试脚本录制参考资料和案例。

C/S架构性能测试脚本录制或编写通常会遇到加密或二进制报文难以参数化、脚本无法识别内存对象等问题。本文通过一个实际案例展示了解决这些问题的过程。

2 概述

本文选取了某海关的客(货)车通关管理系统作为研究案例,该系统主要用于海关人员对通关车辆和人员以及企业备案情况的核查和监控。该系统为C/S架构,采用HTTP协议进行通信,客户端采用。NET开发技术,使用C#语言开发,客户端存在复杂的业务逻辑,单个客户端存在多线程与服务器端交互。服务器端采用Java开发技术,通信内容加密且进行了二进制序列化。这是一个非常具有挑战性的性能测试项目,为进一步提高评测中心性能测试的技术能力,评测中心利用该项目开展了一系列针对C/S架构系统性能测试虚拟用户脚本编写方法的技术研究,解决了C/S架构性能测试脚本录制或编写遇到的加密或二进制报文难以参数化、脚本无法识别内存对象等问题。

3 C/S架构系统性能测试虚拟用户脚本编写技术研究

3.1 问题说明

C/S架构系统性能测试虚拟用户脚本的编写与B/S架构系统性能测试虚拟用户脚本的编写一样主要包括两个步骤,即虚拟用户脚本录制和虚拟用户脚本的参数化[2]。但C/S架构系统性能测试虚拟用户脚本在编写过程中会遇到许多特有的问题,本案例在编写虚拟用户脚本时遇到了5个问题:

1)当被测系统的客户端与服务器端进行通信的报文是密文时,如何对报文进行参数化;

2)当被测系统通过二进制序列化的方式在客户端与服务器端之间传输内存中的对象时,如何对传输的对象进行参数化;

3)如何确定要编写的虚拟用户脚本的语言;

4)当客户端与服务器端之间传输的报文的数量和顺序不固定时,如何确定性能测试时要发送哪些报文;

5)如何模拟胖客户端的业务逻辑。

3.2 问题分析及解决方法

3.2.1 密文报文的参数化

本文的案例采用的是HTTP协议,笔者采用HP Loadrunner工具[3]选择HTTP协议录制该C/S架构系统的虚拟用户脚本[4],发现录制的脚本中客户端与服务器端进行通信的报文是密文,性能测试技术人员无法理解报文,进而导致无法对报文进行参数化。该问题有四种解决方法:

1)若加密解密操作消耗的系统资源少,对系统性能影响不大,则可以忽略加密解密操作对性能测试结果的影响,由系统开发方协助提供一个未采用加密技术的相同系统进行性能测试;

2)由系统开发方将加密解密方法封装成组件提供给测试方,并告知测试方组件的使用方法,测试方在虚拟用户脚本中调用组件进行加密解密操作[5];

3)测试方在虚拟用户脚本中调用相同加密解密算法的第三方组件进行加密解密操作;

4)在虚拟用户脚本中自行编写加密解密算法代码。

由于被测系统的加密解密操作对系统性能影响不大,本次性能测试采取了第一种措施解决了该系统的报文加密问题。

3.2.2 二进制报文的参数化

成功解决通讯报文为密文的问题后,再次对该C/S架构系统录制了脚本,但脚本中仍然存在部分人工不可读的内容。经与该C/S架构系统的软件开发方技术人员进行沟通,确认这些内容为采用二进制序列化方式传输的内存对象。

当被测系统通过二进制序列化的方式在客户端与服务器端之间传输内存中的对象时,性能测试技术人员无法理解二进制的对象内容,因此无法直接对报文中的二进制对象进行参数化。为解决此问题,笔者首先考虑了让系统开发方协助将被测系统改为采用XML方式进行序列化的方法,这种方法虽然可以使序列化后产生的数据流报文可读,但会对被测系统的性能产生较大影响,导致性能测试的结果与实际系统性能相差较大,因此,笔者最终否定了这种方法。为了能够进行参数化又同时不对性能测试结果产生太大的影响,本次性能测试只能在虚拟用户脚本中对数据流报文先进行反序列化操作,使报文转化为可读的内存中的对象,再对内存中的对象进行参数化。

3.2.3 虚拟用户脚本语言的选择

在HP Loadrunner中选择HTTP协议录制脚本时只支持C语言的虚拟用户脚本[6],但该C/S架构系统的客户端采用的是C#语言对内存对象进行了二进制序列化和反序列化,若采用C语言的虚拟用户脚本,难以对该二进制数据流报文进行序列化和反序列化操作,也难以识别反序列化后的内存对象,导致无法对反序列化后的内存对象进行参数化[7]。因此,本次性能测试不能选择C语言作为虚拟用户脚本语言。

在选择虚拟用户脚本语言时需考虑以下三方面的内容:

1)如果需要利用性能测试工具通过录制脚本的方式产生虚拟用户脚本,首先要选择通讯协议,然后选择该通讯协议支持的脚本语言;

2)如果需要对特定语言的内存对象进行参数化,必须选择能够识别该内存对象的虚拟用户脚本语言;

3)如果需要调用客户端的组件,必须选择能够识别该组件的虚拟用户脚本语言。

经过仔细的分析和比较,笔者最终选择了支持识别。NET内存对象的C#语言作为虚拟用户脚本语言[8]。由于HP Loadrunner的HTTP协议不支持C#语言脚本的录制,只能采用人工编写C#语言虚拟用户脚本,模拟C/S架构系统的客户端发送和处理HTTP报文。

3.2.4 多线程报文的处理

笔者根据该C/S架构系统的业务特点和技术特点对业务数据和技术数据进行参数化操作[9],为尽快查找需要参数化的数据,笔者再次抓取了该C/S架构系统客户端与服务器端进行交互的报文,并将两次抓取的报文进行了对比,结果发现客户端与服务器端之间传输的报文的数量和顺序是不固定的。

当出现这种情况时,性能测试的技术人员就容易被报文所困扰,因为不知道在执行测试时应该如何发送报文。此时应分析出现这种情况的原因,经过与系统开发方相关人员进行沟通得知,被测系统为了维持会话状态,客户端有一线程每隔一段时间就会向服务器端发送一个心跳报文,所以导致捕捉的报文的数量和顺序不固定。由于心跳报文与业务操作无关,因此可将心跳报文过滤后再对业务操作产生的报文进行参数化。在发送报文时也可以像真实客户端一样采用多线程技术每隔一段时间发送一个心跳报文。

3.2.5 客户端业务逻辑的模拟

C/S架构系统的客户端是胖客户端,因此,不可避免地会在客户端包含业务逻辑[10]。性能测试要在虚拟用户脚本中模拟客户端发送报文,如果客户端包含业务逻辑,则服务器端的返回报文和客户端随后发送的报文之间可能就会存在较复杂的逻辑关系。

性能测试技术人员只能看到报文,无法看到报文在客户端是如何进行计算处理的。当需要从返回报文中提取数据,再对即将发送的报文进行参数化时,只有正确分析出这些报文之间的逻辑关系才能在虚拟用户脚本中正确地模拟系统客户端进行业务操作。

该C/S架构系统的客户端就存在业务逻辑,笔者通过对系统的业务逻辑的理解和系统开发方的协助,完成了虚拟用户脚本的参数化,且成功回放了参数化后的虚拟用户脚本,对应的业务操作也已生效。

3.3 解决方案

通过对本案例遇到的问题和解决方法进行梳理,可形成C/S架构性能测试虚拟用户脚本编写的解决方案,见图1。

3.4 小结

本解决方案主要共享如下:

1)C/S架构的客户端与服务器端进行通信的报文是密文时,可选择取消加密或调用加密解密组件或自行编写加密解密算法的方法进行参数化;

图1 CS架构性能测试虚拟用户脚本编写解决方案

2)C/S架构通过二进制序列化的方式在客户端与服务器端之间传输内存中的对象时只能先将报文反序列化为内存中的对象后再进行参数化;

3)选择虚拟用户脚本语言时需考虑工具支持的协议和脚本语言之间的关系以及所选择的语言是否需要识别内存对象和组件;

4)当客户端与服务器端之间传输的报文的数量和顺序不固定时应考虑客户端是否存在多线程或多进程同时发送报文。

4 结语

结合实际测试项目开展了C/S架构系统性能测试虚拟用户脚本编写方法的技术研究,并对C/S架构系统性能测试虚拟用户脚本编写过程中遇到的问题和解决方法进行了描述。本次对C/S架构系统性能测试虚拟用户脚本编写技术的研究内容和结果总结如下:

1)当被测系统的客户端与服务器端进行通信的报文是密文时可选择让系统开发方取消加密或调用加密解密组件或自行编写加密解密算法的方式进行参数化;

2)当被测系统通过二进制序列化的方式在客户端与服务器端之间传输内存中的对象时只能先将报文反序列化为内存中的对象后再进行参数化;

3)在选择虚拟用户脚本语言时需考虑测试工具支持的协议和脚本语言之间的关系以及所选择的语言是否需要识别内存对象和组件;

4)当客户端与服务器端之间传输的报文的数量和顺序不固定时应考虑客户端是否存在多线程或多进程同时发送报文;

5)C/S架构的系统在编写虚拟用户脚本时可通过对系统的业务逻辑的理解和系统开发方的协助查找出报文之间可能存在的复杂逻辑关系。

猜你喜欢

序列化服务器端脚本
酒驾
Linux环境下基于Socket的数据传输软件设计
如何建构序列化阅读教学
某物资管理调度系统的数据序列化技术
自动推送与网站匹配的脚本
基于Qt的安全即时通讯软件服务器端设计
初中生写作序列化实践与思考
基于Qt的网络聊天软件服务器端设计
分层次序列化训练增强考场写作的增分因素
基于C/S架构的嵌入式监控组态外设扩展机制研究与应用