如何用k6调度负载测试和持久化输出

637 阅读6分钟

本教程包括:

  1. 导出k6测试结果
  2. 保存k6结果输出
  3. 为负载测试调度CI/CD管线

在这个k6系列中,我已经介绍了用k6进行HTTP请求测试用k6进行性能测试。我设计这些教程是为了向你介绍k6,并向你展示如何使用k6进行微服务的性能测试。作为k6系列的第三篇教程,本篇将介绍如何在本地存储k6的测试结果,以及如何使用CircleCI的预定管道功能来安排负载测试。

前提条件

要学习本教程,你将需要:

  1. JavaScript的基本知识
  2. HTTP请求和测试的基本知识
  3. 在您的系统上安装Node.js(版本>=10.13)。
  4. 一个CircleCI账户
  5. 一个GitHub账户

本教程直接建立在我们在 "k6性能测试 "教程中建立的基础上。你的第一步是[克隆][该教程的 GitHub 仓库]

你可以用这个命令克隆 GitHub 仓库。

git clone https://github.com/CIRCLECI-GWP/api-performance-testing-with-k6.git

很好!你已经准备好开始学习了!

保存k6结果输出

在用k6进行性能测试的教程中,我介绍了如何将k6指标和日志输出到云端,供整个团队分析和查看。在本教程中,我将引导你在运行测试的机器上持久化测试输出。

k6提供了多种输出测试结果的选项,供你以后查看。支持k6导出的服务包括Amazon CloudWatch, Apache Kafka, Influx DB, New Relic, Prometheus, Datadog等。本教程的重点是如何使用JSON输出获得同样的内容。

要在k6上运行外部测试结果输出,你需要定义--out 标志。你在上一个教程中以稍微不同的方式做到了这一点。在本例中,你将在之前克隆的仓库中为一个Heroku API运行一个简单的负载测试。

该负载测试在30秒内运行多个虚拟用户。在30秒内,该测试

  • 使用API创建多个todo 项目。
  • 确保每一个Todo项目都是使用应用程序端点创建的。

下面是这个测试的代码片断。

// create-todo-http-requests.js file
import http from 'k6/http';
import { check, group } from 'k6';
import { Trend } from 'k6/metrics';
 
const uptimeTrendCheck = new Trend('/GET API uptime');
const todoCreationTrend = new Trend('/POST Create a todo');
 
 
export let options = {
   stages: [
       { duration: '0.5m', target: 3 }, // simulate ramp-up of traffic from 0 to 3 users over 0.5 minutes.
   ],
};
 
export default function () {
   group('API uptime check', () => {
       const response = http.get('https://todo-app-barkend.herokuapp.com/todos/');
       uptimeTrendCheck.add(response.timings.duration);
       check(response, {
           "status code should be 200": res => res.status === 200,
       });
   });
 
   let todoID;
   group('Create a Todo', () => {
       const response = http.post('https://todo-app-barkend.herokuapp.com/todos/',
           { "task": "write k6 tests" }
       );
       todoCreationTrend.add(response.timings.duration);
       todoID = response.json()._id;
       check(response, {
           "status code should be 200": res => res.status === 200,
       });
       check(response, {
           "response should have created todo": res => res.json().completed === false,
       });
   })
}

create-todo-http-requests.js 文件中的第一个group() 块运行一个正常运行时间检查,以验证API是否有响应。另一个块创建todo 项目,并验证它们是否被正确创建。

你可以用命令k6 run test-file 来运行这个测试。因为我们想从这个测试中得到更多,所以我们将使用一个不同的命令。除了验证正确的执行之外,我们还想在JSON文件中看到执行的日志。

要做到这一点,请调用--out outputFile.json 标志。这个标志确保你的测试响应是以JSON格式记录的。执行这个命令。

k6 run create-todo-http-request.js --out  json=create-todo-http-request-load.json

这个测试正常执行,但也创建了一个文件:create-todo-http-request-load.json 。这个新文件包含了该运行中所有测试的执行信息。

一旦k6在定义了测试指标输出的情况下执行,它就会记录该输出并在测试执行时显示。

Load test results output

测试执行后,你可以打开输出文件,在JSON文件中看到输出的结果。

Load test output file

JSON输出文件包含k6用来生成数据的指标。你也可以回顾一下。

  • 负载测试运行时的所有请求
  • 请求的时间戳
  • 每个请求被执行的时间

使用这些数据,你可以确定最慢和最快的响应,并确定瓶颈。这不仅使你对你的测试有更好的了解,而且生成的结果输出文件是永久性的。这使得数据导出成为一种有效的方式,可以将数据持久化,以便以后审查,并将运行情况与其他测试运行进行比较。现在你已经尝试导出JSON,你可以尝试导出其他文件类型,如CSV或XML。

使用CircleCI计划管道调度负载测试

负载测试需要时间来执行,并可能占用大量的系统资源。你可能希望只在没有用户访问你的系统时,或在你知道对应用用户几乎没有干扰时,才运行负载测试。另一种方法是建立一个平行的负载测试环境,模仿你的生产环境。

作为一个CI/CD从业者,你知道资源永远是一个限制因素,质量永远是一个优先事项。这使得设置预定管道来运行你的负载测试成为一个不错的选择。

使用预定的管道,你可以自动运行负载测试的过程,所以他们只在你预计系统中的用户数量有限的时候发生。

在CircleCI上设置预定管道

要配置您的管道按计划运行,请进入CircleCI仪表板并选择项目设置。选择项目。在这种情况下,使用api-performance-testing-with-k6 项目。点击位于项目旁边的省略号(...)。

Projects ellipsis

点击Triggers

在 "触发器 "页面,点击**"添加预定的触发器**",显示触发器表格。

Adding triggers

填写表格,添加一个触发器,在你希望执行负载测试的时候执行它们。对于本教程,配置触发器只在每周Sunday ,在22:00 UTC 。保存预定的管道。

Scheduled pipelines configuration

现在你有一个每周运行一次的管道,以确保你的负载测试工作。你可以根据需要编辑这个计划。你可能会忘记执行你的负载测试,但CircleCI将始终为你做,在你选择的时间。要了解更多关于计划管道如何帮助你优化你的开发时间和资源使用,请阅读调度持续集成管道的好处

总结

在本教程中,我们重新讨论了如何用k6运行负载测试,并增加了将测试指标导出到外部目标的内容。在这种情况下,它是一个JSON文件,但你也可以把它导出到CSV或XML。我们还介绍了创建一个预定管道来执行负载测试的过程。我们能够专门策划负载测试的条件和时间,以便由CircleCI管道执行。