当前位置: 首页 > news >正文

CNAS软件测评机构【Gatling查询参数和表单数据queryParam、formParam和multipartFormData参数处理方式】

Gatling的queryParam、formParam和multipartFormData是构建HTTP请求参数的三种主要方式,分别对应不同的协议标准和数据格式。

1. queryParam:构建URL查询字符串

queryParam 用于构建URL中的查询字符串(?key1=value1&key2=value2),主要应用于GET请求,也可用于POST、PUT等。

基础和动态用法

import io.gatling.core.Predef._ import io.gatling.http.Predef._ // 基础静态参数 http("基础查询请求") .get("/api/search") .queryParam("category", "books") // ?category=books .queryParam("sort", "price_desc") // 动态参数(从Session中提取) .exec( http("动态查询请求") .get("/api/search") .queryParam("userId", "${userId}") // EL表达式引用Session变量 .queryParam("page", "${currentPage}") .queryParam("query", "#{randomString(10)}") // 使用Gatling内置函数 )

高级用法-参数列表和条件参数

// 构建多值参数(数组) .queryParam("tags", "java,scala,performance") // 方式1:逗号分隔 .queryParam("tags", Seq("java", "scala", "performance")) // 方式2:Scala序列 // 条件性添加参数 .exec(session => { val userLevel = session("userLevel").as[String] val params = if (userLevel == "vip") { Map("vip_only" -> "true", "premium" -> "yes") } else { Map("standard" -> "true") } session.set("queryParams", params) }) .exec( http("条件查询") .get("/api/content") .queryParam("basic", "always") // 动态添加多个参数 .queryParamList("#{queryParams}") )

2. formParam-标准表单编码

formParam 用于 application/x-www-form-urlencoded 格式,这是HTML表单的默认提交格式。

基础和批量提交

// 基础表单提交(模拟登录) http("用户登录") .post("/login") .header("Content-Type", "application/x-www-form-urlencoded") .formParam("username", "${username}") .formParam("password", "${password}") .formParam("remember_me", "true") // 批量添加参数(适用于参数数量动态变化) .exec(session => { val formData = Map( "name" -> "测试用户", "email" -> "test@zmtests.com", "age" -> "30", "subscription" -> "premium" ) session.set("formDataMap", formData) }) .exec( http("批量表单提交") .post("/profile/update") .formParamList("#{formDataMap}") // 批量添加所有参数 )

编码和特殊字符处理

// Gatling自动进行URL编码,但需注意特殊情况 .formParam("search_query", "Gatling & Performance Testing") // 编码为:Gatling%20%26%20Performance%20Testing // 处理已编码值(使用原始字符串) .formParam("pre_encoded", RawFileBodyPart("已编码的数据.txt")) // 或手动控制编码 .exec(session => { val rawValue = "特殊&字符=测试" val encodedValue = java.net.URLEncoder.encode(rawValue, "UTF-8") session.set("safeValue", encodedValue) })

3. multipartFormData-混合表单数据(含文件上传)

multipartFormData 用于 multipart/form-data 格式,支持混合文本字段和二进制文件上传。

基础文件上传

// 基本文件上传(小文件) http("上传单文件") .post("/upload") .bodyPart(RawFileBodyPart("file", "test.pdf")) // 从resources文件夹读取 .bodyPart(StringBodyPart("description", "性能测试报告PDF文档")) // 指定MIME类型和字符集 http("上传带元数据的文件") .post("/upload") .bodyPart( RawFileBodyPart("document", "report.pdf") .contentType("application/pdf") // 指定MIME类型 .fileName("性能报告.pdf") // 自定义客户端文件名 ) .bodyPart( StringBodyPart("notes", "这是最终版本的报告") .charset("UTF-8") // 指定字符集 )

高级用法-动态多文件和流式处理

// 动态构建多文件上传 val fileFeeder = csv("test_files.csv").random // 从CSV文件获取文件信息 exec(feed(fileFeeder)) .exec( http("动态多文件上传") .post("/batch-upload") .bodyPart(RawFileBodyPart("file1", "${file1_path}")) .bodyPart(StringBodyPart("category1", "${file1_category}")) .bodyPart(RawFileBodyPart("file2", "${file2_path}")) .bodyPart(StringBodyPart("category2", "${file2_category}")) .bodyPart(StringBodyPart("uploader", "${userId}")) ) // 大文件处理和流式上传(避免内存溢出) http("流式上传大文件") .post("/upload-large") .processRequestBody( bodyParts => bodyParts.map { case part: RawFileBodyPart => part.toStream // 转换为流处理 case other => other } ) .bodyPart( RawFileBodyPart("video", "large_video.mp4") .contentType("video/mp4") .transferEncoding("binary") // 二进制传输编码 ) .bodyPart(StringBodyPart("comment", "大文件测试"))

