如何用JMeter对基于Keycloak认证的单体应用做负载测试?
一、手动构造认证请求替代录制
Blazemeter录制失败多因Keycloak的OAuth2/OpenID Connect流程涉及前端跳转、加密参数,录制工具无法捕获完整上下文。直接手动构造请求更可靠:
步骤1:获取Token端点信息
从Keycloak控制台的Realm设置中,找到「OpenID Connect Endpoint Configuration」,记下token_endpoint地址,格式通常为http://your-keycloak/auth/realms/{realm-name}/protocol/openid-connect/token步骤2:添加HTTP请求获取Access Token
在JMeter中新增HTTP请求,方法选POST,URL填入上述token_endpoint:- 内容类型设置为
application/x-www-form-urlencoded - 参数列表添加以下项:
grant_type:password(密码模式更适合后端服务负载测试;若需授权码模式需额外处理前端跳转,复杂度更高)client_id: 应用在Keycloak中注册的客户端IDusername: 测试账号用户名password: 测试账号密码client_secret: 若客户端配置了密钥,需添加该参数
- 内容类型设置为
步骤3:提取并复用Access Token
添加JSON Extractor,从返回的JSON响应中提取access_token字段:引用名称设为access_token,JSON Path表达式填$.access_token。后续业务请求的请求头中添加Authorization: Bearer ${access_token},即可带上认证信息。步骤4:处理Token过期
Keycloak Token默认有效期较短,可添加If Controller,通过${__jexl3(${access_token_expires_in} < ${__time(,)},)}判断是否过期(需先提取expires_in字段),控制器内嵌套Token请求实现自动刷新。
二、其他可用工具推荐
- k6:支持脚本化负载测试,对OAuth2流程有原生支持,用JavaScript编写测试逻辑,处理Keycloak认证灵活,适合具备代码基础的测试人员。
- Gatling:基于Scala的高性能负载测试工具,拥有官方维护的Keycloak认证插件,文档中提供完整示例脚本,高并发场景下表现优异。
- Locust:Python编写的分布式负载测试工具,通过代码定义用户行为,可快速实现Keycloak的Token获取逻辑,扩展性强。
内容的提问来源于stack exchange,提问作者Omar

