Bootstrap

Python自动化压力测试(html实时监测)

  • 最近发现一个好用的python压测第三方库locust,它可以模拟多个并发请求来测试服务器的响应时间、处理能力和稳定性
  • 使用 locust 进行压力测试: locust 是一个用于负载测试的工具,可以模拟成千上万的用户进行并发请求。
  • 生成报告: 可以通过 locust 提供的 Web 界面或者导出测试结果为 JSON 格式,并生成 HTML 或文本报告。

步骤 1: 安装依赖

首先,你需要安装 locust。可以通过 pip 来安装:

pip install locust

步骤 2: 创建压力测试脚本

接下来,创建一个 Python 脚本来模拟压力测试。假设你要测试一个简单的 HTTP API(例如 http://example.com),你可以这样编写脚本:

from locust import HttpUser, task, between

class MyUser(HttpUser):
	# 在这里指定目标服务器的地址
	host = "http://example.com"  
    # 设置任务执行间隔(例如 1 到 3 秒之间)
    wait_time = between(1, 3)

    @task
    def test_homepage(self):
        # 模拟访问主页
        self.client.get("/")

    @task(2)  # 权重 2,表示比 test_homepage 被调用的概率高
    def test_about_page(self):
        # 模拟访问 About 页面
        self.client.get("/about")

    @task(3)
    def test_api(self):
        # 模拟访问 API
        self.client.get("/api/data")

    def on_start(self):
        """模拟登录或者初始化操作"""
        self.client.post("/login", json={"username": "testuser", "password": "testpassword"})

这个脚本会模拟一个用户,访问主页、About 页面和 API 接口,wait_time 控制每次请求之间的等待时间。

步骤 3: 运行压力测试

你可以通过以下命令来运行压力测试:

locust -f your_script.py
# 或者你可以通过命令行来启动 Locust,并模拟 100 个用户(虚拟用户)。你还可以设置每秒启动多少个用户。
locust -f your_script.py --host=http://ip:port --users 100 --spawn-rate 10
# 或者指定运行的端口和ip(建议使用此命令)
locust -f your_script.py --host=http://ip:port --users 100 --spawn-rate 10 --web-host 192.168.31.199 --web-port 8090

然后,打开浏览器访问 http://localhost:8089,你会看到一个 Web 界面,可以在其中设置虚拟用户数(用户数和每秒启动的用户数)并开始测试。
页面示例:
在这里插入图片描述
在这里插入图片描述

步骤 4: 导出报告(下面步骤可选)

locust 允许你导出 JSON 格式的测试结果。可以使用 --headless 和 --csv 参数来将结果保存为 CSV 文件:

locust -f your_script.py --headless -u 100 -r 10 --run-time 1m --csv=report

这会进行 100 个虚拟用户、每秒启动 10 个用户、运行时间为 1 分钟的压力测试,并将结果保存为 CSV 文件。

如果你想生成 HTML 报告,可以使用 pytest 和 pytest-html 等工具来进一步处理数据并生成报告。

步骤 5: 使用 Python 生成自定义报告

你还可以使用 Python 处理 Locust 输出的 CSV 文件来生成自定义的报告。例如,使用 pandas 来处理数据并生成 PDF 或 HTML 格式的报告:

pip install pandas matplotlib reportlab
import pandas as pd
import matplotlib.pyplot as plt
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas

# 读取 CSV 文件
df = pd.read_csv('report_stats.csv')

# 生成响应时间的直方图
df['Median Response Time'].plot(kind='hist', bins=50, alpha=0.75)
plt.title('Response Time Distribution')
plt.xlabel('Response Time (ms)')
plt.ylabel('Frequency')
plt.savefig('response_time_histogram.png')

# 生成 PDF 报告
c = canvas.Canvas("test_report.pdf", pagesize=letter)
c.drawString(100, 750, "Stress Test Report")
c.drawImage("response_time_histogram.png", 100, 500, width=400, height=300)
c.save()

步骤 6: 定制更多功能

可以根据需求调整任务的权重、请求内容、延迟等,或者使用 requests 库结合其他工具(如 concurrent.futures、threading 或 asyncio)来更精确地控制压力测试行为。

总结

这个简单的流程可以帮助你使用 Python 来自动化进行压力测试并生成基本的报告。你可以根据具体的测试目标和需求定制脚本和报告。locust 是一个很强大的工具,它不仅支持 HTTP 请求,还可以扩展到数据库、消息队列等其他服务的压力测试。

;