系列原创:性能测试新手误区
经常会有性能测试新手问这样的问题:
C/S的系统如何录制,应该选择什么协议呢?
待测系统A的一个功能,是由B系统调用的,也需要搭建B系统的测试环境并对其录制么?
我的回答是,先弄清楚你想测的是什么?对它而言,压力又是什么?
新手总是想着如何录制客户端的操作,如何模拟客户端的点击。这种想法应该是受到了主流测试工具影响,性能测试的入门基本都是从工具开始,比如使用最广的LR,其最方便好用的功能应该就是录制了。但是需要清楚的是,录制只是为性能测试提供便利的一个功能(可以傻瓜式的产生向服务器施加压力的脚本),录制本身并不是性能测试的根本或者所必需,能够产生压力的那些脚本或是程序才是关键所在。
第一个问题,比如一个即时通讯类的软件如何测试?
首先要明确你想测的是客户端还是服务端,如果是服务端,那么服务端承受的压力是什么呢?
是每一条消息都要经过服务器么?
服务器是要将消息进行存储,还是仅仅转发?
不同的功能,如普通会话和多人会话,从服务端来看的区别是什么?
客户端是如何同服务端通信的,是采用了一些标准的开源协议(如XMPP),还是经过了自己的重新扩展?
……
为了回答那两个看似很简单的问题(想测什么?压力是什么?),其实你需要了解整个系统的运行方式。这些信息完全可以从一些设计文档或者开发人员的口中获取到,并不需要你能读懂源码。
如果我知道了这个软件使用了XMPP协议,一条普通的会话是客户端向服务器发送了这样一条信息:
消息类型:普通 接收人:A 消息内容:XXX
而多人会话是客户端发送了这样的信息:
消息类型:多人 接收人:A, B, C 消息内容:XXX
那么应该会知道,表面上这些不同的功能,其实只是客户端发送信息中个别字段的区别而已。那么我就可以想办法直接向服务器发送这些信息,让服务器根据接收信息的内容去完成相应的功能。也许根本没有必要去想如何录制客户端发起一个会话并发送消息这个动作,或者发送文件、群消息等等其他操作。
至于如何实现,如果你有编码能力,可以将开源代码引入到自己的测试代码中(需是标准协议),否者可能需要让程序的开发人员实现一个测试程序。不要不敢开口,开发人员协助进行性能测试是很正常的,而且这种工作量不会很大,只是把程序中的一些代码封装成一个可配置可方便调用的执行文件。
让开发人员来实现测试工具不丢脸,怕的是你自己不知道测试工具应该实现成什么样。(当然,如果自己可以看源码来实现工具那就更好了)
第二个问题,同样的,所谓的B系统调用A系统这个动作,是如何实现的?
会不会只是一个简单的HTTP请求?
或者是调用A系统的一个webservice接口?
你要测的是A的这个功能么?
如果是,那我们为什么一定要通过B系统来录制这A的这个功能呢?完全可以直接向A发送请求或者是调用接口(如LR中的webservice协议)。
至于具体如何做,可能有很多现成的接口测试工具,也可能仍然需要开发人员的协助。比如B与A之间传递的数据是经过加密的,那对(黑盒)测试来说就会非常困难,这种情况下,确实有可能通过B来录制会更简单。
在51testing上看到的一个问题,问如何测试一个统计报表的另存为(excel)功能。
点这个按钮后,服务器会生成一张报表,然后弹出浏览器的另存为对话框,保存为本地文件。提问题的这个人遇到的困难是,LR中好像没法录制“另存为”这个动作。
之所以会有这样的问题,根本原因还是没有理解系统的运行原理,没有区分哪是服务器、哪是客户端。
一般来说,这个过程是这样的:
- 点另存为按钮时,向服务器发送了一个计算报表的请求,这个请求中会包含一些参数,如报表类型、统计时间等等。
- 服务器计算完成后,将结果数据返回给客户端(浏览器)。
- 浏览器本身的功能,将数据保存为一个本地文件。
(这里假设了计算过程是另存为按钮触发的,如果是打开页面时就计算完,那点按钮时甚至有可能根本没与服务器进行交互)
如果明白了这个过程,那么就不会纠结于录制“另存为”这种事情了,你要做的只是向服务器发送一个请求,然后接收响应数据。
那么就不需要生成本地文件了么?当然不是,否则怎么验证返回的数据没有问题呢。只不过这个文件的操作需要自己来实现了,创建文件、写入数据、关闭文件。
最后再总结一下要点:
- 理解系统的运行原理
- 区分服务端和客户端
- 弄清楚你要测的是什么,哪些东西其实是可有可无的
- 要模拟的是服务器的压力,而不是客户端的操作
- 录制只是一种手段,很多情况下并不是最佳选择
- 开发人员的协助是应当的,但前提是你要明确的知道应该如何测试