压力测试方案怎么写:压测计划与 k6 脚本生成提示词(目标、场景、指标、通过标准)

大促、上线新系统前要做性能压测时用:让 AI 先帮你把压测目标和流量模型定清楚,再生成带阶梯加压、思考时间和通过阈值的 k6 脚本,最后给出结果怎么看、瓶颈怎么定位的清单。

NNathaniel bigo··原创首发·AI 辅助撰写
通用大模型 对话模型通用
你是一名性能测试工程师。请帮我制定压测方案并编写 k6 脚本。

- 被测系统与接口:[接口列表或业务流程]
- 预期业务量:[预期业务量](例:大促峰值每秒 800 单,平时每秒 50 单)
- 用户行为比例:[用户行为比例](例:70% 浏览商品、20% 加购、10% 下单)
- 性能要求:[性能要求](例:95% 请求 300 毫秒内、错误率低于 0.1%)
- 压测环境:[压测环境](例:与生产同配置的预发环境,2 台应用服务器)
- 鉴权方式与测试账号来源:[鉴权方式]

第一部分:压测方案
1. 压测目标:用一句话写清要回答的问题(例如「峰值 800 单每秒时,响应时间和错误率是否达标」「系统最多能扛多少」)。
2. 流量模型:把业务量换算成每个接口的请求速率,说明换算过程和假设。
3. 场景设计:基准测试(低压力验证脚本)、负载测试(目标压力持续一段时间)、压力测试(逐步加压找到拐点)、稳定性测试(中等压力长时间运行)——按我的目标选择需要的,写明每个场景的加压方式和持续时间。
4. 监控清单:压测时除了 k6 的结果,还要同时看哪些服务端指标(CPU、内存、数据库连接数、慢查询、缓存命中率、垃圾回收、线程池),以便定位瓶颈。
5. 风险与准备:测试数据准备、是否会触发短信或支付等外部调用(必须用模拟接口隔离)、是否会影响其他系统、压测后的数据清理。

第二部分:k6 脚本
- 用场景配置实现阶梯加压,按业务比例分配不同的用户行为;
- 加入随机思考时间;
- 用阈值配置写出通过标准,不达标时测试判定为失败;
- 对关键接口做返回内容校验,而不仅仅检查状态码;
- 测试账号和数据从外部文件读取。

第三部分:结果分析指南
拿到结果后看哪些数字、典型的瓶颈表现(如响应时间随压力线性上升、错误率突然跳升)分别意味着什么。

只针对自己拥有或获得授权的系统压测。

高亮处换成你自己的内容:[接口列表或业务流程]、[预期业务量]、[用户行为比例]、[性能要求]、[压测环境]、[鉴权方式]

ChatGPT Plus 充值

已被复制 0 次

使用说明

怎么填变量:[预期业务量] 和 [用户行为比例] 是整个方案的基础,可以从历史监控里取峰值数据。没有数据就写「估计」,AI 会在方案里标出这些假设,压测前要和业务确认。

常见坑:

  • 只压单个接口,得出「每秒能扛 5000 次」的结论,真实场景里多个接口共享数据库和缓存,实际容量会低得多。按业务比例混合压测更接近真实情况。
  • 压测机自身成为瓶颈(CPU 打满、带宽不够),测出来的是压测机的极限。脚本要监控压测机资源。
  • 压测时没有隔离短信、支付等外部接口,可能真的给用户发了几万条短信。压测环境里这些调用必须指向模拟服务。

追问技巧:压测完成后,把 k6 的汇总输出和同时间段的服务器监控数据贴回去,问「瓶颈最可能在哪一层,下一步该看什么」。

示例输出

示例,仅供参考(k6 脚本节选)
js
import http from 'k6/http'
import { check, sleep } from 'k6'

export const options = {
  scenarios: {
    browse: {
      executor: 'ramping-arrival-rate',
      startRate: 50, timeUnit: '1s', preAllocatedVUs: 200,
      stages: [
        { target: 560, duration: '5m' },   // 加压到峰值的 70%(浏览)
        { target: 560, duration: '20m' },  // 保持
        { target: 0, duration: '2m' },
      ],
      exec: 'browse',
    },
  },
  thresholds: {
    http_req_failed: ['rate<0.001'],
    http_req_duration: ['p(95)<300'],
  },
}

export function browse() {
  const res = http.get(`${__ENV.BASE_URL}/api/products/1001`)
  check(res, { '返回商品数据': (r) => r.status === 200 && r.json('id') === 1001 })
  sleep(Math.random() * 2 + 1)
}

同款作品

用这条提示词做出来的作品;原作者会因此获得积分

做同款

还没有同款,来做第一个。

Nathaniel 的更多内容

同主题

同模型

0 条评论

登录 后参与评论

还没有评论,来抢沙发~