黑羽压测 快速上手

前言

请点击此处,边看讲解视频,边学习下面的内容

黑羽压测

目前市场上对API接口做性能测试工具有 Jmeter、LoadRunner、Locust等,我觉得都不太好用,而且作为性能测试工具,它们本身的性能不足。

比如 ,我和Locust的开发者 就讨论过如何提升该工具本身的性能,讨论信息详见这里。 其中 发言者 jcyrss 就是我。


所以我自己开发了这款性能测试工具: hyload ,中文名叫 黑羽压测

压测原理图如下

image

黑羽压测 这款工具的特色是: 简单易用、性能强悍、灵活性高 。

  • 简单易用

    点击就可以产生 测试代码模板,修修改改 就能进行简单场景的测试

  • 性能强

    单机可达 每秒 一万个请求,并发连接数可达 数万

  • 灵活性高

    使用 Python 代码编写测试场景,可以灵活适应各种测试需求。 尤其是专家模式,提供最大的灵活性。

    要模拟出各种 特别的压力场景,查看各种细致的数据指标,需要要有一定的 Python编程基础。

    大家可以先看我们网站的 Python 语言教程。

下载地址

请大家点击此处,边看讲解视频,边学习下面的内容


黑羽压测下载地址 - 百度网盘

安装启动

下载的是一个 自解压安装程序,直接拷贝到安装目录(比如 d:\tools 目录)下,双击打开,选择OK,就会解压出一个 HyLoad_x.x.x 的目录。

注意: 安装路径上不要有中文 ,否则内置的测试用的web服务会启动不了(Nginx的限制)。


进入该目录,双击可执行程序HyLoad.exe,即可运行 黑羽压测。

黑羽压测控制台 需要 接收统计数据,所以初次启动,Windows会有如下防火墙提示,选择允许即可。

image

快速开始

HyLoad做性能测试通常分为如下几步:


第1步 选择项目目录

黑羽压测项目 就是一个目录,里面包含了性能测试的定义文件。

点击 界面 指定项目目录 按钮,在弹出对话框中,选择一个目录作为项目目录。

image

第2步 定义客户端行为

在黑羽压测中,定义一种客户端, 就是定义性能测试中的 一种客户操作行为

点击左边菜单栏 这里,

image

定义客户端行为。

性能测试是 模拟 大量的客户端 大批量的发送请求消息 给 被测的服务器。

那么,其中每个 客户端的行为 是怎样的? 需要我们先定义好。

客户端 定义好 以后, 后面就可以 指定产生 多少个 这样的客户端。

一般来说,我们用 一个客户端 模拟 性能测试中的 一个客户


首先,我们点击这里,添加 客户端的行为定义。

image

这样会创建一个名为 client-1 的客户端的行为定义文件。


客户端的行为定义 其实就是一段 Python代码。

如果你不会写Python代码,我们的工具会帮你自动产生代码。

简单场景,你可以使用代码助手帮你产生测试,要成为性能测试专家还是要学好编程语言的哦

点击右边的这些栏目,就会产生 对应的代码。

image

大家可以按照上面的箭头所示,依次点击3个条目,就会产生如下所示的代码

# 创建客户端     
client = HttpClient('127.0.0.1', # 目标地址:端口
                    timeout=10   # 超时时间,单位秒
                   ) 

# 请求方法对应HTTP方法,包括:get、post、put、delete 等
response = client.get(
    '/api/path1'  # 请求URL
    )
print(f"消息体字符串为 {response.string('utf8')} ") 

显然,这是创建 客户端、发送请求给服务器、获取服务器响应消息体内容。

注意,点击右边条目的时候,代码会插入在当前光标处,所以务必注意光标在编辑窗口中的位置。


我们以新浪的股票接口为例,它的API 服务 url是 http://hq.sinajs.cn/list=sh601006

最后list的值是股票代码。

那么我们只要简单修改一下上面自动生成的代码,如下所示,注意注释的解释

# 目标地址改为新浪服务器地址
client = HttpClient('hq.sinajs.cn', 
                        timeout=10
                       ) 

response = client.get(
    "/list=sh601006", # 请求URL修改
    headers ={'Referer':'http://finace.sina.com.cn'} # 必须消息头
    )

# 由于服务端返回的json格式数据是gbk编码
# 所以改为gbk
print(f"消息体字符串为 {response.string('gbk')} ") 

这就是 客户端行为定义, 做好了以后,点击 右上方的运行按钮,就会先执行一下单个用户的测试。

工具会打开终端窗口,运行该代码, 结果如下

image


当然,我们做性能测试,一个客户端,通常也是要反复地发送消息,这时,可以选择循环发送请求,

image

然后,修改一下代码,变成下面这样

client = HttpClient('hq.sinajs.cn', 
                        timeout=10
                       ) 

# 发送1000个请求,每个间隔1秒
for i in range(1000): 
    response = client.get(
        '/list=sh601006',
        headers ={'Referer':'http://finace.sina.com.cn'}
    )
    
    sleep(1) # 间隔1秒

