如何在JMeter中处理Azure托管标识API并执行性能测试
在JMeter中处理基于Azure托管标识的API性能测试
要在Azure负载测试资源中用JMeter测试依赖托管标识的API,核心是先获取托管标识的AccessToken,再将其附加到API请求的授权头里,以下是具体步骤:
1. 通过JMeter获取托管标识的AccessToken
直接用JMeter的JSR223 Sampler(选Groovy语言)调用Azure实例元数据服务(IMDS)获取Token——在Azure环境中运行时,IMDS可以直接返回当前资源托管标识的Token,无需额外凭证(如果用的是用户分配的托管标识,需要指定client_id)。
示例Groovy代码:
import groovy.json.JsonSlurper // 若使用用户分配托管标识,填入对应的Client ID;系统分配则注释掉这行 def clientId = "你的托管标识Client ID" // 替换为目标API的资源标识符,比如https://management.azure.com/ def resource = "目标API资源ID" def url = "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=${resource}" if (clientId) { url += "&client_id=${clientId}" } def connection = new URL(url).openConnection() connection.setRequestProperty("Metadata", "true") connection.connect() def response = connection.getInputStream().text def json = new JsonSlurper().parseText(response) def accessToken = json.access_token // 将Token存入JMeter变量,供后续请求调用 vars.put("ACCESS_TOKEN", accessToken) // 可选:存储过期时间,用于后续刷新逻辑 vars.put("EXPIRES_ON", json.expires_on)
本地测试提示:本地无法访问IMDS,可先用Azure CLI执行
az account get-access-token --resource "目标API资源ID"获取Token,手动存入JMeter变量临时测试。
2. 给API请求添加授权头
在需要测试的HTTP请求下添加HTTP Header Manager,新增一个头:
- 名称:
Authorization - 值:
Bearer ${ACCESS_TOKEN}
这样所有请求都会自动带上获取到的AccessToken。
3. 配置Azure负载测试资源的权限
确保Azure负载测试资源的托管标识(系统分配或用户分配)拥有目标API的访问权限:
- 找到目标API对应的Azure AD应用注册,添加所需的角色或权限
- 给负载测试资源的托管标识授予该权限
4. 处理Token过期
AccessToken通常1小时后过期,可在JSR223 Sampler中添加刷新逻辑:
def currentToken = vars.get("ACCESS_TOKEN") def expiresOn = vars.get("EXPIRES_ON") // 提前5分钟刷新Token if (!currentToken || System.currentTimeMillis() > (Long.parseLong(expiresOn) - 300000)) { // 重复前面获取Token的代码 // ... vars.put("ACCESS_TOKEN", accessToken) vars.put("EXPIRES_ON", json.expires_on) }
或者添加一个定时器,每隔55分钟重新执行一次Token获取Sampler。
内容的提问来源于stack exchange,提问作者Raxon
相关产品推荐
相关产品推荐

