咨询QQ:2083503238、1684129674、480934277(请勿重复咨询) 咨询微信:qiangfans
高性能性能测试开发方法
- 2018-04-20 08:26:00
- 测试帮日记
- 原创 1184 投稿得红包
点击链接加入QQ群 522720170(免费公开课、视频应有尽有):https://jq.qq.com/?_wv=1027&k=5C08ATe
1. 背景技术
1、 关于软件的性能测试:通常的做法是编写性能测试代码(脚本),性能测试代码实质上就是自动执行的客户端程序,可以简称为性能测试客户端。然后建立起性能测试进程,在进程内并发运行多个性能测试客户端访问应用服务,这样就达到了模拟多个客户端的工作压力进行性能测试的目的。
2、 互联网应用的兴起, 对性能测试提出了越来越大的挑战。 海量用户同时在线使用是互联网应用的显著特征,因此,互联网应用的性能测试要求测试场景中能够保证有大量的性能测试客户端同时运行,这样才能够达到充分真实模拟的目的。
现有方案一及其缺陷: 现有的性能测试方法绝大多数的情况下都是在使用某一种性能测试工具, 以被使用最多、评价最好的loadrunner 为例,其测试方法的过程如下:
· 测试代码的生成: 测试代码由2种方式得来,录制被测试应用客户端的行为,然后做参数化处理;或者直接开发出此类代码供使用
· 测试代码的特点:只模拟一个客户端的行为;所有代码都被设计成在一个线程内顺序执行。
· 测试执行:loadrunner提供测试进程,进程内为每一个性能测试客户端提供一个独占的线程。假如控制多台测试机(m台)、每台测试机启动多个测试进程(n个),每个测试进程包括多个测试线程(t个),这样,同时参与测试的客户端个数是 m*n*t 个。
现有方案示意图:
注:白色区域为测试人员开发的代码
缺陷:
从软件设计性能的角度来考虑, 以上设计不是一个高性能的方案,测试机线程个数、cpu使用率、内存等系统资源随测试压力的增加很快就会成为性能瓶颈。所以这样的方案只能测试一些低压力的场景,如果测试互联网业务,测试进程的性能问题会导致测试无法进行或者时间、资金、人员等成本十分高昂。
在设计过程中没有考虑到测试客户端互相通信的需求,比如性能测试客户端A在某个测试时刻要求性能测试客户端B完成某个功能或变更某种属性,这是无法办到的,因为某个性能测试客户端在设计上是封闭的,导致测试场景设计上不够灵活。
优点:
测试进程、进程的内线程都由测试工具来控制,测试代码无需关心,测试代码独立、无互相通信的需求,这样都保证了测试代码简单易开发,易上手,低技术级别的人员也可以完成性能测试任务。这样的设计结构也保证了商业的性能测试工具能够容易的控制license,保护其商业利益。
2. 技术方案描述
性能测试5月班报名中,QQ 2083503238
要解决的技术问题:
极大地提供测试进程承载性能测试客户端数量的能力。提供性能测试客户端互相通信的支持
整体思路:
从纯粹软件的视角来考察测试进程,可以定义为:包括多个测试客户端,每个客户端可以自动运行测试业务。
进一步分析,可以发现测试进程除了测试业务必须自动执行以外,其它方面和一个应用服务程序没有本质差异,也包括大量内存对象,也需要高并发、高吞吐量地处理请求和应答消息。
所以,为了实现高性能的测试进程,必须摒弃测试代码只是完成一个客户端功能的思路,摆脱测试工具对线程的控制,以设计互联网高性能应用服务的思路来解决问题。
在设计高性能服务程序时,线程池几乎是一个必选项,测试进程也需要引入线程池做为提高性能的必要手段。
测试客户端离开了依附的线程如何能够自动的执行下去,也需要一个方法得到保证。
方案一:
1. 测试进程继续由成熟的测试工具提供或者由开发者自己开发。
2. 必须由性能测试开发人完成的部分包括以下部分:
a. 性能测试客户端代码:不再只是一段顺序执行的代码;而是一个包括必需的客户端属性和业务行为代码合集,在面向对象的语言中,称为“类”。所有客户端对象存储在同一个数据结构中,比如数组、哈西表等。
b. 线程池:提供线程完成性能测试客户端的业务行为;每开始一次业务操作前从池中申请一个空闲线程、业务操作结束后归还。
c. 调度定时器: 周期性地选择多个性能测试客户端和下一步他们需要执行的业务操作、为每个客户端和对应的业务操作从线程池选择空闲线程,执行。
示意图如下:
注:白色区域为测试人员开发的代码
优点:
线程池引入极高地提高了性能。
测试客户端转变了编程方式和存储方式、统一调度定时器的引入,能够更灵活方便地控制测试过程、控制场景、特别是当测试客户端需要协调调度的时候;测试客户端之间的通信需求通过进程内的过程调用就可以完成。
3. 技术方案的关键点和保护点
本技术方案与现有方案不同的部分,为了达到有益效果不可缺少的部分,可以是一个或多个。如果是多个的话,按重要程度从高到低的顺序列出。
重新定义测试进程的结构引入线程池极大提高了性能
重新定义测试进程的结构引入调度定时器配合线程池使用
性能测试客户端由原来的一段顺序执行的代码转变为属性和行为构成的单元(在面向对象的编程中称为“类”),并且存储在一个数据结构中。