首页 web前端 js教程 Grafana Kheat 表:性能工程师应该知道的一切

Grafana Kheat 表:性能工程师应该知道的一切

Oct 26, 2024 am 11:26 AM

Grafana K6 备忘单:性能工程师应该了解的一切(包含示例和最佳实践)

1.Grafana K6简介

Grafana K6 是一款专为性能测试而设计的开源工具。它非常适合大规模测试 API、微服务和网站,让开发人员和测试人员深入了解系统性能。本备忘单将涵盖每个性能工程师开始使用 Grafana K6 时应了解的关键方面。

什么是 Grafana K6?

Grafana K6 是一款面向开发人员和测试人员的现代负载测试工具,它使性能测试变得简单、可扩展,并且易于集成到 CI 管道中。

什么时候使用它?

  • 负载测试
  • 压力测试
  • 峰值测试
  • 性能瓶颈检测
  • API 测试
  • 浏览器测试
  • 混沌工程

2. Grafana K6 备忘单:基本方面

2.1.安装

通过 Homebrew 或 Docker 安装 Grafana K6:

brew install k6
# Or with Docker
docker run -i grafana/k6 run - <script.js
登录后复制
登录后复制
登录后复制

2.2.使用公共 REST API 进行基本测试

以下是如何使用公共 REST API 运行简单测试。

import http from "k6/http";
import { check, sleep } from "k6";

// Define the API endpoint and expected response
export default function () {
  const res = http.get("https://jsonplaceholder.typicode.com/posts/1");

  // Define the expected response
  const expectedResponse = {
    userId: 1,
    id: 1,
    title:
      "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto",
  };

  // Assert the response is as expected
  check(res, {
    "status is 200": (r) => r.status === 200,
    "response is correct": (r) =>
      JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse),
  });

  sleep(1);
}
登录后复制
登录后复制
登录后复制
2.2.1 运行Web仪表板的测试和使用

要运行测试并在 Web 仪表板中查看结果,我们可以使用以下命令:

K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=html-report.html k6 run ./src/rest/jsonplaceholder-api-rest.js
登录后复制
登录后复制
登录后复制

这将在报告文件夹中生成一个名为 html-report.html 的报告。

但我们也可以通过访问以下 URL 在 Web 仪表板中查看结果:

http://127.0.0.1:5665/
登录后复制
登录后复制
登录后复制

Grafana Kheat sheet: everything a performance engineer should know

访问 URL 后,我们可以在 Web 仪表板中实时查看测试结果。

Grafana Kheat sheet: everything a performance engineer should know

2.3.使用公共 GraphQL API 进行测试

使用公共 GraphQL API 的示例。

如果您不知道什么是 GraphQL API,可以访问以下网址:什么是 GraphQL?。

有关我们将要使用的 GraphQL API 的更多信息,您可以访问以下 URL 的文档:GraphQL Pokémon。

有关如何测试 GraphQL API 的更多信息,您可以访问以下网址:GraphQL 测试。

这是一个简单的测试,用于通过名称获取口袋妖怪并检查响应是否成功。

import http from "k6/http";
import { check } from "k6";

// Define the query and variables
const query = `
  query getPokemon($name: String!) {
    pokemon(name: $name) {
      id
      name
      types
    }
  }`;

const variables = {
  name: "pikachu",
};

// Define the test function
export default function () {
  const url = "https://graphql-pokemon2.vercel.app/";
  const payload = JSON.stringify({
    query: query,
    variables: variables,
  });

  // Define the headers
  const headers = {
    "Content-Type": "application/json",
  };

  // Make the request
  const res = http.post(url, payload, { headers: headers });

  // Define the expected response
  const expectedResponse = {
    data: {
      pokemon: {
        id: "UG9rZW1vbjowMjU=",
        name: "Pikachu",
        types: ["Electric"],
      },
    },
  };

  // Assert the response is as expected
  check(res, {
    "status is 200": (r) => r.status === 200,
    "response is correct": (r) =>
      JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse),
  });
}
登录后复制
登录后复制
登录后复制

3. 构建绩效项目的最佳实践

3.1.集中配置

在一个地方定义全局配置选项,例如性能阈值、虚拟用户 (VU) 数量和持续时间,以便于修改。

brew install k6
# Or with Docker
docker run -i grafana/k6 run - <script.js
登录后复制
登录后复制
登录后复制

