性能测试一--主流测试工具

1 工具引入

性能测试的主要手段是通过产生模拟真实业务的压力对被测系统进行加压,与此同时监控被测系统的各项性能指标,研究被测系统在不同压力情况下的表现,找出其潜在的性能瓶颈。

那么,如何对系统进行加压,又如何对系统的指标进行监控呢?这里,就需要引入性能测试工具了。

当前市面上已经有了很多性能测试工具,但不管是哪一款,基本都会包含如下几个核心的模块:

  • 压力生成器(Virtual User Generator)

  • 结果采集器(Result Collector)

  • 负载控制器(Controller)

  • 系统资源监控器(Monitor)

  • 结果分析器(Analysis)

原理结构如下图所示:

原理结构图

2 主流工具介绍

2.1 LoadRunner(国外商用)

2.1.1 简介

LoadRunner是一款C/S架构的商业版性能测试工具,通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,能够对整个企业架构进行测试。免费开放了50个虚拟用户。

2.1.2 优点

  • 支持的协议很多,很多不常用的协议都支持

  • 学习资源丰富,有很多书籍、课程、网上资源可供参考

  • 功能很完善、庞大

2.1.3 缺点

  • 价格昂贵,一般小企业无力承担,最新的12版本无破解版,之前的破解版仿真度较差

  • 对一些视频协议支持的不太好

  • 对浏览器最新版支持的不太好,最新的loadrunner12只支持ie11,对其它浏览器如谷歌、火狐等支持的较差

  • 不支持二次开发

2.1.4 主要功能

  • 轻松创建虚拟用户。使用LoadRunner 的Virtual User Generator,能很简便地创立起系统负载。该引擎能够生成虚拟用户,以虚拟用户的方式模拟真实用户的业务操作行为。

  • 创建真实负载。Virtual users 建立起后,需要设定负载方案,业务流程组合和虚拟用户数量。用LoadRunner 的Controller,能很快组织起多用户的测试方案。

  • 录制脚本

  • 参数化。可以让脚本更好的适应环境变化,提高脚本适应能力。场景运行时,每个用户使用不同参数,提高真实性。

  • 关联与session。对于脚本,很多时候,我们处理数据的时候,是需要对服务端返回的数据进行解析,而服务端返回的数据如果每次都是变化的话,每次我们都是需要动态获取,这个时候就需要关联。简单来说,就是处理服务端返回的动态数据。

  • 创建集合点。集合点是为了让Vuser集合,然后同时做某个操作,只要在相应的请求前设定有意义的集合点即可。

  • 执行监控。在启动性能测试之后,系统会按照设定的场景产生压力。在执行过程中,需要观察脚本执行的情况,被测试系统的性能指标情况,LR监控来查看这些信息。

  • 分析报表。一次性能测试执行完成,系统会创建各种性能分析报表,包括cpu相关、吞吐率、并发数等。


2.2 JMeter(开源免费)

2.2.1 简介

JMeter是 Apache 开源基金会提供的完全开源的性能测试工具,旨在加载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的,但此后已扩展到其他测试功能。JMeter也可用于测试静态和动态资源,Web动态应用程序的性能,用于模拟服务器、服务器组、网络或对象上的繁重负载,以测试其强度或分析不同负载类型下的总体性能。

2.2.2 优点

  • 开源免费

  • 非常小巧,不需要安装,但需要JDK环境

  • 功能较强大,jmeter设计之初只是一个简单的web性能测试工具,但经过不段的更新扩展,现在可以完成数据库、FTP、LDAP、WebService等方面的测试

  • 提供了比较高级的扩展能力,允许自己定义和扩展新的协议支持,比如扩展支持阿里提供的Dubbo协议的JMeter插件等

  • 提供了HTML测试报告和Jenkins集成的能力,比较方便地实现一些基础的持续测试。

  • 社区比较完善,接受度高,比较容易入门。

2.2.3 缺点

  • 不支持IP欺骗

  • 无法验证JS程序,也无法验证页面UI

  • 并发数的数量级不够大

  • 脚本的维护需要保存为本地文件,而每个脚本文件只能保存一个测试用例,不利于脚本的维护

  • 报表较少,结果分析不够详细

  • 录制功能、环境调试功能不够强大

2.2.4 核心组件

  • 逻辑控制器( Logic Controller):逻辑控制器确定采样器的执行顺序。

  • 配置元件( Config Element):配置元件可用于设置默认属性和变量等数据,供采样器获取所需要的各种配置信息。

  • 前置处理器( Per processors):在实际的请求发出的请求进行特殊的处理。例如, Http Url重写修饰符可以实现URL重写,当发送的请求中有SessionID信息时,可以通过该前置处理器填充发出请求的实际SessionID。

  • 定时器( Timer):用于在操作之间设置等待时间。

  • 采样器( Sampler):采样器是JMer主要执行组件,它用于向服务器发送一个请求并记录响应信息,包括成功/失败、响应时间、数据大小等。 JMeter支持多种不同的采样器可根据设置的不同参数向服务器发送不同类型的请求(HTTP、FTP、TCP等)

  • 后置处理器( Post processors):后置处理器一般放在采样器之后,用来处理服务器的返回结果。

  • 监听器( Listener):用于监听测试结果。此外,监听器还具备查看、保存和读取测试结果的功能。


