问题原因
当调用 /v1/chat/completions 接口后立即请求 /api/log 查询日志时,经常找不到对应的日志记录。原因是:
接口响应 ≠ 数据入库
/v1/chat/completions 返回响应时,后端的日志数据可能还在异步写入数据库过程中,此时查询 /api/log 自然查不到。
解决方案
在 /v1/chat/completions 请求后、 /api/log 请求前添加延时。
当前脚本结构
/api/user/login
↓
/v1/chat/completions ← 执行耗时操作
↓
[延时等待] ← 等待数据库写入
↓
/api/log ← 此时能查到日志
↓
/api/user/logout
延时配置详细说明
方式一:通过全局变量配置(当前脚本使用)
JMeter GUI 操作步骤:
- 打开测试计划文件
- 在左侧目录树中点击 Test Plan(测试计划)
- 在下方找到 User Defined Variables(用户定义的变量)区域
- 找到
RESPONSE_DELAY变量,修改其值 - 保存脚本
变量配置示例:
| 变量名 | 说明 | 推荐值 |
|---|---|---|
RESPONSE_DELAY | 响应延时(毫秒) | 10000 |
方式二:通过定时器配置(手动添加)
JMeter GUI 操作步骤:
- 在左侧目录树中找到需要添加延时的请求(例如
/api/log) - 右键点击该请求 → Add → Timer → Constant Timer
- 在 Thread Delay(线程延迟)中输入延时值(毫秒)
- 保存脚本
定时器配置示例:
Name: Response Delay Timer
Thread Delay: 10000
脚本 XML 中的配置位置
定时器需要添加在目标请求的 hashTree 节点内,位于请求和其 HeaderManager 之间:
<HTTPSamplerProxy ...>
...
</HTTPSamplerProxy>
<hashTree>
<HeaderManager .../>
<hashTree/>
<ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Response Delay Timer">
<stringProp name="ConstantTimer.delay">${RESPONSE_DELAY}</stringProp>
</ConstantTimer>
</hashTree>
不同定时器类型说明
| 定时器类型 | 说明 | 适用场景 |
|---|---|---|
| Constant Timer | 固定延时 | 固定等待时间(当前使用) |
| Gaussian Random Timer | 高斯随机延时 | 模拟真实用户行为 |
| Uniform Random Timer | 均匀随机延时 | 随机延时范围 |
| BeanShell Timer | 自定义脚本延时 | 复杂延时逻辑 |
为什么需要延时
| 场景 | 说明 |
|---|---|
| 异步写入 | 后端将日志写入数据库的操作通常是异步的,接口返回成功不代表数据已落库 |
| 业务延迟 | 部分业务逻辑可能需要额外处理时间 |
| 测试稳定性 | 延时可以提高测试脚本查询结果的稳定性,避免误报 |
注意事项
- 延时过长会影响整体测试执行时间
- 延时过短可能导致日志仍查询不到
- 建议根据实际业务响应时间调整,推荐 10-15 秒
RESPONSE_DELAY是全局变量,一处修改全局生效