3.2.代码模块化

3.2.1. REST API 的常量和请求

将代码分离成可重用的模块,例如,将常量和请求与测试逻辑分离。

对于我们的 REST API 示例,我们可以创建一个 Constants.js 文件来存储 API 的基本 URL,并创建一个 requests-jsonplaceholder.js 文件来存储与 API 交互的函数。

import http from "k6/http";
import { check, sleep } from "k6";

// Define the API endpoint and expected response
export default function () {
  const res = http.get("https://jsonplaceholder.typicode.com/posts/1");

  // Define the expected response
  const expectedResponse = {
    userId: 1,
    id: 1,
    title:
      "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto",
  };

  // Assert the response is as expected
  check(res, {
    "status is 200": (r) => r.status === 200,
    "response is correct": (r) =>
      JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse),
  });

  sleep(1);
}
登录后复制
登录后复制
登录后复制

现在我们可以创建 requests-jsonplaceholder.js 文件来存储与 API 交互的函数。

K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=html-report.html k6 run ./src/rest/jsonplaceholder-api-rest.js
登录后复制
登录后复制
登录后复制

3.2.2. REST API 测试脚本中请求的集成

最后,我们可以创建测试脚本 jsonplaceholder-api-rest.js 来使用我们在 requests-jsonplaceholder.js 文件中创建的函数。

http://127.0.0.1:5665/
登录后复制
登录后复制
登录后复制

我们的脚本代码现在更容易理解,并且如果 URL、参数发生变化或者需要添加新方法,需要进行更改的位置会集中起来,从而使我们的解决方案更易于扩展随着时间的推移。

我们可以通过创建更多的原子函数来进一步改进我们的脚本,如果有必要,我们可以重用这些原子函数来创建更复杂的场景,这样就更容易理解我们的测试脚本的作用。例如,如果我们想测试帖子是否存在,我们可以创建一个获取帖子并返回响应的函数,然后我们可以在测试脚本 jsonplaceholder-api-rest.js 中使用此函数。

import http from "k6/http";
import { check } from "k6";

// Define the query and variables
const query = `
  query getPokemon($name: String!) {
    pokemon(name: $name) {
      id
      name
      types
    }
  }`;

const variables = {
  name: "pikachu",
};

// Define the test function
export default function () {
  const url = "https://graphql-pokemon2.vercel.app/";
  const payload = JSON.stringify({
    query: query,
    variables: variables,
  });

  // Define the headers
  const headers = {
    "Content-Type": "application/json",
  };

  // Make the request
  const res = http.post(url, payload, { headers: headers });

  // Define the expected response
  const expectedResponse = {
    data: {
      pokemon: {
        id: "UG9rZW1vbjowMjU=",
        name: "Pikachu",
        types: ["Electric"],
      },
    },
  };

  // Assert the response is as expected
  check(res, {
    "status is 200": (r) => r.status === 200,
    "response is correct": (r) =>
      JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse),
  });
}
登录后复制
登录后复制
登录后复制

3.2.3. GraphQL API 的常量和请求

我们可以修改constants.js文件以添加GraphQL API的基本URL和我们需要使用的标头。

// ./src/config/options.js
export const options = {
  stages: [
    { duration: '1m', target: 100 }, // ramp up to 100 VUs
    { duration: '5m', target: 100 }, // stay at 100 VUs for 5 mins
    { duration: '1m', target: 0 },   // ramp down
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'], // 95% of requests should complete in under 500ms
  },
};
登录后复制

现在我们可以创建 requests-graphql-pokemon.js 文件来存储与 GraphQL API 交互的函数。

// ./src/utils/constants.js
export const BASE_URLS = {
  REST_API: 'https://jsonplaceholder.typicode.com',
};
登录后复制

3.2.4. GraphQL API 测试脚本中的请求集成

此时我们可以创建测试脚本来使用我们在 requests-graphql-pokemon.js 文件中创建的函数。我们将创建一个简单的测试脚本,用于获取口袋妖怪的数据并检查响应是否成功。

// ./src/utils/requests-jsonplaceholder.js
import { BASE_URLS } from './constants.js';
import http from 'k6/http';

export function getPosts() {
    return http.get(`${BASE_URLS.REST_API}/posts`);
}

export function getPost(id) {
    return http.get(`${BASE_URLS.REST_API}/posts/${id}`);
}

