HTTP 请求

GET 请求

import http from 'k6/http';

export default function () {
  http.get('http://test.k6.io');
}

POST 请求

import http from 'k6/http';

export default function () {
  const url = 'http://test.k6.io/login';
  const payload = JSON.stringify({
    email: 'aaa',
    password: 'bbb',
  });

  const params = {
    headers: {
      'Content-Type': 'application/json',
    },
  };

  http.post(url, payload, params);
}

http module 可以处理的 HTTP 请求和方法如下,具体可以查看文档 http module

名称描述
batch()并行发出多个 HTTP 请求
del()发送 HTTP DELETE 请求
get()发送 HTTP GET 请求
head()发送 HTTP HEAD 请求
options()发送 HTTP OPTIONS 请求
patch()发送 HTTP PATCH 请求
post()发送 HTTP POST 请求
put()发送 HTTP PUT 请求
request()发送任意类型的 HTTP 请求

Checks

Checks 中的布尔条件,测试人员经常使用来验证系统是否响应预期的内容。例如,可以验证 POST 请求是否具有响应状态 == 201,或者 body 的大小。

类似测试框架的断言,但失败的 Checks 不会导致测试中止或以失败的状态结束。

检查 HTTP 响应码

import { check } from 'k6';
import http from 'k6/http';

export default function () {
  const res = http.get('http://test.k6.io/');
  check(res, {
    'is status 200': (r) => r.status === 200,
  });
}

检查 response body 中的内容

import { check } from 'k6';
import http from 'k6/http';

export default function () {
  const res = http.get('http://test.k6.io/');
  check(res, {
    'verify homepage text': (r) =>
      r.body.includes('Collection of simple web-pages suitable for load testing'),
  });
}

检查 response body size

import { check } from 'k6';
import http from 'k6/http';

export default function () {
  const res = http.get('http://test.k6.io/');
  check(res, {
    'body size is 11,105 bytes': (r) => r.body.length == 11105,
  });
}

查看通过的 checks 百分比

当脚本包含 checks 时,报告会显示通过了多少测试的 checks

添加多个 checks

可以在单个 check 语句中添加多个检查

import { check } from 'k6';
import http from 'k6/http';

export default function () {
  const res = http.get('http://test.k6.io/');
  check(res, {
    'is status 200': (r) => r.status === 200,
    'body size is 11,105 bytes': (r) => r.body.length == 11105,
  });
}

Thresholds 阈值

阈值是用来指定被测系统的性能预期的通过/失败标准。阈值用来分析性能指标并确定最终测试结果。内置的指标都可以作为阈值。

K6 中包含的四种度量类型每一种都提供了自己的一组可用于阈值表达式的聚合方法。

import http from 'k6/http';
import { Trend, Rate, Counter, Gauge } from 'k6/metrics';
export let GaugeContentSize = new Gauge('ContentSize');
export let TrendRTT = new Trend('RTT');
export let options = {
  vus: 10,
  duration: '10s',
  thresholds: {
    // 发出的请求数量需要大于1000
    http_reqs:['count>1000'],
    // 错误率应该效率 0.01%
    http_req_failed: ['rate<0.01'], 
    // 返回的内容必须小于 4000 字节。
    ContentSize: ['value<4000'],
    // p(N) 其中 N 是一个介于 0.0 和 100.0 之间的数字,表示要查看的百分位值,例如p(99.99) 表示第 99.99 个百分位数。这些值的单位是毫秒。
    // 90% 的请求必须在 400 毫秒内完成,95% 必须在 800 毫秒内完成,99.9% 必须在 2 秒内完成
    http_req_duration: ['p(90) < 400', 'p(95) < 800', 'p(99.9) < 2000'],
    // 99% 响应时间必须低于 300 毫秒,70% 响应时间必须低于 250 毫秒,
    // 平均响应时间必须低于 200 毫秒,中位响应时间必须低于 150 毫秒,最小响应时间必须低于 100 毫秒
    RTT: ['p(99)<300', 'p(70)<250', 'avg<200', 'med<150', 'min<100'],
  },
};

export default function () {
  
  let res = http.get('http://www.baidu.com');
  TrendRTT.add(res.timings.duration);
  GaugeContentSize.add(res.body.length);
}

Options

Cookies

其他操作

在执行测试任务时,我们可以通过以下命令控制测试的执行过程

k6 pause  // 暂停测试
k6 resume // 取消所有暂停,恢复执行
k6 scale // 更改活动 VU 的数量
k6 stats // 报告当前已收集的统计信息
k6 status // 报告测试的状态

InfluxDB + Grafana 可视化测试结果

Docker 启动 InfluxDB

docker pull tutum/influxdb
# 8083是influxdb的web管理工具端口,8086是influxdb的HTTP API端口
docker run -d -p 8083:8083 -p8086:8086 --expose 8090 --expose 8099 --name influxsrv tutum/influxdb

Docker 启动 Grafana

docker pull grafana/grafana

docker run -d -p 3000:3000 grafana/grafana

新建一个 K6test 数据库,访问 “http://xxxxx:8083” InfluxDB web 管理页面,新建一个 K6test 数据库

图片名称

配置 Grafana 数据源

图片名称

选择 InfluxDB

图片名称

填写域名端口和数据库,点击 sava&test 。出现 Data source is working 表示成功,如遇到问题查看一下端口是否放行。

图片名称

导入仪表盘

图片名称

通过 ID 导入,输入 2587 点击 load 数据源选择 InfluxDB 点击 Import

图片名称

将 K6 的测试指标导入到 InfluxDB

k6 run --out influxdb=http://xxxxx:8086/K6test test.js
图片名称

参考资料:

https://www.cnblogs.com/linhuiy/p/14989711.html