Gatling中进行文件上传测试是构建符合multipart/form-data格式的HTTP请求,并高效地处理二进制文件流。这和使用单次接口测试工具(如Python的requests或Java的RestAssured)有很大的区别,后者更偏向功能验证。Gatling则通过DSL(领域特定语言),专注于模拟高并发场景下的文件上传性能。
Multipart请求:bodyPart
Gatling使用.bodyPart()方法来组装multipart请求的各个部分(可以是表单字段,也可以是文件)。文件上传主要靠以下几种BodyPart类型:
1. RawFileBodyPart:上传本地静态文件
最常用的方式,适用于文件内容在测试中固定不变的场景。
scala
.bodyPart(RawFileBodyPart("fileFieldName", "path/to/your/file.txt"))
"fileFieldName":对应服务器端接收文件参数的字段名。
"path/to/your/file.txt":本地文件系统的路径。Gatling默认会在user-files/resources目录或类路径下查找文件。
2. ElFileBodyPart:使用动态文件名
当需要为每个虚拟用户上传不同文件,或文件名需要参数化时使用。它使用Gatling表达式语言来解析动态路径。
scala
.bodyPart(ElFileBodyPart("file", "${filePath}"))
"${filePath}":可以是一个从Session中提取的变量,例如通过Feeder从CSV文件读取得来。
3. StreamBodyPart:上传动态生成的二进制流
适用于文件内容无需落盘,直接在内存中生成并上传的场景(如临时处理的图片或加密数据)。
scala
.bodyPart(StreamBodyPart("file", /* 一个`() => InputStream`函数 */).contentType("application/octet-stream"))
需要提供一个返回InputStream的函数,Gatling会在需要时调用它来获取数据流。
二进制流处理和高级配置
文件编码和Content-Type
Gatling默认以二进制模式(如rb)读取文件。可以显式指定文件的Content-Type,这对于服务器正确解析文件很重要。虽然multipart/form-data请求会自动设置主Content-Type,但仍需为每个文件部分设置其自身的类型。
scala
.bodyPart(
RawFileBodyPart("file", "test.jpg")
.contentType("image/jpeg") // 显式指定MIME类型
.fileName("custom_filename.jpg") // 自定义上传后的文件名
)
组装完整请求示例
一个完整的Gatling文件上传场景定义如下:
scala
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import java.nio.file.Paths
class FileUploadSimulation extends Simulation {
val httpProtocol = http
.baseUrl("http://your-server.com")
val uploadScenario = scenario("File Upload Test")
.exec(
http("Upload Document")
.post("/upload")
.bodyPart(RawFileBodyPart("document", "data/sample.pdf")) // 文件部分
.bodyPart(StringBodyPart("category", "contract")) // 额外的表单字段
.header("Authorization", "Bearer ${authToken}") // 可能的认证头
)
setUp(
uploadScenario.inject(rampUsers(100).during(30))
).protocols(httpProtocol)
}
性能测试专项考量
文件资源管理:将测试文件放在Gatling的resources目录(如src/test/resources)下,确保在打包和分布式测试时能正确访问。对于大量或大文件,注意JVM内存设置。
连接池与超时:文件上传通常耗时较长,需要调整HTTP配置(在gatling.conf中或DSL中):
readTimeout:延长读取超时,避免大文件上传中途被断开。
maxConnectionsPerHost:增大每个主机的最大连接数,以支持更高的并发上传。
负载建模:使用rampUsers、constantUsersPerSec等注入策略,模拟真实的上传压力曲线,观察服务器在并发流下的处理能力和稳定性。
Gatling测试文件上传,主要在于选择正确的BodyPart类型来构建multipart请求,并围绕性能测试目标管理好文件资源和网络配置。