先说结论:
使用最普遍的JMeter 就能支持类 OpenAI 的流式接口(如 ChatGPT 的流式聊天接口)的测试
总体设置
- JMeter 支持测试 OpenAI 的流式接口,但需要额外配置(如启用 KeepAlive 和调整超时)。
- 如果需要实时处理流式响应,使用 Regular Expression Extractor 或自定义脚本(如 Groovy)进行处理。
- 对于复杂的流式接口测试,建议结合 JMeter 和自定义脚本实现。
1. OpenAI 流式接口有什么特殊性?
OpenAI 的流式接口(streaming API)会以 Server-Sent Events (SSE) 或 chunked transfer encoding 的形式返回数据。这意味着响应是分块的,而不是一次性返回完整的 JSON。
JMeter 默认不支持直接处理流式响应,但可以通过以下方法实现测试。
2. 使用 JMeter 测试流式接口的步骤
步骤 1:添加 HTTP 请求
- 在 JMeter 中添加一个 HTTP Request 组件。
- 配置 HTTP 请求:
- Server Name or IP: 填写 OpenAI 的 API 地址(如
api.openai.com
)。 - Path: 填写 API 路径(如
/v1/chat/completions
)。 - Method: 选择
POST
。 - Body Data: 填写请求体,例如:
{ "model": "gpt-4", "messages": [{ "role": "user", "content": "Hello!"}], "stream": true }
- 设置 Header:
Content-Type: application/json
Authorization: Bearer <your-api-key>
- Server Name or IP: 填写 OpenAI 的 API 地址(如
步骤 2:启用流式响应处理
默认情况下,JMeter 会等待完整的 HTTP 响应。为了处理流式响应,需要修改以下配置:
- 在 HTTP 请求中,勾选 Use KeepAlive。
- 在 HTTP Request 的高级选项中,设置:
- Implementation: 选择
HttpClient4
。 - Response Timeout: 设置为一个较大的值(如 60000 毫秒),以确保不会超时。
- Implementation: 选择
步骤 3:添加后置处理器
由于流式接口会分块返回数据,可以使用 Regular Expression Extractor 或 JSON Extractor 提取响应中的内容。
添加 Regular Expression Extractor:
- 正则表达式:根据流式响应的格式提取数据。例如,如果响应是
data: {...}
,可以使用:data: (\{.*?\})
- 模板:
$1$
- 匹配编号:
0
(表示提取所有匹配项)。
- 正则表达式:根据流式响应的格式提取数据。例如,如果响应是
如果需要处理 JSON 数据,可以添加 JSON Extractor:
- JSON Path 表达式:例如
$.choices[0].delta.content
。
- JSON Path 表达式:例如
步骤 4:添加监听器
- 添加 View Results Tree 监听器,查看请求和响应的详细信息。
- 添加 Summary Report 或 Aggregate Report,查看性能测试结果。
总体来看,处理流式响应的挑战有这几点:
- 分块响应:JMeter 默认会将所有分块合并为一个完整的响应。如果需要实时处理每个分块,可能需要自定义脚本。
- 超时设置:流式接口可能会持续较长时间,需要适当调整超时设置。
- 性能测试:流式接口的性能测试可能需要模拟长时间连接和高并发场景。
3. 替代方案:使用自定义脚本
如果 JMeter 的功能无法满足需求,可以考虑使用 JSR223 Sampler 编写自定义脚本(如 Groovy 或 Python)来处理流式响应。例如:
Groovy 脚本示例
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients
import org.apac