export function createPost(post) {
    return http.post(`${BASE_URLS.REST_API}/posts`, post);
}

export function updatePost(id, post) {
    return http.put(`${BASE_URLS.REST_API}/posts/${id}`, post);
}

export function deletePost(id) {
    return http.del(`${BASE_URLS.REST_API}/posts/${id}`);
}
登录后复制

与 api rest 的示例相同,我们可以通过创建更多原子函数来改进我们的脚本,如果需要的话,我们可以重用这些原子函数来创建更复杂的场景,这样就更容易理解我们的测试脚本的内容是的。

还有更好的方法来优化并对响应和请求结果进行更好的参数化,您认为我们可以做什么?

3.3.动态数据和参数化

使用动态数据来模拟更真实的场景并加载不同的数据集。 K6 允许我们使用共享数组从文件加载数据。共享数组是一种存储数据的方式,所有 VU 都可以访问。

我们可以创建一个 users-config.js 文件来从 JSON 文件 users.json 加载用户数据。

brew install k6
# Or with Docker
docker run -i grafana/k6 run - <script.js
登录后复制
登录后复制
登录后复制
import http from "k6/http";
import { check, sleep } from "k6";

// Define the API endpoint and expected response
export default function () {
  const res = http.get("https://jsonplaceholder.typicode.com/posts/1");

  // Define the expected response
  const expectedResponse = {
    userId: 1,
    id: 1,
    title:
      "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto",
  };

  // Assert the response is as expected
  check(res, {
    "status is 200": (r) => r.status === 200,
    "response is correct": (r) =>
      JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse),
  });

  sleep(1);
}
登录后复制
登录后复制
登录后复制

然后我们可以在测试脚本 jsonplaceholder-api-rest.js 中使用它。

K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=html-report.html k6 run ./src/rest/jsonplaceholder-api-rest.js
登录后复制
登录后复制
登录后复制

4. 项目结构

组织良好的项目结构有助于维护和扩展您的测试。以下是建议的文件夹结构:

http://127.0.0.1:5665/
登录后复制
登录后复制
登录后复制

这种结构有助于保持项目组织有序、可扩展且易于维护,避免项目根目录混乱。

另一种选择是按功能将测试脚本分组到文件夹中,您可以测试和比较对您的上下文最有意义的内容。例如,如果您的项目是关于进行交易的钱包,您可以为每种类型的交易(存款、取款、转账等)创建一个文件夹,并且在每个文件夹内您可以拥有该特定交易的测试脚本。

import http from "k6/http";
import { check } from "k6";

// Define the query and variables
const query = `
  query getPokemon($name: String!) {
    pokemon(name: $name) {
      id
      name
      types
    }
  }`;

const variables = {
  name: "pikachu",
};

// Define the test function
export default function () {
  const url = "https://graphql-pokemon2.vercel.app/";
  const payload = JSON.stringify({
    query: query,
    variables: variables,
  });

  // Define the headers
  const headers = {
    "Content-Type": "application/json",
  };

  // Make the request
  const res = http.post(url, payload, { headers: headers });

  // Define the expected response
  const expectedResponse = {
    data: {
      pokemon: {
        id: "UG9rZW1vbjowMjU=",
        name: "Pikachu",
        types: ["Electric"],
      },
    },
  };

  // Assert the response is as expected
  check(res, {
    "status is 200": (r) => r.status === 200,
    "response is correct": (r) =>
      JSON.stringify(JSON.parse(r.body)) === JSON.stringify(expectedResponse),
  });
}
登录后复制
登录后复制
登录后复制

在第二个示例中,我们有一个更复杂的数据结构,但我们仍然可以重用为第一个示例创建的相同请求函数。

结论

K6 性能测试对于识别瓶颈和确保应用程序可扩展性至关重要。通过遵循模块化代码、集中配置和使用动态数据等最佳实践,工程师可以创建可维护和可扩展的性能测试脚本。

大大的拥抱。

查理自动化

以上是Grafana Kheat 表:性能工程师应该知道的一切的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1675
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

C/C在JavaScript口译员和编译器中的作用 C/C在JavaScript口译员和编译器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

Python vs. JavaScript:比较用例和应用程序 Python vs. JavaScript:比较用例和应用程序 Apr 21, 2025 am 12:01 AM

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

See all articles