这样的修改,就是要求这个客户端每隔一秒钟,发送一个 HTTP请求 给被测的服务器。

第3步 定义性能测试场景

定义性能测试场景 就是 指定 如何使用 前面定义的 每种 客户端。

比如:产生多少个客户端,每隔多长时间产生一个客户端

单个客户端定义好了, 要做性能测试,只要点击左侧菜单栏这里,定义性能测试场景

image

同样,点击下图处,添加一个性能场景定义。

image

然后,点击这里,插入 创建10个客户端 的示例代码

image

如下所示

# 定义性能场景,点击右边条目,可自动插入功能代码

createClients(
    'client-1', # 客户端名称
    10,       # 客户端数量
    0.1,     # 启动间隔时间,秒
    )

当然,你可以自行修改客户端的数量。

这里, 我们创建10个客户端,每个客户端每秒发送一个请求,10个客户端就是每秒10个请求。

注意:一个客户端通常就代表和服务端有一个HTTP连接,1000个客户端就有1000个并发连接。

windows 命令行查看 并发连接数量 可以使用命令

netstat -nao | find /i ":80      ESTABLISHED"  /c

随后,点击右上角 运行 按钮,就会打开一个窗口,按照我们的定义,运行该 性能测试了。如下

image

您需要高效学习,找工作? 点击咨询 报名实战班

点击查看学员就业情况

监控统计

点击左边菜单栏的 监控统计 图标,可以查看本次性能测试的实时监控,如下所示

image


如果你想结束本次性能测试,只需要关闭 运行性能测试的命令行窗口即可。

等整个性能测试结束,通常你需要产生这次性能测试的 统计图表,包括如下数据的图表

  • rps , 每秒发送请求数

  • tps , 每秒接收响应数

  • eps, 每秒错误响应数

  • tops, 每秒超时请求个数

  • avgresptime, 每秒平均响应时长

这些统计数据, 都保存在项目的目录中的数据文件里面。

只需要点击 数据文件统计 按钮,然后选择刚刚产生的数据文件(文件名就是当前日期时间),如下所示

image

image

这样,就会产生统计图,如下所示

image


其中中间的图表,如果 有红点圆点表示错误, 有红色十字表示超时。


你可以点击上图箭头处,将统计图导出为图片,放到测试报告中。

专家模式

请点击此处,边看讲解视频,边学习下面的内容

前面这种定义 客户端 和 性能场景的方式,比较直观,适合不会 Python 编程 的朋友。

其实,本质上,黑羽压测worker就是一个库,提供一套编程接口,让大家调用,就 可以发送HTTP请求给被测系统,接收响应,获取响应信息,关键信息写入日志 等等。

熟悉 Python编程 并且 了解 gevent 的朋友,可以根据 这里的编程接口文档 , 直接写代码进行性能测试。

而且可以不用黑羽压测工具自带的Python解释器和里面的库,而是可以直接使用你自己安装的python解释器环境,运行你写的性能测试代码

需要先通过命令 pip install hyload 安装 hyload 这个库到你的python解释器环境, 就可以了。


这样写测试代码,具有最大的灵活性。


按下图所示

image

依次:

  • 点击 专家模式 图标,

  • 点击 添加脚本

  • 点击 代码模板 - 传统模式 或者 代码模板 - 虚拟用户

就可以创建一个直接写代码进行测试的代码模板。

from gevent import monkey,spawn,wait
monkey.patch_all()
from hyload.httpclient import HttpsClient,HttpClient
from hyload.logger import TestLogger
from hyload.stats import Stats
from time import sleep

Stats.start()

#  ---------- 你的代码 从这里开始  ----------

def client_1():  # 定义一种客户端行为  

    client = HttpClient('127.0.0.1:80', # 目标地址:端口
                         timeout=10     # 超时时间,单位秒
                           ) 
        
    while True:
        response = client.get("/api/path1",
            duration=1 # 接收到响应后等待,确保本次耗时1秒
        )

for i in range(20): # 启动 20 个协程,运行客户端

    spawn(client_1) # spawn就是启动协程,运行client_1代码
    sleep(1) # 等待1秒 再创建下一个

#  ---------- 你的代码 到此结束    ----------

wait() # gevent等待所有协程结束

如果你的Python基础不错,在这个模板的基础上修修改改,就可以随心所欲的写出各种性能测试脚本来了。


运行你的程序时,别忘了加上一些参数,如下

python.exe expert_1.py  console=127.0.0.1:57204  statsfile="D:\t1\loadtest1\stats_perf\2022-3-4_21.49.02.sts" logPath="D:\t1\loadtest1\log"

其中

  • console 参数指定了控制台的地址和端口,这样你的压测程序实时统计信息可以显示在 黑羽压测工具界面上

  • statsfile 参数指定了 你的程序产生的统计数据文件的路径, 这样测试结束后,可以分析作性能图表

  • logPath 指定了日志文件的存放目录

上一页
下一页