新接到一个需求,插件下的工具创建数量限制上限 25 个,且支持高并发请求下的限制。有如下两个想法;
- 直接使用 python 代码实现单接口的并发性请求。
- 使用 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()
代码解释:
- 导入必要的模块:
-
requests
:用于发送 HTTP 请求。string
:用于生成随机字符串。random
:用于生成随机数。ThreadPoolExecutor
:用于创建线程池,以便并发地发送请求。
- 定义函数
generate_random_string(length=12)
: -
- 该函数用于生成指定长度的随机小写字母字符串。
- 默认生成长度为 12 的字符串。
- 定义函数
send_request(name)
: -
- 该函数用于发送 HTTP POST 请求。
- 请求的 URL 存储在
url
变量中。 - 请求头存储在
headers
字典中,包含了一系列请求头信息。 - 请求体存储在
data
字典中,包含了请求所需的数据。 - 使用
requests.post()
方法发送 POST 请求,并打印响应状态码和响应内容。
- 定义函数
main()
: -
- 在
main()
函数中,首先生成了一个包含 25 个随机字符串的列表names
。 - 然后使用
ThreadPoolExecutor
创建了一个最大工作线程数为 25 的线程池。 - 使用
executor.map()
方法并发地调用send_request()
函数,传入随机字符串列表作为参数。
- 在
- 在
__name__ == '__main__'
下调用main()
函数,即程序入口。
优缺点分析
- 代码的灵活性高、可控性强、可定制。
- 编码复杂程度高、维护成本较高,需要自行处理报告生成等工作,可观察性差。
Jmeter方式实现
在mac 中提前安装好Jmeter程序,网上的教程就不用多说了。
- 安装完成后检查一下是否可用。直接在命令行输入jmeter,能够启动就是能用
- 正式启动后,点击新建测试计划
- 添加线程组
-
- 右键点击测试计划,选择 "Add" -> "Threads (Users)" -> "Thread Group" 来添加一个线程组。在线程组中,你可以设置并发用户数、循环次数等参数。
- Number of Threads (users) (线程数/用户数): 这个参数指定了模拟用户的数量,也就是并发访问的用户数量。每个线程代表一个虚拟用户,每个用户将按照你设置的方式执行测试脚本。
- Ramp-Up Period (in seconds) (启动时间): 这个参数指定了 JMeter 在启动所有线程(用户)之间的时间间隔。如果设置为 0,则所有线程将同时启动,如果设置为非 0 值,则 JMeter 将在指定的时间内逐步启动所有线程。
- Loop Count (循环次数) :这个参数指定了每个线程(用户)执行测试计划的次数。如果设置为 -1,则线程将一直执行,直到测试被手动停止。
- Duration (seconds) (持续时间): 这个参数指定了测试计划的持续时间,单位为秒。如果设置了持续时间,则测试计划将在指定的时间内运行,无论线程数或循环次数如何。
- 添加HTTP请求:在线程组下右键点击,选择 "Add" -> "Sampler" -> "HTTP Request" 来添加一个 HTTP 请求。在 HTTP 请求中,你需要填入请求的 URL、请求方法等信息。
- 配置HTTP请求参数:根据你提供的 cURL 命令,我们需要填入以下信息:
-
- 服务器地址:
https://www.coze.com/api/bizide/bots/api/v1/function/7350576573348675585/subFunction
- 请求方法:POST
-
- 请求头部信息:移除非必要的请求头部信息,如:
accept-language
、cookie
、user-agent
等。
- 请求头部信息:移除非必要的请求头部信息,如:
- 请求体信息:使用参数化设置,确保
name
字段的值不重复。
- 服务器地址:
- 参数化请求体中的 name 字段:在 HTTP 请求中,将
name
字段的值设置为变量,以便每次请求时都使用不同的值。你可以使用 CSV 数据文件或者 JMeter 提供的函数来实现参数化。 - 添加监听器:右键点击线程组,选择 "Add" -> "Listener" 来添加一个监听器,比如 View Results Tree 或者 Summary Report,用于查看测试结果。
- 保存并运行测试计划:在 JMeter 中选择 "File" -> "Save Test Plan As" 来保存测试计划,并点击工具栏上的绿色运行按钮来执行测试计划。
优缺点分析
- 简单易用、功能全面、报告生成和结果分析方便
- 学习成本高,可定制性较差。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 759968159,里面有各种测试开发资料和技术可以一起交流哦。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。