news 2026/4/16 23:26:43

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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)) // 基础检查

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:45:53

智能决策引擎:高效处理来源标签

针对不同的“来源标签”编写决策逻辑,核心在于构建一个可扩展的规则引擎。不要使用大量的 if-else 嵌套,因为随着业务增加,代码会变得难以维护。推荐使用**映射模式(Mapping Pattern)或策略模式(Strategy P…

作者头像 李华
网站建设 2026/4/16 16:12:15

AI绘画总翻车?掌握这2个技巧,小白也能生成惊艳作品

现在AI绘画真的太火了,不管是做自媒体配图、设计头像,还是单纯记录脑洞,输入文字就能出图的方式特别方便。但很多朋友跟我吐槽,明明想的是唯美古风画,生成的却是“抽象派大作”;想要细腻的人物特写&#xf…

作者头像 李华
网站建设 2026/4/16 14:26:20

精准守护:310nm UVB LED 为爬宠提供安全高效的健康光照方案

随着精细化饲养理念的普及,越来越多爬宠爱好者开始重视为宠物提供符合其生理需求的人工环境,其中紫外线(UVB)光照管理是保障蜥蜴、龟类等宠物骨骼健康的关键环节。银月光科技推出的 G3535N1UVN2U06-310 UVB LED,旨在为…

作者头像 李华
网站建设 2026/4/16 16:10:12

OP-TEE Hello World 入门实战:从构建到 Host / TA 交互的完整解析

OP-TEE Hello World 入门实战:从构建到 Host / TA 交互的完整解析 关键词:OP-TEE、Trusted Application(TA)、Client Application(CA/Host)、TEEC_InvokeCommand、TEE_Param、Secure World / Normal World 1. 为什么要写这篇文章 在学习 OP-TEE 的过程中,很多资料要么停…

作者头像 李华
网站建设 2026/4/14 20:47:32

你用的AI生成模型安全吗?Open-AutoGLM隐私漏洞让人细思极恐,

第一章:你用的AI生成模型安全吗?Open-AutoGLM隐私漏洞让人细思极恐近年来,开源大模型的普及极大推动了AI应用的发展,但随之而来的安全隐患也逐渐浮出水面。Open-AutoGLM作为一款基于AutoGLM架构的开放生成模型,因其高效…

作者头像 李华
网站建设 2026/4/16 12:49:20

2026年数据工程师的AI转型之路:从传统ETL到智能体架构师,薪资提升与晋升加速的升维之战!

当大模型浪潮席卷全球时,数据工程师正站在一个独特的十字路口。一边是日益自动化的传统数据处理工作,另一边是新兴的AI工程领域带来的巨大机遇。2025年的职场现实是:掌握大模型技能的数据工程师,平均薪资比传统数据工程师高出35-5…

作者头像 李华