一、性能测试基础
1、性能测试该怎么做?
利用工具模拟真实用户操作。
2、性能测试基础:
性能:事物的性质和能效 -->效率性能 (时间/资源/容量)思考:如何评价软件系统的性能?
快慢:衡量系统的处理效率 (响应时间)多少:衡量系统的处理能力(单位时间内,能处理多少个事物)
3、性能测试常见的性能指标:
响应时间:rt (系统从发出请求开始直到请求结束的时间)
吞吐量:tps / rps / qps (个/ 时间) throughput : 网络带宽/磁盘io kb/单位资源利用率: cpu/内存/磁盘大小/磁盘io/网络带宽。。。(第三方工具:监控平台)
4、性能测试分类: 根据测试需求
负载测试 load testing
不断的向服务器加压,直到预期的指标 或者 部分的系统资源达到上限。目的:找到系统的最大负载能力。
压力测试(稳定性测试)
目的:验证系统是否稳定。在负载测试基础上不断加压。
并发测试
单位时间内同时向服务器发送请求。目的:检验当大量用户同时访问一个应用、功能模块或者数据的时候,观察系统是否存在事物冲突或者锁升级的现象。
配置测试
运行时硬件的配置要求。
基准测试
少量用户验证服务器资源的消耗情况。
容量测试
系统处于最大负载状态或某项指标达到所能接受的最大阈值下对请求的最大处理能力
5、性能测试的关键:
需求分析 --> 分析被测系统的架构/分析被测系统的业务逻辑/具体性能指标。
二、性能测试工具对比
项目 Jmeter Loadrunner Locust 授权方式 开源 商业收费 开源 开发语言 Java C/Java Python 测试脚本形式 GUI C/Java Python 并发机制 线程 进程/线程 协程 单机并发能力 低 低 高 分布式压力 支持 支持 支持 资源监控 不支持 支持 不支持 报告与分析 简单图表 完善 简单图表 支持二次开发 支持 不支持 支持
1、LoadRunner 是非常有名的商业性能测试工具,功能非常强大。使用也比较复杂,目前大多介绍性能测试的书籍都以该工具为基础,甚至有些书整本都在介绍LoadRunner 的使用。
2、Jmeter 同样是非常有名的开源性能测试工具,功能也很完善,它可以作为接口测试工具的使用。但实际上,它是一个标准的性能测试工具。关于Jmeter相关 的资料也非常丰富,它的官方文档也很完善。
3、Locust 同样是性能测试工具,虽然官方这样来描述它 “An open source load testing tool.” 。但其它和前面两个工具有着较大的不同。相比前面两个工具,功能上要差上不少,但它也并非优点全无。
Locust 完全基本 Python 编程语言,采用 Pure Python 描述测试脚本,并且 HTTP 请求完全基于 Requests 库。除了 HTTP/HTTPS 协议,Locust 也可以测试其它协议的系统,只需要采用Python调用对应的库进行请求描述即可。LoadRunner 和 Jmeter 这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力。Locust 的并发机制摒弃了进程和线程,采用协程 (gevent)的机制。协程避免了系统级资源调度,由此可以大幅提高单机的并发能力。
优势:
1、测试脚本形式:简单好学,学习成本低。
2、单机并发能力:通过python特有的协程方式生成成千上万的并发,使在一台普通的电脑跑出几万几十万的并发。
三、Locust入门
1、Locust是什么?
Locust 是一种易于使用、可编写脚本且可扩展的性能测试工具。可以在常规 Python 代码中定义用户的行为,而不是停留在 UI 或限制性特定领域的语言中。这使得 Locust 可以无限扩展并且对开发人员非常友好。
2、Locust安装
前提:安装python3.7或更高版本
# 安装
pip3 install locust
# 验证安装
locust -V
3、Locust命令行参数
参数名称 参数值 参数说明 -h, --help 不带参数 查看帮助信息 -H HOST, –host=HOST HOST 指定被测试的主机,采用以格式:http://10.21.32.33 –web-host=WEB_HOST WEB_HOST 指定运行 Locust Web 页面的主机,默认为空 “。 -P PORT, –port=PORT, –web-port=PORT PORT 指定 –web-host 的端口,默认是8089 -f LOCUSTFILE, –locustfile=LOCUSTFILE LOCUSTFILE 指定运行 Locust 性能测试文件,默认为: locustfile.py –csv=CSVFILEBASE, –csv-base-name=CSVFILEBASE CSVFILEBASE 以CSV格式存储当前请求测试数据。 –master 不带参数 Locust 分布式模式使用,当前节点为 master 节点。 –slave 不带参数 Locust 分布式模式使用,当前节点为 slave 节点。 –master-host=MASTER_HOST MASTER_HOST 分布式模式运行,设置 master 节点的主机或 IP 地址,只在与 –slave 节点一起运行时使用,默认为:127.0.0.1. –master-port=MASTER_PORT MASTER_PORT 分布式模式运行, 设置 master 节点的端口号,只在与 –slave 节点一起运行时使用,默认为:5557。注意,slave 节点也将连接到这个端口+1 上的 master 节点。 –master-bind-host=MASTER_BIND_HOST MASTER_BIND_HOST 做分布式压测时,指定分机IP。只用于master。如果没有指定,默认是所有可用的IP(即所有标记主机IP的slave) –master-bind-port=MASTER_BIND_PORT MASTER_BIND_PORT 做分布式压测时,指定分机port。默认是5557与5558。 –headless -c 和 -r 配合 无ui界面模式运行测试,需要 -c 和 -r 配合使用. -c NUM_CLIENTS, –clients=NUM_CLIENTS NUM_CLIENTS 指定并发用户数,作用于 –no-web 模式。 -r HATCH_RATE, –hatch-rate=HATCH_RATE HATCH_RATE 指定每秒启动的用户数,作用于 –no-web 模式。 -t RUN_TIME, –run-time=RUN_TIME RUN_TIME 设置运行时间, 例如: (300s, 20m, 3h, 1h30m). 作用于 –no-web 模式。 -L LOGLEVEL, –loglevel=LOGLEVEL LOGLEVEL 选择 log 级别(DEBUG/INFO/WARNING/ERROR/CRITICAL). 默认是 INFO. –logfile=LOGFILE LOGFILE 日志文件路径。如果没有设置,日志将去 stdout/stderr –print-stats 不带参数 在控制台中打印数据 –only-summary 不带参数 只打印摘要统计 –no-reset-stats 不带参数 Do not reset statistics once hatching has been completed。 -l, –list 不带参数 显示测试类, 配置 -f 参数使用 –show-task-ratio 不带参数 打印 locust 测试类的任务执行比例,配合 -f 参数使用. –show-task-ratio-json 不带参数 以 json 格式打印 locust 测试类的任务执行比例,配合 -f 参数使用. -V, –version 不带参数 查看当前 Locust 工具的版本.
4、Locust脚本开发及使用方法
脚本:
'''导包'''
from locust import HttpUser, between, task,TaskSet
class WebsitUser(HttpUser):
# 设置一个随机时间间隔
wait_time = between(3, 5)
# host可填可不填,不填时执行脚本打开locust页面时可填入
host = "https://baidu.com"
def on_start(self):
self.client.post('/login', {
'username': 'test',
'password': ''
})
@task
def index(self):
self.client.get('/index')
@task
def about(self):
self.client.get('/about')
常用的locust类:
HttpUser:用于执行请求(执行类)。TaskSet:用于定义测试任务信息(任务信息类)task:用于声明函数是否为测试任务。between:用于设定每个测试题任务之间的等待时间。思考时间: 为了模拟真实用户的操作,在脚本中设定的一种等待时间
请求方法(client)
client:Locust 的请求方法,由requests二次封装而成。
启动参数:
–headless 表示不使用Web界面运行测试。-c 设置虚拟用户数,即并发用户数。-r 设置每秒启动虚拟用户数,即每秒请求数。-t 或–run_time,设置设置运行时间。–csv 表示运行结果文件名。
四、locust框架组成与工作流程
1、locust核心库
gevent:gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。flask:Python编写的轻量级Web应用框架。requests:Python的HTTP库。msgpack-python:MessagePack是一种快速、紧凑的二进制序列化格式,适用于类似JSON的数据格式。msgpack-python主要提供MessagePack数据序列化及反序列化的方法。six:Python2和Python3兼容库,用来封装Python2和Python3之间的差异性。pyzmq:pyzmq是zeromq(一种通信队列)的Python绑定,主要用来实现Locust的分布式模式运行。
2、Locust工作流程:
首先,执行WebsiteTasks中的On_start (只执行一次),作为初始化。然后,从WebsiteTasks中随机挑选(如果定义了任务间的权重(Weight)关系,那么就按照权重关系随机挑选)一个任务执行。接着,根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait和max_wait,TaskSet中的优先),在时间范围中随机取一个值,休眠等待。最后,重复2~3步骤,知道测试任务终止。
五、Locust脚本开发
# 第一步:导入Locust包
from locust import TaskSet,HttpUser,task
# 定义一个类
class WebsitUser(HttpUser):
# 设置一个随机时间间隔
wait_time = between(3, 5)
def on_start(self):
self.client.post('/login', {
'username': 'test',
'password': ''
})
# 设置任务,@task装饰器用于声明函数是一个测试任务,@task(权重)
@task(1)
def index(self):
self.client.get('/index')
TaskSet的用法:
TaskSet实现了虚拟用户所执行任务的调度方法。包括:
-- 任务执行顺序:schedule_task
-- 指定下一个执行的任务:execute_next_task
-- 执行任务:execute_task
-- 休眠等待:wait
-- 中断:interrupt
from locust import TaskSet,HttpUser,task
# 定义任务信息
class TestBaidu(TaskSet):
@task
def test_001(self):
self.client.get('/')
# 控制执行,
class TestUser(HttpUser):
task_set = task(TestBaidu)
host = 'http://lbs.amap.com'
max_wait = 5000
min_wait = 3000
六、UI界面及测试结果
1、UI界面
配置启动参数
Number of users : 设置模拟用户数。Spawn rate : 每秒产生(启动)的虚拟用户数。
Host :被测主机(如果在脚本中指定了host启动页面将使用脚本中的host)
Start swarming :开始运行性能测试。
每秒请求用户数(TPS)
响应时间
用户数
运行的异常信息
2、测试结果
结果说明
Type: 请求的类型,例如GET/POST。Name:请求的路径。request:当前请求的数量。fails:当前请求失败的数量。Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值。Average:平均值,单位毫秒,所有请求的平均响应时间。Min:请求的最小服务器响应时间,单位毫秒。Max:请求的最大服务器响应时间,单位毫秒。Content Size:单个请求的大小,单位字节。reqs/sec:是每秒钟请求的个数。
下载测试结果
精彩文章
发表评论