跳转至

hyload 快速上手

前言

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

hyload 是我开发的 一款 HTTP/API 接口 性能测试工具。 以 vscode扩展 和 库 的形式提供。

被测对象通常是 网站服务, HTTP API 服务器等。

hyload 永久 开源免费,请大家放心使用。项目 Github 网址


可以访问 GitHub 的朋友,学完如果觉得不错,请帮我在 GitHub 上 点赞加一颗星


学习 通过 HTTP/API接口加压,对系统做性能测试,前提是:你要 对HTTP协议, API 接口 要有起码的认知。

如果这点还不具备, 请先点击这里,学习HTTP协议 和 API接口

hyload 简介

使用 hyload 进行压测 的 架构图 如下

image

hyload 这款工具的特色是:跨平台、简单易用、性能相对较强、灵活性高 。

  • 跨平台

支持Windows, MacOS, Linux

只要是能安装使用 vscode 的平台,都可以使用该工具。

  • 简单易用

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

有人要说:“什么?还要写代码? 那叫什么简单易用, 人家 xxx 工具不要写代码就能测啊”。

朋友,听我一句,那个不要写代码的工具,你把学它的精力用来学习Python,也可以入门了。

而且,真正做好性能测试,执行复杂场景的性能测试用例,绝不会是简单配置几下就可以的。最后还是要在工具里面二次开发写上控制代码,综合起来反而麻烦。

  • 性能相对较强

单机(2023年的主流配置)可达 每秒 数万个请求,并发HTTP连接数可达 数十万

  • 灵活性高

使用 Python 代码编写测试场景,可以灵活适应各种测试需求。

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

如果需要,可以先看我们网站的 Python 语言教程。

安装

hyload 分为2部分:

  • hyload 库

这个库是压力测试程序使用的 Python库,里面提供了 HTTP 接口测试/压力测试 的功能。

可以直接运行 pip3 install hyload 安装。

  • 开发助手

有了 hyload 库, 我们已经完全可以开发压力测试工具了。

但是, 你还是得熟悉这个库的使用呀。 怎么熟悉? 典型做法当然是看 库的使用文档。

怕看文档? 如果只是简单的测试,或许你都不需要看文档哦。

为了方便大家开发(使用hyload库的功能), 和执行测试(实时监控工具,多节点远程部署,远程执行),我们 提供 开发助手

这个助手 作为 vscode 的扩展 提供。

大家可以在 vscode 的扩展市场 搜索 hyload 进行安装。

注意:现在的图标变了,是下面这个

image

快速上手

我们讲解性能测试工具,需要一个被测系统。这里以 bysms 系统作为被测系统。

请大家点击这里,按照说明下载、安装、运行 白月SMS系统

然后 请大家点击这里, 大概了解一下该系统的 API 接口


当我们分析过产品需求,制定了性能测试计划和用例后,接下来就是执行性能测试了。

我们先以API服务 性能测试为例,假设我们的bysms系统只需要做API服务的性能测试。

这里给出一个简单的性能测试用例

测试 10 管理员同时执行如下操作

- 登录API

- 3秒后列出客户第一页API

- 3秒后列出药品第一页API


hyload 执行性能测试通常分为如下几步:


创建 vscode 测试项目

首先创建一个项目目录, 用 vscode 打开该目录。

如果你的环境有多个Python解释器,可以先创建一个空py文件,这样方便你在底部状态栏选择用哪个Python解释器。


然后打开 vscode 的 Command Palette, 输入 hyload

Note

要打开 Command Palette:

Windows/Linux 下按 F1 或者 Ctrl + Shift + P

Mac 按 Shift + Command + P

在候选项中选择 初始化 hyload 项目

hyload 扩展就会创建 项目常用的目录 和一些 项目配置文件, 并且为当前项目选择的解释器环境安装 hyload 库。

调试接口

性能测试是模拟大量用户使用系统。就是定义一种或者几种单个的用户行为, 然后大量的批量执行这几种用户行为。

那么首先我们要把这几种 单个用户行为里面 模拟出来。

单个用户行为 都调通以后, 后面就可以根据用例需要批量产生 多少个 这样的客户端。


我们可以在刚才生产的 code_py 目录下面创建一个用来调试的python代码文件,比如 tmp.py

打开代码文件后, 点击 编辑窗口导航栏右上角的 下图所示图标,就可以打开代码助手。

image

点击代码助手窗口里面的条目,就可以插入相应的代码到左边的 编辑窗口里面。


比如,这里,在调试接口时,通常就是点击第一个 代码模板 - 接口调试

模板代码都有注释,含义显而易见。 有些 Python 基础的朋友应该很容易看懂。

根据你的测试用例的需要, 使用代码助手,修改代码,调试开发单个用户场景的 客户端 模拟。

性能测试 HTTP接口调试, 主要就是 调试发送 用例要求的 各种格式的请求 给服务器、获取服务器响应消息体内容。

具体使用,见视频讲解。


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


写好后, 要运行,就直接点击 vscode 的运行按钮,运行当前代码文件即可。