2.3 Locust(开源免费)

2.3.1 简介

Locust是一个简单易用、分布式的开源负载测试工具,使用 Python 代码定义用户行为,也可以仿真百万个用户。Locust 主要为网站或者其他系统进行负载测试,能测试出一个系统可以并发处理多少用户。Locust 是完全基于事件的,因此单个机器支持几千个并发用户。相比其他许多事件驱动的应用,Locust 不使用回调,而是使用轻量级的处理方式协程。

2.3.2 优点

  • 支持模拟数十万的用户行为,大幅提高单机的并发能力

  • 占用内存少

  • 跨平台且易于扩展的

  • 小巧轻量

  • 可以让性能测试左移

  • 支持二次开发

  • 脚本灵活

2.3.3 缺点

  • 支持的协议有限

  • 需要python基础,上手有一点门槛

  • 结果分析功能不够强大

  • 不支持录制回放

  • 参数化,校验等都需要自行编写代码

  • 容易被入侵,事件 I/O 和协程的所有繁重工作都委托给 gevent

2.3.4 核心库

  • gevent。gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。

  • flask。Python编写的轻量级Web应用框架。

  • Requests。Python Http库。

  • msgpack-python。MessagePack是一种快速、紧凑的二进制序列化格式,适用于类似JSON的数据格式。msgpack-python主要提供MessagePack数据序列化及反序列化的方法。

  • six。Python2和3兼容库,用来封装Python2和Python3之间的差异性。

  • pyzmq。pyzmq是zeromq(一种通信队列)的Python绑定,主要用来实现Locust的分布式模式运行。


2.4 kylinPET(国产商用)

2.4.1 简介

kylinPET是一款功能强大的国产商用的性能测试工具。结合了LoadRunner和JMeter的特性,具有功能强大、界面友好、操作方便、上手快、资源占用率低等特点。

2.4.2 优点

  • 高性能、跨平台。性能高,占用资源。一台高性能服务器可以支持几十万并发,需启动多个Agent,每个Agent虚拟IP。

  • 无需编程,门槛低,上手快。

  • 分布式、多任务。一个测试场景包括多个测试任务(脚本),每个任务可以是不同业务,模拟正常业务场景。

  • 支持多种并发模型:稳定速率、递增、递减、波浪型、振荡型、随机、波浪与振荡

  • 可以通过调用JAVA类实现扩展

  • 数据分析和报告功能强大,支持多种图表

2.4.3 缺点

  • 收费

2.4.4 主要模块

  • Scripter:用于创建模拟用户操作场景的脚本;通过录制方式(抓包文件、实时抓包、代理)创建脚本,然后界面编辑脚本(设置参数、关联参数);提供脚本回放

  • Controller:创建测试场景(支持分布式、多种场景并发);设置并发模型;设置统计指标、告警阈值;接收日志、统计数据并图表展示

  • Analysis:分析测试场景的执行结果,指标曲线展示。曲线类型包括某时刻值、平均值、最大值、最小值;支持多个结果交叉比较;支持曲线合并比较;支持放大、缩小、过滤;支持日志过滤分析;支持产生HTML报告

  • Load Agent(执行代理器)接收Controller的命令与脚本,并发执行用户场景,并将统计指标数据及日志返回Controller。支持系统虚拟IP、工具协议栈虚拟IP

  • Monitor Agent(监控代理器):安装在服务器系统里,监控服务器系统指标(cpu、内存、I/O、吞吐量等指标),实时将系统运行指标返回给Controller

  • Media Agent(媒体代理器):媒体指标监控,接收Agent的监控目标然后将每条媒体流(RTP、UDP、OTT)的MDI(TS流)、速率、丢包数、时延、抖动、TCP重传数返回给Controller

3 工具选择

3.1 工具对比

工具对比

3.2 选择标准

  1. 成本
  • 软件成本:不差钱的建议选择商业软件,毕竟功能是真的强大和完善。
  • 学习成本:当然是学习成本越小越好。对于LoadRunner这种操作指南都能出一本书的,还是放后面一点吧。
  1. 接口类型
  • 被测接口类型包括http和dubbo,则选择的工具应具备测试此类接口的功能。
  1. 分析实际的压测场景
  • 业务场景很复杂时,选择的工具要能支持构建复杂场景的测试脚本
  1. 被测系统需要提供多大压力
  • 若需要较大压力,则需要考虑压力测试工具是否支持分布式,能否快速扩展 agent。
  1. 被测系统的周期性需求
  • 若需求变动较快,则需要考虑脚本编写便捷性和易于保存拓展性。
  1. 二次开发的需求
  • 能否满足自定义二次开发也是一个关键因素,这意味着工具的生命力。
  1. 学习资料充足
  • 若选择的工具太小众,学习资料较少,不利于后续的学习,遇到问题之后的解决也会耗费很多时间和精力。

你可能感兴趣的:(性能测试一--主流测试工具)