JMeter如何发送多个含唯一Cnumber属性的JSON请求完成1k并发测试
实现并发请求Cnumber唯一的方案
核心逻辑优先选择线程安全的自增序列、预生成唯一值池两种方案,完全避免重复概率,不要使用随机生成规则。
方案1:JMeter(最常用负载测试工具实现)
- 直接使用JMeter自带的线程安全
__counter()函数,请求JSON里的Cnumber字段修改为"Cnumber": "C${__counter(FALSE,)}"即可,FALSE表示全局计数,会自动生成C1到C1000的唯一值,1000并发下不会重复 - 也可以提前把1000个唯一Cnumber写入CSV文件,用CSV Data Set Config组件读取,设置共享模式为所有线程,每个请求取一行新值即可保证唯一
方案2:k6(轻量JS负载测试工具实现)
- 用
SharedArray预生成唯一值池,保证所有虚拟用户取值不重复,示例代码如下:
import { SharedArray } from 'k6/data'; import http from 'k6/http'; // 预生成1000个唯一Cnumber const cNumberPool = new SharedArray('cNumber池', function() { return Array.from({length: 1000}, (_, i) => `C${i+1}`); }); export const options = { vus: 1000, iterations: 1000 }; export default function () { // 按虚拟用户编号取对应唯一值 const currentCnumber = cNumberPool[__VU - 1]; const payload = JSON.stringify({ "Code": "WEB", "Pfix": null, "Name": "Ronaldo", "Cnumber": currentCnumber }); http.post('你的API地址', payload, { headers: { 'Content-Type': 'application/json' } }); }
方案3:Python自定义并发脚本实现
- 用线程池提前分配唯一值,100%不会重复,示例代码如下:
import requests from concurrent.futures import ThreadPoolExecutor # 预生成1000个唯一Cnumber c_number_list = [f"C{i}" for i in range(1, 1001)] api_url = "替换为你的实际接口地址" def send_request(c_number): body = { "Code": "WEB", "Pfix": None, "Name": "Ronaldo", "Cnumber": c_number } response = requests.post(api_url, json=body) # 可自行添加响应校验、结果统计逻辑 if __name__ == "__main__": # 1000线程并发执行 with ThreadPoolExecutor(max_workers=1000) as executor: executor.map(send_request, c_number_list)
注意事项
- 如果需要更大数量的唯一值,也可以用UUID生成,只要接口Cnumber字段长度支持即可,比如JMeter写法为
"Cnumber": "${__UUID}" - 多线程场景下不要使用普通的全局自增变量,必须用对应工具/语言提供的线程安全计数能力
内容的提问来源于stack exchange,提问作者cSharp
相关产品推荐
相关产品推荐

