菜单
开源

分析结果

在本教程中,您将学习如何

  • 应用标签过滤特定结果
  • 了解 k6 指标
  • 使用 jq 过滤 JSON 结果
  • 定义组来组织测试
  • 创建自定义指标

背景:k6 结果输出

k6 提供了许多结果输出。默认情况下,测试结束汇总提供了测试指标的聚合结果。

bash
  █ 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 标志。

bash
k6 run --out json=results.json api-test.js

然后运行此 jq 命令来过滤延迟结果;http_req_duration 指标。

bash
jq '. | select(.type == "Point" and .metric == "http_req_duration")' results.json

k6 结果有许多内置标签。例如,过滤结果以仅包含状态为 200 的结果。

bash
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

JavaScript
const params = {
  headers: {
    'Content-Type': 'application/json',
  },
  tags: {
    'my-custom-tag': 'auth-api',
  },
};

创建一个名为“tagged-login.js”的新脚本,并向其中添加一个自定义标签。

JavaScript
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);
}

运行测试

bash
k6 run --out json=results.json tagged-login.js

过滤此自定义标签的结果

bash
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 运行。

JavaScript
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

JavaScript
//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 组的结果。为此

  1. 将上面的脚本保存为 multiple-flows.js
  2. 使用以下命令运行脚本
bash
k6 run multiple-flows.js --out json=results.json --iterations 10
  1. 使用 jq 检查结果。组名带有 :: 前缀。
bash
jq '. | select(.data.tags.group == "::Coinflip game")' results.json

添加自定义指标

如输出所示,所有 k6 测试都会发出指标。但是,如果内置指标不够,您可以创建自定义指标。一个常见的用例是收集测试特定范围的指标。

例如,创建一个指标,为每个组收集延迟结果

  1. 从 k6 指标模块导入Trend
  2. 创建两个持续时间趋势指标函数。
  3. 在每个组中,将 duration 时间添加到 contactscoin_flip 端点的请求趋势中。
JavaScript
//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

bash
k6 run multiple-flows.js --out json=results.json --iterations 10

在测试结束控制台汇总中查找自定义趋势指标。

bash
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

后续步骤

在本教程中,您查看了粒度输出并按内置和自定义标签进行了过滤。然后您使用组创建了一个新脚本。最后,您为每个组添加了一个新指标。下一步可以创建自定义测试结束汇总或将结果流式传输到数据库

对于持续的操作,您可以模块化您的逻辑和配置。这是本教程的下一步的主题。