一般在调试接口的适合,通常会把 hyload 库中 发送请求的 send 方面里面的 debug 设置为 True ,这样,就可以看到发送和接收的 HTTP 请求消息的具体内容。

比如

image


Note

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

编写性能测试执行代码

性能测试用例涉及的接口都没有问题后,就可以 编写性能测试执行代码了。

可以新建一个对应测试用例的代码文件, 比如 perf-test-001.py

我们可以点击代码助手里面的 代码模板 - 性能测试1 ,自动插入的代码如下

from hyload import *

Stats.start() # to show stats on console and GUI.

#  ---------- define testing below   ----------

# User behavior function
def behavior1(username,password): 

    client = HttpClient() 

    # API login
    response = client.post('http://127.0.0.1/api/mgr/signin',
        data={'username':username,'password':password})

    sleep(1)

    for i in range(10):
        # send API list customers
        response = client.get('/api/mgr/customers?action=list_customer')

        # check response
        try:
            respObj = response.json()
        except:
            # if anything wrong, put it into stats and logs
            Stats.one_error('list_customer response.json() error')
            continue

        if (respObj['ret'] != 0):        
            Stats.one_error('list_customer respObj[ret] error')

        sleep(1)

# emulate 10 user's behavior of the same type
for i in range(10): 
    username=f'byhy_{i:04}'
    # run user behavior function in hyload task (a greenlet)
    run_task(behavior1, username, '88888888')
    sleep(1) 

# wait for all hyload tasks to end
wait_for_tasks_done()


大家可以发现 代码模板里面的做法 就是把单个用户的行为,定义在一个名为 behavior1 的函数中,

然后,主控代码 实现 每隔多长时间产生一个这样的客户端, 一共产生多少个这样的客户端。


这里面的关键就是理解 这个 hyload 里面的 run_task 函数

run_task(behavior1, username, '88888888')

run_task 是创建了一个新的 协程 , 运行 behavior1函数 的代码。

大家可以把 协程 看作一种 轻量级的 线程 ,多个协程可以像多个线程一样 "并行" 的同时执行代码。

上面的示例代码 就每隔 1秒 新建一个 client 代码的执行,模拟一个用户执行代码, 每个用户都是相同的操作行为。

一个启动了10个协程,就是模拟10个用户, 每秒新建一个用户。

这里, 一个 HttpClient 实例对象可以理解为用户的浏览器,

这个 HttpClient 访问多少个目标网址,就会有多少个 HTTP 连接。

本例中,只有一个目标网址,所有 一个 HttpClient 和服务端就只有一个并发连接。

10 个客户端都启动时,和服务端就有 10 个并发连接。

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

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

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

点击查看学员就业情况

执行测试,产生统计图

性能测试用例代码写好后, 怎么执行?

当然可以和调试代码一样,直接点击 Python 运行按钮。


但是这样,虽然能执行,我们却看不到实时的可视化的 测试数据统计。

通常,我们应用,先打开 hyload 监控台。

状态栏右下角点击 hyload ,弹出选项框里面选择 实时监控 ,就会打开实时监控界面。


然后, 再点击 编辑窗口导航栏右上角的 下图所示图标,运行压测程序。

image


这个运行 比 Python 标准运行,其实就是多些个命令行参数

console=127.0.0.1:56323

console 参数指定了控制台的地址和端口,这样你的压测程序实时统计信息可以实时的发送给实时监控,并显示在界面上。

当然,如果 实时监控界面 没有打开, 不会自动添加 console 参数。

实时产生的曲线图表的含义,详见视频讲解。


性能测试会产生统计数据, 缺省是产生在 stats_perf 目录下,以启动时间作为文件名。

我们还可以使用 statsfile 参数指定性能测试产生的统计数据文件的名称和路径。


等你的程序里面所有的 协程(模拟运行客户操作的代码)都执行完毕后, 整个测试就结束了。


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


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

  • rps , 每秒发送请求数

  • tps , 每秒接收响应数

  • eps, 每秒错误响应数

  • tops, 每秒超时请求个数

  • avgresptime, 每秒平均响应时长

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

只需要点击 压测数据作图 按钮,然后选择刚刚产生的数据文件(文件名就是当前日期时间),

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

image


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


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


另外还要放到测试报告中的,通常还有 总体的 发送/接收/超时/错误 数量的统计, 和响应时长分布数据。

这些都在控制台可以看到,比如

127.0.0.1:62534 总计 -- 发送 :55, 接收 :55, <100ms :55


这是模板的代码,我们接下来应该把它改为测试用例里面所要求的代码。

前面已经把单个用户的行为调试好了,所以这里,只要把前面调试的代码复制到这个client函数里面即可。

要注意几个问题

  • 执行性能测试时,拷入的调试代码send方法要去掉参数 debug = True 和所有打印到界面的代码,否则测试代码性能会大大下降。

  • 测试用例需要10个不同的账号。

bysms系统里面,执行 还原数据库2.bat , 这样数据库内置了byhy1-byhy10, 10个不同的账号

具体操作执行,见视频讲解。