k6 是什么

k6 是一款开源的、开发者友好的云原生性能测试工具,专注于现代云环境和微服务架构的高并发压测。它由Grafana Labs开发并维护,以简洁、高效、可编程为核心特点,广泛应用于API、微服务及全链路压测场景。以下是其核心特性和使用详解:


1. k6 的核心定位

  • 目标用户:开发、测试和DevOps工程师,强调代码化压测(测试即代码)。
  • 设计理念
    • 轻量级:单二进制文件,无复杂依赖,适合容器化(Docker/Kubernetes)。
    • 高性能:Go语言编写,单机可模拟数万并发用户。
    • 云原生友好:原生支持分布式执行、与K8s/GitLab/Grafana集成。

2. 关键特性

(1)脚本化测试(JavaScript ES6)
  • 用JS编写测试逻辑,灵活模拟复杂用户行为:
    import http from 'k6/http';
    import { check, sleep } from 'k6';
    
    export default function () {
      let res = http.get('https://api.example.com/orders');
      check(res, { 'status was 200': (r) => r.status == 200 });
      sleep(1); // 模拟用户思考时间
    }
    
(2)多种压测模式
模式 命令示例 用途
固定并发 k6 run --vus 100 --duration 30s 模拟100用户持续30秒
阶梯加压 k6 run --stages 30s:50,1m:100 50用户→100用户渐进加压
脉冲式流量 通过脚本自定义 模拟大促秒杀场景
(3)丰富的指标输出
  • 内置指标:请求延迟、吞吐量(RPS)、错误率、数据吞吐量等。
  • 扩展输出:支持导出到Prometheus、InfluxDB、Kafka等。
(4)分布式执行
  • 通过 k6-operator 在Kubernetes中分布式运行,突破单机性能瓶颈。

3. 典型应用场景

(1)API性能测试
  • 验证单接口QPS、延迟(P90/P99):
    k6 run -e BASE_URL=https://api.example.com script.js
    
(2)微服务全链路压测
  • 模拟用户完整旅程(登录→浏览→下单):
    import { group } from 'k6';
    export default function () {
      group('user flow', () => {
        login();
        browseProducts();
        checkout();
      });
    }
    
(3)云原生弹性验证
  • 结合K8s HPA,测试自动伸缩是否触发:
    k6 run --vus 1000 --duration 10m script.js  # 观察Pod是否自动扩容
    

4. 快速入门

(1)安装
  • 本地运行
    # macOS/Linux
    brew install k6
    # Windows
    winget install k6
    
  • Docker运行
    docker run -i loadimpact/k6 run - <script.js
    
(2)示例脚本
import http from 'k6/http';
import { check } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 50 },  // 30秒内逐步增至50并发
    { duration: '1m', target: 100 },  // 保持100并发1分钟
    { duration: '20s', target: 0 },   // 逐步降压
  ],
};

export default function () {
  const res = http.get('https://test-api.k6.io/public/crocodiles');
  check(res, {
    'is status 200': (r) => r.status === 200,
    'response time < 500ms': (r) => r.timings.duration < 500,
  });
}
(3)执行与结果
k6 run script.js

输出示例:

  scenarios: (100.00%) 1 scenario, 100 max VUs, 1m30s max duration
  ✓ is status 200
  ✓ response time < 500ms

  checks.........................: 100.00% ✓ 2000 ✗ 0
  data_received..................: 15 MB   167 kB/s
  data_sent......................: 150 kB  1.7 kB/s
  http_req_duration..............: avg=250ms min=100ms max=800ms p(90)=400ms p(99)=700ms
  http_reqs......................: 2000    22.222222/s

5. 优势 vs 传统工具(如JMeter)

特性 k6 JMeter
脚本语言 JavaScript(易读易维护) Java/GUI(XML配置复杂)
资源消耗 低(单机支持更高并发) 高(需更多资源)
云原生支持 原生集成K8s、Grafana 需插件扩展
测试即代码 版本控制友好(Git集成) GUI操作,版本管理困难
分布式执行 通过k6-operator轻松实现 需手动配置Master/Slave

6. 进阶功能

  • 集成Grafana:通过Prometheus远程写入,实时展示压测数据。
  • 自动化流水线:与GitLab CI/Jenkins集成,实现持续性能测试。
  • 自定义指标:扩展SDK记录业务指标(如订单创建耗时)。

7. 适用场景建议

  • 推荐使用
    • 云原生API/微服务压测。
    • 需要代码化、版本化的性能测试。
    • 快速验证弹性伸缩(如K8s HPA)。
  • 不推荐
    • 纯UI性能测试(需配合Playwright等工具)。
    • 传统企业内网环境(无云基础设施)。

k6凭借其简洁性云原生基因,正成为现代性能测试的首选工具,尤其适合敏捷团队和DevOps实践。

你可能感兴趣的:(性能测试,k6)