本教程包括:
- 导出k6测试结果
- 保存k6结果输出
- 为负载测试调度CI/CD管线
在这个k6系列中,我已经介绍了用k6进行HTTP请求测试和用k6进行性能测试。我设计这些教程是为了向你介绍k6,并向你展示如何使用k6进行微服务的性能测试。作为k6系列的第三篇教程,本篇将介绍如何在本地存储k6的测试结果,以及如何使用CircleCI的预定管道功能来安排负载测试。
前提条件
要学习本教程,你将需要:
- JavaScript的基本知识
- HTTP请求和测试的基本知识
- 在您的系统上安装Node.js(版本>=10.13)。
- 一个CircleCI账户
- 一个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在定义了测试指标输出的情况下执行,它就会记录该输出并在测试执行时显示。

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

JSON输出文件包含k6用来生成数据的指标。你也可以回顾一下。
- 负载测试运行时的所有请求
- 请求的时间戳
- 每个请求被执行的时间
使用这些数据,你可以确定最慢和最快的响应,并确定瓶颈。这不仅使你对你的测试有更好的了解,而且生成的结果输出文件是永久性的。这使得数据导出成为一种有效的方式,可以将数据持久化,以便以后审查,并将运行情况与其他测试运行进行比较。现在你已经尝试导出JSON,你可以尝试导出其他文件类型,如CSV或XML。
使用CircleCI计划管道调度负载测试
负载测试需要时间来执行,并可能占用大量的系统资源。你可能希望只在没有用户访问你的系统时,或在你知道对应用用户几乎没有干扰时,才运行负载测试。另一种方法是建立一个平行的负载测试环境,模仿你的生产环境。
作为一个CI/CD从业者,你知道资源永远是一个限制因素,质量永远是一个优先事项。这使得设置预定管道来运行你的负载测试成为一个不错的选择。
使用预定的管道,你可以自动运行负载测试的过程,所以他们只在你预计系统中的用户数量有限的时候发生。
在CircleCI上设置预定管道
要配置您的管道按计划运行,请进入CircleCI仪表板并选择项目设置。选择项目。在这种情况下,使用api-performance-testing-with-k6 项目。点击位于项目旁边的省略号(...)。

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

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

现在你有一个每周运行一次的管道,以确保你的负载测试工作。你可以根据需要编辑这个计划。你可能会忘记执行你的负载测试,但CircleCI将始终为你做,在你选择的时间。要了解更多关于计划管道如何帮助你优化你的开发时间和资源使用,请阅读调度持续集成管道的好处。
总结
在本教程中,我们重新讨论了如何用k6运行负载测试,并增加了将测试指标导出到外部目标的内容。在这种情况下,它是一个JSON文件,但你也可以把它导出到CSV或XML。我们还介绍了创建一个预定管道来执行负载测试的过程。我们能够专门策划负载测试的条件和时间,以便由CircleCI管道执行。