真实用户操作具有随机性、上下文依赖性和分布特性,应采用概率分布模型(如高斯、对数正态)替代固定延迟,并按业务路径分层设置动态节奏,结合网络、设备与行为特征建模以提升压测真实性。

直接用固定延迟或统一Timer模拟“思考时间”,反而会失真。真实用户操作不是节拍器,而是随机停顿、长短不一、受上下文影响的自然行为。关键不在“加延时”,而在“还原节奏逻辑”。
用分布模型代替固定值
真实用户在页面停留时间服从右偏分布(比如对数正态或伽马分布),短停顿多、长停顿少。JMeter 的 Uniform Random Timer 或 Gaussian Random Timer 可配置均值与偏差,比 Constant Timer 更贴近实际;k6 中可用 math.random() 结合分布函数生成非均匀延迟;boom 虽无内置分布支持,但可通过脚本预生成时间序列注入请求间隔。
- 例如:用户浏览商品页平均停留 4.2 秒,标准差 2.8 秒 → 配置 Gaussian Timer 均值 4200ms、偏差 2800ms
- 避免设成“统一停 3 秒”,那会人为压平响应时间分布,掩盖排队和资源争抢的真实毛刺
按业务路径分层设置节奏
思考时间不是孤立存在的,它嵌套在用户旅程中。同一用户在不同环节节奏差异很大:
- 搜索后点进商品页:可能快速跳转(平均 1.5 秒)
- 商品页加购前反复滑动详情/比参数:停顿拉长(平均 8–12 秒)
- 结算页填写地址:输入动作带来自然中断(可用键盘延迟建模,而非简单 sleep)
在 JMeter 中建议用多个线程组或模块控制器,为“浏览→搜索→详情→加购→下单”各环节独立配置定时策略;k6 可用 sleep() 配合流程变量动态计算等待时长。
放弃“每个请求后加 Timer”的惯性思维
Timer 是作用于单个采样器的,但真实用户行为是跨请求的。比如用户打开首页后,可能连续刷 3 次推荐流(间隔 0.8s),再停 6 秒看广告,然后点一个商品——这个 6 秒不是“第 3 个请求后的 Timer”,而是整个子流程的上下文停顿。
- 更合理的方式:把一组关联请求封装为事务控制器(Transaction Controller),在其外层统一控制节奏
- 或使用 JSR223 + 自定义逻辑,在关键分支点(如“是否进入详情页”)动态决定下一段等待区间
- 高阶做法:基于真实埋点日志做时间序列拟合,导出每类路径的停留时间概率密度函数,直接驱动测试工具
结合客户端行为特征增强真实性
思考时间只是表象,背后是设备性能、网络条件、用户意图等多重因素。仅调服务端延迟不够:
- 加入真实网络延迟:用 tc(Linux 流量控制)或 Toxiproxy 模拟 3G/弱网抖动,让前端加载、渲染、交互自然拉长停顿
- 模拟设备差异:移动端用户滚动慢、点击犹豫,可增加随机 pause(0.3–1.2s);PC 端批量操作则节奏更快
- 混入异常行为:1% 用户突然关闭标签页(对应请求中断)、5% 用户重复提交(幂等接口压力)

















