JMeter 接口关联方法及示例
在 JMeter 中进行接口测试时,接口关联是非常重要的操作,它可以确保多个接口之间的数据传递和业务逻辑的连贯性。除了正则表达式提取器,还有多种方法可以实现接口关联,下面将详细介绍这些方法并给出实际例子,同时也会介绍使用用户自定义变量进行接口关联的例子。
一、JSON 提取器
适用场景
当接口响应数据为标准的 JSON 格式时,使用 JSON 提取器可以方便、准确地提取所需的数据。
示例
假设我们有一个用户信息查询接口,响应数据如下:
{"user": {"id": 123,"name": "John Doe","email": "johndoe@example.com"}
}
我们需要提取用户的 id
用于后续的订单查询接口。
配置步骤
- 在用户信息查询接口下添加“后置处理器” -> “JSON 提取器”。
- 配置 JSON 提取器:
- 名称:设置为
userId
。 - JSON 路径表达式:填写
$.user.id
。 - 匹配数字:设置为
1
。 - 缺省值:可以留空。
- 名称:设置为
使用示例
在后续的订单查询接口中,将 userId
作为参数传递:
- 请求路径:
/orders?userId=${userId}
二、XPath 提取器
适用场景
当接口响应数据是 XML 格式时,XPath 提取器可以根据 XPath 表达式从 XML 文档中提取特定的节点值。
示例
假设我们有一个商品列表接口,响应数据如下:
<products><product><id>456</id><name>Smartphone</name><price>999</price></product>
</products>
我们需要提取商品的 id
用于后续的商品详情查询接口。
配置步骤
- 在商品列表接口下添加“后置处理器” -> “XPath 提取器”。
- 配置 XPath 提取器:
- 名称:设置为
productId
。 - XPath 查询:填写
//product/id
。 - 结果类型:选择
STRING
。 - 匹配数字:设置为
1
。 - 缺省值:可以留空。
- 名称:设置为
使用示例
在后续的商品详情查询接口中,将 productId
作为参数传递:
- 请求路径:
/products/${productId}
三、CSS/JQuery 提取器
适用场景
当接口响应为 HTML 页面,需要从 HTML 元素中提取数据时,CSS/JQuery 提取器可以使用 CSS 选择器或 JQuery 语法定位元素并提取数据。
示例
假设我们有一个新闻列表页面,HTML 代码如下:
<!DOCTYPE html>
<html>
<body><h1 class="news-title">Breaking News: New Policy Announced</h1>
</body>
</html>
我们需要提取新闻标题用于后续的分享接口。
配置步骤
- 在新闻列表接口下添加“后置处理器” -> “CSS/JQuery 提取器”。
- 配置 CSS/JQuery 提取器:
- 引用名称:设置为
newsTitle
。 - CSS/JQuery 表达式:填写
.news-title
。 - Attribute:留空,表示提取元素的文本内容。
- 匹配数字:设置为
1
。 - 缺省值:可以留空。
- 引用名称:设置为
使用示例
在后续的分享接口中,将 newsTitle
作为参数传递:
- 请求参数:
title=${newsTitle}
四、BeanShell 后置处理器
适用场景
对于复杂的数据处理和关联逻辑,正则表达式、JSON 提取器等可能无法满足需求,此时可以使用 BeanShell 后置处理器,通过编写 Java 代码进行灵活的数据提取和处理。
示例
假设我们有一个订单接口,响应数据如下:
{"order": {"id": 789,"totalAmount": 199.99,"items": [{"name": "Laptop","price": 149.99},{"name": "Mouse","price": 49.99}]}
}
我们需要提取订单中第一个商品的名称用于后续的评价接口。
配置步骤
- 在订单接口下添加“后置处理器” -> “BeanShell 后置处理器”。
- 在 BeanShell 后置处理器的“脚本”框中编写以下代码:
import org.json.JSONObject;
import org.json.JSONArray;String response = prev.getResponseDataAsString();
JSONObject json = new JSONObject(response);
JSONObject order = json.getJSONObject("order");
JSONArray items = order.getJSONArray("items");
JSONObject firstItem = items.getJSONObject(0);
String itemName = firstItem.getString("name");
vars.put("firstItemName", itemName);
使用示例
在后续的评价接口中,将 firstItemName
作为参数传递:
- 请求参数:
productName=${firstItemName}
五、JSR223 后置处理器
适用场景
JSR223 后置处理器与 BeanShell 后置处理器类似,但支持多种脚本语言,如 Groovy、JavaScript 等,在性能和功能上更具优势。
示例
同样使用上述订单接口的响应数据,我们使用 Groovy 脚本提取订单的总金额用于后续的支付接口。
配置步骤
- 在订单接口下添加“后置处理器” -> “JSR223 后置处理器”。
- 在 JSR223 后置处理器的“语言”下拉框中选择
Groovy
。 - 在“脚本”框中编写以下代码:
import groovy.json.JsonSlurperdef response = prev.getResponseDataAsString()
def json = new JsonSlurper().parseText(response)
def totalAmount = json.order.totalAmount
vars.put("orderTotalAmount", totalAmount.toString())
使用示例
在后续的支付接口中,将 orderTotalAmount
作为参数传递:
- 请求参数:
amount=${orderTotalAmount}
六、用户自定义变量进行接口关联
适用场景
在某些情况下,我们可能需要手动设置一些变量,并在多个接口中使用这些变量进行关联。
示例
假设我们要测试一个用户注册和登录的流程,需要手动设置用户名和密码,然后在注册和登录接口中使用这些信息。
配置步骤
- 在测试计划中添加“配置元件” -> “用户定义的变量”。
- 配置用户定义的变量:
- 名称:分别设置为
username
和password
。 - 值:填写具体的用户名和密码,例如
testuser
和testpassword
。
- 名称:分别设置为
使用示例
- 注册接口:
- 请求参数:
username=${username}&password=${password}
- 请求参数:
- 登录接口:
- 请求参数:
username=${username}&password=${password}
- 请求参数:
通过以上这些方法,我们可以在 JMeter 中灵活地实现接口关联,确保测试用例能够准确地模拟真实的业务场景。