分析结果
在本教程中,您将学习如何
- 应用标签过滤特定结果
- 了解 k6 指标
- 使用 jq 过滤 JSON 结果
- 定义组来组织测试
- 创建自定义指标
背景:k6 结果输出
k6 提供了许多结果输出。默认情况下,测试结束汇总提供了测试指标的聚合结果。
█ THRESHOLDS
http_req_duration
✓ 'p(95)<1500' p(95)=148.21ms
✓ 'p(90)<2000' p(90)=146.88ms
http_req_failed
✓ 'rate<0.01' rate=0.00%
█ TOTAL RESULTS
checks_total.......................: 90 13.122179/s
checks_succeeded...................: 100.00% 90 out of 90
checks_failed......................: 0.00% 0 out of 90
✓ test-api.k6.io is up
✓ status is 200
CUSTOM
custom_waiting_time................: avg=152.355556 min=120 med=141 max=684 p(90)=147.2 p(95)=148.8
HTTP
http_req_duration..................: avg=140.36ms min=119.08ms med=140.96ms max=154.63ms p(90)=146.88ms p(95)=148.21ms
{ expected_response:true }.......: avg=140.36ms min=119.08ms med=140.96ms max=154.63ms p(90)=146.88ms p(95)=148.21ms
http_req_failed....................: 0.00% 0 out of 45
http_reqs..........................: 45 6.56109/s
EXECUTION
iteration_duration.................: avg=152.38ms min=119.37ms med=141.27ms max=684.62ms p(90)=147.11ms p(95)=148.39ms
iterations.........................: 45 6.56109/s
vus................................: 1 min=1 max=1
vus_max............................: 1 min=1 max=1
NETWORK
data_received......................: 519 kB 76 kB/s
data_sent..........................: 4.9 kB 718 B/s
为了简单起见,本教程使用 JSON 输出和 jq 来过滤结果,以学习k6 指标结果。
有关分析测试结果的其他选项,例如实时存储和时间序列可视化,请参阅
将时间序列结果写入 JSON 文件
要将结果输出到 JSON 文件,请使用 --out
标志。
k6 run --out json=results.json api-test.js
然后运行此 jq
命令来过滤延迟结果;http_req_duration
指标。
jq '. | select(.type == "Point" and .metric == "http_req_duration")' results.json
k6 结果有许多内置标签。例如,过滤结果以仅包含状态为 200 的结果。
jq '. | select(.type == "Point" and .data.tags.status == "200")' results.json
或者计算任何指标在任何特定标签下的聚合值。
jq '. | select(.type == "Point" and .metric == "http_req_duration") | .data.value' results.json | jq -s 'add/length'
jq '. | select(.type == "Point" and .metric == "http_req_duration") | .data.value' results.json | jq -s min
jq '. | select(.type == "Point" and .metric == "http_req_duration") | .data.value' results.json | jq -s max
应用自定义标签
您还可以向请求或代码块应用标签。例如,您可以这样向请求参数添加一个tags
。
const params = {
headers: {
'Content-Type': 'application/json',
},
tags: {
'my-custom-tag': 'auth-api',
},
};
创建一个名为“tagged-login.js”的新脚本,并向其中添加一个自定义标签。
import http from 'k6/http';
export default function () {
const url = 'https://quickpizza.grafana.com';
const payload = JSON.stringify({
username: 'test_case',
password: '12345678',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
//apply tags
tags: {
'my-custom-tag': 'auth-api',
},
};
//Create user, with tags
http.post(`${url}/api/users`, payload, params);
}
运行测试
k6 run --out json=results.json tagged-login.js
过滤此自定义标签的结果
jq '. | select(.type == "Point" and .metric == "http_req_duration" and .data.tags."my-custom-tag" == "auth-api")' results.json
按组组织请求
您还可以将测试逻辑组织到组中。group
中的测试逻辑会标记其块内的所有请求和指标。组可以帮助您将测试组织为一系列逻辑事务或块。
背景:一个按组组织测试逻辑的新测试
在一个只发出一个请求的测试中,结果过滤意义不大。而且 API 测试脚本变得很长。要了解如何比较结果和其他 k6 API,请为以下情况编写一个测试
一个示例:您的开发团队希望评估两个面向用户流程的性能。
- 访问一个端点,然后再访问另一个
- 向
https://test.k6.io/contacts.php
发送 GET 请求- 向
https://test.k6.io/
发送 GET 请求- 玩掷硬币游戏
- 向
https://test.k6.io/flip_coin.php
发送 POST 请求,查询参数为bet=heads
- 向
https://test.k6.io/flip_coin.php
发送另一个 POST 请求,查询参数为bet=tails
您能找出如何编写请求脚本吗?如果不能,请使用以下脚本。由于此示例模拟人类用户而非 API 调用,因此每个请求之间都有延迟。使用 k6 run multiple-flows.js
运行。
import http from 'k6/http';
import { group, sleep } from 'k6';
//set URL as variable
const baseUrl = 'https://test.k6.io';
export default function () {
// visit contacts
http.get(`${baseUrl}/contacts.php`);
sleep(1);
// return to the home page
http.get(`${baseUrl}/`);
sleep(1);
//play coinflip game
http.get(`${baseUrl}/flip_coin.php?bet=heads`);
sleep(1);
http.get(`${baseUrl}/flip_coin.php?bet=tails`);
sleep(1);
}
添加 Group 函数
将这两个端点包装在不同的组中。一个组命名为 Contacts flow
,另一个命名为 Coinflip game
。
//import necessary modules
import http from 'k6/http';
import { group, sleep } from 'k6';
//set baseURL
const baseUrl = 'https://test.k6.io';
export default function () {
// visit some endpoints in one group
group('Contacts flow', function () {
http.get(`${baseUrl}/contacts.php`);
sleep(1);
// return to the home page
http.get(`${baseUrl}/`);
sleep(1);
});
// Coinflip players in another group
group('Coinflip game', function () {
http.get(`${baseUrl}/flip_coin.php?bet=heads`);
sleep(1);
http.get(`${baseUrl}/flip_coin.php?bet=tails`);
sleep(1);
});
}
运行并过滤
仅检查 Coinflip game
组的结果。为此
- 将上面的脚本保存为
multiple-flows.js
。 - 使用以下命令运行脚本
k6 run multiple-flows.js --out json=results.json --iterations 10
- 使用
jq
检查结果。组名带有::
前缀。
jq '. | select(.data.tags.group == "::Coinflip game")' results.json
添加自定义指标
如输出所示,所有 k6 测试都会发出指标。但是,如果内置指标不够,您可以创建自定义指标。一个常见的用例是收集测试特定范围的指标。
例如,创建一个指标,为每个组收集延迟结果
- 从 k6 指标模块导入
Trend
。 - 创建两个持续时间趋势指标函数。
- 在每个组中,将
duration
时间添加到contacts
和coin_flip
端点的请求趋势中。
//import necessary modules
import http from 'k6/http';
import { group, sleep } from 'k6';
import { Trend } from 'k6/metrics';
//set baseURL
const baseUrl = 'https://test.k6.io';
// Create custom trend metrics
const contactsLatency = new Trend('contacts_duration');
const coinflipLatency = new Trend('coinflip_duration');
export default function () {
// Put visits to contact page in one group
let res;
group('Contacts flow', function () {
// save response as variable
res = http.get(`${baseUrl}/contacts.php`);
// add duration property to metric
contactsLatency.add(res.timings.duration);
sleep(1);
res = http.get(`${baseUrl}/`);
// add duration property to metric
contactsLatency.add(res.timings.duration);
sleep(1);
});
// Coinflip players in another group
group('Coinflip game', function () {
// save response as variable
let res = http.get(`${baseUrl}/flip_coin.php?bet=heads`);
// add duration property to metric
coinflipLatency.add(res.timings.duration);
sleep(1);
res = http.get(`${baseUrl}/flip_coin.php?bet=tails`);
// add duration property to metric
coinflipLatency.add(res.timings.duration);
sleep(1);
});
}
以少量迭代运行测试,并将结果输出到 results.json
。
k6 run multiple-flows.js --out json=results.json --iterations 10
在测试结束控制台汇总中查找自定义趋势指标。
coinflip_duration..............: avg=119.6438 min=116.481 med=118.4755 max=135.498 p(90)=121.8459 p(95)=123.89565
contacts_duration..............: avg=125.76985 min=116.973 med=120.6735 max=200.507 p(90)=127.9271 p(95)=153.87245
您还可以从 JSON 结果中查询自定义指标结果。例如,获取聚合结果,如下所示。
jq '. | select(.type == "Point" and .metric == "coinflip_duration") | .data.value' results.json | jq -s 'add/length'
jq '. | select(.type == "Point" and .metric == "coinflip_duration") | .data.value' results.json | jq -s min
jq '. | select(.type == "Point" and .metric == "coinflip_duration") | .data.value' results.json | jq -s max
后续步骤
在本教程中,您查看了粒度输出并按内置和自定义标签进行了过滤。然后您使用组创建了一个新脚本。最后,您为每个组添加了一个新指标。下一步可以创建自定义测试结束汇总或将结果流式传输到数据库。
对于持续的操作,您可以模块化您的逻辑和配置。这是本教程的下一步的主题。