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
参考资料: