AI-Jmeter实战

895 阅读5分钟

背景

新接到一个需求,插件下的工具创建数量限制上限 25 个,且支持高并发请求下的限制。有如下两个想法;

  1. 直接使用 python 代码实现单接口的并发性请求。
  2. 使用 Jmeter 实现接口的高并发请求

实现方式

当前使用 mac 系统,有鉴于自己本身的代码能力,代码还是暗戳戳的让 GPT 完成。Jmeter 内容根据请求接口中的 curl 进行配置

代码方式实现

代码内容如下

import requests
import string
import random
from concurrent.futures import ThreadPoolExecutor
def generate_random_string(length=12):
    # 生成一个长度为 length 的随机小写字母字符串
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(length))
def send_request(name):
    url = 'https://www.coze.com/xxxxx'
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'authority': 'www.coze.com',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Content-Type': 'application/json',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Cookie': 'xxxxxx',
        'Origin': 'https://www.coze.com' ,
        'Pragma': 'no-cache',
        'Referer': 'https://www.coze.com/xxxxxx',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
        'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"macOS"',
        'x-requested-with': 'XMLHttpRequest',
        # 'msToken':'xxxxxx',
        # 省略其他 headers 以保持简洁,实际使用时请包含所有必要的 headers
        'x-bizide-token': 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImlkIjoiNzMxMTI2MjU0MTg2NTI4ODcwNSIsInRlbmFudF9pZCI6ImJkMTgyMDQzZmJlNmRlZTEyYjI0NzczZTdlNzg1NTE2IiwidHlwZSI6InVzZXIifSwiZXhwIjoxNzExNTEyOTY4LCJpYXQiOjE3MTE1MDkzNjgsInVzZXJpZCI6IjczMTEyNjI1NDE4NjUyODg3MDUiLCJ1c2VybmFtZSI6IiJ9.lI-6PSfsZ0DdARy-sprYnq-gwYczA58JZa0XJU8VK0Hkw3KmtuRzg01T_0ha5miQAKlTxDmhCykM7jQSWB20Nn2uj01tkCM42s5VBfP4iaZkSKUQAGlALOW32kxopfQ2Y7pYyfuapt0haTszTKSJyUYFVy266h05ScFmtORl2zUToeRogch64wotxwd6MWPHIPEDr4iaB6zRc3kIYgX5WyjeIZwCgpI9NiqSlH_-X-zLVd2ZsuPbvqXERzn1M6ZiZcS2vj5Ikqz0i7c0-kchNpFRV0vCUQEChMKXaOwY80FfPtCPxRP8BnqFiKvq8Aph3TlJrS9AHtSiV3GJ6tmH3g',
        # 请替换为实际的 token
    }
    data = {
        "pluginId": "7350576573348675585",
        "name": name,
        "description": "toll",
        "input": "[]",
        "output": "[]"
    }
    response = requests.post(url, json=data, headers=headers)
    print(f"Response from {name}: {response.status_code}, Response Body: {response.text}")
def main():
    names = [generate_random_string() for _ in range(25)]
    with ThreadPoolExecutor(max_workers=25) as executor:
        executor.map(send_request, names)
if __name__ == '__main__':
    main()

 

代码解释:

  1. 导入必要的模块
    1. requests:用于发送 HTTP 请求。
    2. string:用于生成随机字符串。
    3. random:用于生成随机数。
    4. ThreadPoolExecutor:用于创建线程池,以便并发地发送请求。
  2. 定义函数 generate_random_string(length=12)
    1. 该函数用于生成指定长度的随机小写字母字符串。
    2. 默认生成长度为 12 的字符串。
  3. 定义函数 send_request(name)
    1. 该函数用于发送 HTTP POST 请求。
    2. 请求的 URL 存储在 url 变量中。
    3. 请求头存储在 headers 字典中,包含了一系列请求头信息。
    4. 请求体存储在 data 字典中,包含了请求所需的数据。
    5. 使用 requests.post() 方法发送 POST 请求,并打印响应状态码和响应内容。
  4. 定义函数 main()
    1. main() 函数中,首先生成了一个包含 25 个随机字符串的列表 names
    2. 然后使用 ThreadPoolExecutor 创建了一个最大工作线程数为 25 的线程池。
    3. 使用 executor.map() 方法并发地调用 send_request() 函数,传入随机字符串列表作为参数。
  5. __name__ == '__main__' 下调用 main() 函数,即程序入口。

 

 

优缺点分析

  1. 代码的灵活性高、可控性强、可定制。
  2. 编码复杂程度高、维护成本较高,需要自行处理报告生成等工作,可观察性差。

Jmeter方式实现

在mac 中提前安装好Jmeter程序,网上的教程就不用多说了。

  1. 安装完成后检查一下是否可用。直接在命令行输入jmeter,能够启动就是能用
  2. 正式启动后,点击新建测试计划
  3. 添加线程组
    1. 右键点击测试计划,选择 "Add" -> "Threads (Users)" -> "Thread Group" 来添加一个线程组。在线程组中,你可以设置并发用户数、循环次数等参数。
    2. Number of Threads (users) (线程数/用户数): 这个参数指定了模拟用户的数量,也就是并发访问的用户数量。每个线程代表一个虚拟用户,每个用户将按照你设置的方式执行测试脚本。
    3. Ramp-Up Period (in seconds) (启动时间): 这个参数指定了 JMeter 在启动所有线程(用户)之间的时间间隔。如果设置为 0,则所有线程将同时启动,如果设置为非 0 值,则 JMeter 将在指定的时间内逐步启动所有线程。
    4. Loop Count (循环次数) :这个参数指定了每个线程(用户)执行测试计划的次数。如果设置为 -1,则线程将一直执行,直到测试被手动停止。
    5. Duration (seconds) (持续时间): 这个参数指定了测试计划的持续时间,单位为秒。如果设置了持续时间,则测试计划将在指定的时间内运行,无论线程数或循环次数如何。
  4. 添加HTTP请求:在线程组下右键点击,选择 "Add" -> "Sampler" -> "HTTP Request" 来添加一个 HTTP 请求。在 HTTP 请求中,你需要填入请求的 URL、请求方法等信息。
  5. 配置HTTP请求参数:根据你提供的 cURL 命令,我们需要填入以下信息:
    1. 服务器地址:https://www.coze.com/api/bizide/bots/api/v1/function/7350576573348675585/subFunction
    2. 请求方法:POST
      1. 请求头部信息:移除非必要的请求头部信息,如:accept-languagecookieuser-agent等。
    3. 请求体信息:使用参数化设置,确保 name 字段的值不重复。
  6. 参数化请求体中的 name 字段:在 HTTP 请求中,将 name 字段的值设置为变量,以便每次请求时都使用不同的值。你可以使用 CSV 数据文件或者 JMeter 提供的函数来实现参数化。
  7. 添加监听器:右键点击线程组,选择 "Add" -> "Listener" 来添加一个监听器,比如 View Results Tree 或者 Summary Report,用于查看测试结果。
  8. 保存并运行测试计划:在 JMeter 中选择 "File" -> "Save Test Plan As" 来保存测试计划,并点击工具栏上的绿色运行按钮来执行测试计划。

优缺点分析

  1. 简单易用、功能全面、报告生成和结果分析方便
  2. 学习成本高,可定制性较差。