内存优化和性能配置

// Gatling配置中调整multipart相关参数 val httpProtocol = http .baseUrl("http://zmtests.com") .multipartBoundary("----WebKitFormBoundaryABC123") // 自定义边界 .disableWarmUp // 对于大文件测试,禁用热身以减少内存波动 .shareConnections // 共享连接提高效率 // 在具体请求中控制缓冲区大小 http("优化文件上传") .post("/upload") .bodyPart( RawFileBodyPart("data", "large.bin") .contentType("application/octet-stream") ) .requestTimeout(60000) // 增加超时时间

注意事项

参数编码一致:Gatling自动处理URL编码,保证测试数据和实际生产数据编码一致

Session变量管理:对于动态参数,合理使用Session来存储和管理参数状态

文章来源:卓码软件测评

精彩推荐:点击蓝字即可
软件负载测试API自动化测试软件测试第三方软件测试软件性能测试软件测试机构

文件资源管理:

// 使用feeder动态选择文件 val fileFeeder = Iterator.continually(Map( "filePath" -> s"data/test_${java.util.UUID.randomUUID().toString}.txt" )) // 测试后清理生成的文件 after { println("测试完成,清理临时文件") // 文件清理逻辑 }

性能监控:

queryParam:注意URL长度和参数解析

formParam:注意编码/解码CPU消耗

multipartFormData:注意内存使用、I/O吞吐和网络延迟

调试

// 1. 打印实际请求详情 .exec { session => // 通过日志或调试器查看实际构建的请求 println(s"请求参数: ${session("requestParams").asOption[String]}") session } // 2. 使用Gatling HTTP日志 val httpProtocol = http .baseUrl("http://zmtests.com") .enableHttp2 .disableCaching .silentResources // 静默资源请求 .silentUri(".*\\.(css|js|png|gif).*") .disableFollowRedirect .maxConnectionsPerHost(10) .acceptHeader("*/*") .userAgentHeader("Gatling/3.0") .warmUp("http://zmtests.com/health") // 预热 .check(status.is(200)) // 基础检查

这三种参数构建方式能精准模拟从简单查询到复杂文件上传的各种实际业务情形。

http://www.jsqmd.com/news/129909/

相关文章:

  • 湖北宜昌非开挖修复优选服务商湖北侦汇探:精准修复专业铸就口碑 - 朴素的承诺
  • 第三方CMA软件评测机构Gatling超时设置connectionTimeout、requestTimeout参数使用
  • 开题报告写到凌晨三点?百考通AI平台,3分钟给你一份“能过审”的专业初稿!
  • AI训练图片视频数据集供应商—卓特视觉用亿级语料加速模型商业化 - 品牌2026
  • 当10年架构师拿起AI:不是写不动了,是写得太快了
  • 潮流新纪元:专业活动策划执行与布置,打造沉浸式体验
  • 蓝丝带:很多妈妈不知道,这家专业产后康复品牌已服务数十万家庭
  • 开题报告毫无头绪?百考通AI平台,一句话生成专业初稿,3分钟搞定导师认可方案!
  • AI绘画总翻车?掌握这2个技巧,小白也能生成惊艳作品
  • 区块链 Web3 项目的费用
  • 选产康门店管理系统别乱挑!玄微云 3 大核心优势,从业者必看
  • 【笔记】pwn.college之Pwntools Tutorials(pwn.college)
  • 基于java + vue蘑菇百科系统(源码+数据库+文档)
  • 全球化电商平台的测试架构设计
  • 格(Lattice)
  • 智能决策引擎:高效处理来源标签
  • 技术赋能新浪潮:从桌卡到腕带,深度评测丽屏展架如何定义活动物料三大潮流趋势
  • ‌如何对一项即将退役(Deprecate)的旧服务进行测试?
  • 基于java+ vue网上订餐系统(源码+数据库+文档)
  • 代理人工智能(Agent AI):NVIDIA Project GR00T 实战
  • 基于SpringBoot家政保洁预约系统设计与实现
  • 外部群自动化中的“静默心跳”存活检测
  • 选产后康复理疗机器人别乱挑!小理家这 3 大核心优势必看
  • AI助教系统:你的24小时智能学习伙伴
  • 1043 Is It a Binary Search Tree
  • 苏州二手房翻新大揭秘!这家局部改造公司超绝 - 品牌测评鉴赏家
  • 脑机接口(BCI):EEG 信号解析算法实战
  • 数据分层架构的平衡艺术:在性能、成本与一致性之间寻找最优解
  • 大部分企业都选错?玄微子揭秘AI智能体开发公司的真实选择标准
  • 自动化处理“入群申请”的逻辑判定流