完整内容在此, 干话王_Grafana k6 入门实战
将 k6 从设计测试到开发再到 CI pipeline 整个完整写一篇。
2024年9月,Grafana 决定把 k6 的icon改色,并于 v0.54.0 发布。连 result output 也改成红色了,还加入 Grafana 的字眼。
OpenTelemetry Demo 专案
OTel Demo 专案中本来就有 Python Locust 框架撰写的测试,我们能翻写成 k6 的版本来练习。Grafana 有提供一个 OTel demo 电商的线上网站https://otel-demo.field-eng.grafana.net/,我们能以此网站来进行 k6 的测试。
该Locust测试脚本的主要测试对象与行为︰
API端点测试 ︰
基础服务检测
-
GET / 首页访问
- 洪水攻击,根据 feature flagloadGeneratorFloodHomepage值,动态调整请求次数
-
GET /api/products/{id} 商品详情查询
-
GET /api/recommendations 商品推荐系统
-
GET /api/data/ 广告推荐系统
购物车流程
-
GET /api/cart 查看购物车
-
POST /api/cart 添加商品到购物车。购物车操作包含: 随机商品选择(10种预设商品) 数量随机(1-10件) 用户ID绑定
结帐系统
-
POST /api/checkout 结帐操作
-
两种结帐模式: 单商品结帐 多商品结帐(2-4件随机组合)
-
使用预先载入的100组用户资料
浏览器行为测试 ︰
UI操作验证
-
切换货币为瑞士法郎(CHF)
-
点击「Roof Binoculars」商品
-
执行加入购物车按钮操作
流量识别机制
所有请求添加synthetic_request=true header,方便识别该请求是测试产生的还是其他使用者产生的。
为此我们能根据以上的测试案例,区分成压力测试以及功能测试。
Test for Performance
k6 官方有一篇专门关于测试性能的测试入门文章,Test for performance。
主要有,使用 thresholds 确认性能标準(performance criteria)。使用 scenarios 来配置多种负载模型。最重要的是团队已经定义出 SLO 了,例如 99% 请求应该成功,99%请求应该≦1000ms的延迟,只有定义出 SLO,多种负载模型场景才能测试出系统是否满足这些 SLO。
因为这里主要是测试客户端的性能表现,能参考 R.E.D. 或是 4 Golden Signals 中的 Latency、Traffic、Errors。
这里我们设定请求失败率需要小于 1 %,也就是 1000 个请求最多只能有 9 个请求是失误的。令一个则是 p95 的请求都要在 200ms 内取得回应,也包含了失败请求的回应(Fail should fast return)。
设定 thresholds 之前我们要先知道 k6 提供了哪些内建指标。
常用内建指标
-
checks︰rate类型,我们设定的断言检查通过比例,这是最重要的资料正确性检查。
-
http_req_duration︰trend类型,就所有请请的总时间,等于 http_req_sending + http_req_waiting + http_req_receiving(即远端伺服器处理请求并回应所需的时间,不包括初始的 DNS 查询/连接时间)。
-
http_req_failed︰rate类型,http 回应 status >= 400的次数。
-
http_reqs︰counter类型,k6 产生了多少 http 请求。
-
browser_web_vital_fid,browser_web_vital_lcp︰k6 browser 产生的指标,用来测量浏览器多久能看到内容以及跟元件互动。
-
其他自己看,我几乎没在用,除了即时输出至仪表板会用到,像是收到多少资料大小(data_received)、执行了几次测试迭代(iterations)、测试持续时间(iteration_duration)、多少 VU 正在执行测试中(vus)。
-
也能自己定义 metrics 设定于 thresholds 中。
我们就能利用内建指标,设定这次测试对象的 thresholds 作为测试的验收标準(Criteria)。
export const options = {
thresholds: {
checks: [\'rate>0.95\'], // the rate of successful checks should be higher than 95%
http_req_failed: [\'rate<0.01\'], // http errors should be less than 1%
http_req_duration: [\'p(95)<150\'], // 95% of requests should be below 150ms
},
};
完整内容在此, 干话王_Grafana k6 入门实战