负载测试

负载测试曾经是指定 QA 团队的专属领域——开发人员编写代码,然后将其交给 QA 查看其在压力下的表现。但如今情况很少如此,因为在更快、更迭代的软件开发周期中,开发和运维越来越紧密地结合在一起。

因此,您可能在团队中听到越来越多关于负载测试的讨论,但您知道负载测试具体涉及什么以及它如何使您的组织受益吗?在这里,我们将帮助您理解负载测试,并解释为什么它是软件生命周期中的关键组成部分。

什么是负载测试?

负载测试是一种软件测试形式,它对系统(应用、API 或网站)施加模拟工作负载,以查看其性能如何。它帮助组织确保其系统能够处理预期工作负载,同时保持稳定、高质量的用户体验。团队还执行负载测试,为流量高峰做准备,这些高峰可能导致系统变慢、崩溃或产生其他类型的错误。

负载测试可以有多个目标,但通常您是在查看该系统对正常和峰值使用情况的响应。这包括它如何处理不断变化的用户数量、事务和数据量。然后,您可以将测试结果与应用和系统指标进行可视化和关联,以全面了解您的系统性能。

Grafana dashboard with correlated metrics with Grafana k6 load testing results.
使用 Grafana 可视化您的负载测试结果,以便在测试运行期间或多次运行中分析性能。

负载测试类型

负载测试属于哪种类型的测试?

负载测试是性能测试的一个子集,通常用于查看系统对正常和峰值使用情况的响应。您需要寻找响应时间慢、错误、崩溃和其他问题,以确定在性能下降之前,系统可以容纳多少用户和事务。

如今的测试人员通常依靠专业的云端自动化工具,如 Grafana Cloud k6,通过虚拟用户和模拟数据量来测试系统,以查看额外负载如何影响性能。他们监控和测量响应时间、吞吐量和资源利用率,以检测在系统部署到生产环境之前需要解决的潜在瓶颈或扩展问题。

负载测试对比性能测试

尽管负载测试和性能测试相关联,但它们是不同的测试类型。

正如我们所讨论的,负载测试模拟用户活动,以确定系统在流量或负载增加时的处理能力。

性能测试是衡量应用整体性能的统称。它可能包括对速度、可扩展性、可靠性和资源利用率的测试,以找出需要改进的地方。性能测试包括负载测试,但也涵盖其他类型的测试,如浏览器性能测试和合成监控。

负载测试有多少种类型?

您可以在应用上执行多种不同的负载测试。考虑以下测试类型,它们对应不同的目标和负载配置文件

  • 冒烟测试:验证系统在最小负载下的功能。
  • “平均”负载测试:发现系统在典型流量下的运行情况。
  • 压力测试:发现系统在峰值流量负载下的运行情况。
  • 峰值测试:发现系统在流量突然大幅增加时的运行情况。
  • 断点测试:逐步增加流量,发现系统崩溃点。
  • 浸泡测试:发现系统在长时间负载下是否会劣化或何时会劣化。
Diagram showing the different load testing types and load volumes and duration

负载测试的总体目标决定了您可能需要哪种(或哪几种)负载测试。您选择的测试类型将进一步指导您如何规划和构建负载测试。但不同的应用、组织和测试项目有所不同。

我们对负载测试的建议始终是从简单开始,频繁测试。您随时可以迭代并扩展测试套件。

负载测试中的压力测试是什么?

压力测试是一种常用的负载测试类型,用于评估系统在工作负载高于平时时的表现。压力测试也可能被称为高峰时段测试突增测试扩展测试

Diagram showing how a stress test works

压力测试验证系统在高于正常使用情况下的稳定性和可靠性。系统在非正常时段,例如流程截止日期、发薪日、高峰时段、工作周结束等许多可能导致频繁高于平均水平流量的时刻,可能会收到高于平时的工作负载。

负载测试工具

哪种是最好的负载测试工具?

最好的负载测试工具是最适合您特定需求的工具。也就是说,选择始终是主观的。基础设施和应用需求差异巨大,您的负载测试重点将影响您的决定。

不过,在选择最佳负载测试工具时,您应注意以下几个关键功能

  • 易于使用的 API 和 CLI
  • 可以使用熟悉的脚本语言构建测试
  • 自动化测试
  • 高性能和可扩展性
  • 支持多种数据存储
  • 支持其他类型测试的更广泛功能

JMeter 是负载测试工具吗?

Apache JMeter 是最受欢迎的负载测试工具之一,并且已经流行了一段时间。该开源项目于 1998 年首次发布,完全由 Apache 软件基金会 用 Java 构建,并因其作为当时流行的商业工具的免费替代品而受到关注。

JMeter 负载测试

与 Grafana k6 一样,JMeter 支持多种协议,并提供详细的测试结果摘要,帮助用户分析系统性能并确定下一步行动。

总的来说,JMeter 非常适合传统的软件测试团队或偏爱 GUI 驱动测试工具的用户。虽然 JMeter 用户可以通过代码扩展测试脚本,但大多数脚本编写都是通过 GUI 完成的。相比之下,像 Grafana k6 这样的工具是为跨职能工程团队以及希望将负载测试集成到 DevOps 工作流或 CI/CD 管道中的团队设计的。

根据 JMeter 网站,这个 Java 应用最初是为测试 Web 应用而设计的,但后来已扩展到其他类型的软件测试。它可以模拟各种类型的负载,以便您了解对系统性能的潜在影响。测试人员可以使用代码执行他们的脚本,但在 JMeter 中,大多数脚本编写都是在 UI 中完成的。

负载测试工具:开源

JMeter 可能已经表明开源可以与专有产品竞争,但它并非一枝独秀。以下按字母顺序排列,是 10 款值得考虑的流行开源负载测试工具

  1. ApacheBench
  2. Apache JMeter
  3. Artillery
  4. Gatling
  5. Grafana k6
  6. Locust
  7. Siege
  8. Taurus
  9. The Grinder
  10. Tsung

负载测试工具:免费对比商业版

一个开源工具可以是构建概念验证的一个极好且经济高效的方式。对于进行简单、不频繁测试的小团队来说,它也运行良好。然而,为复杂用户场景频繁进行测试的团队应考虑功能超出基本需求的强大解决方案。在达到一定规模时,管理流程所需的专业知识水平会变得过高。

以下按字母顺序排列,是 10 款最受欢迎的付费负载测试解决方案

  1. Akamai CloudTest
  2. BlazeMeter
  3. Grafana Cloud k6
  4. Headspin
  5. LoadRunner
  6. LoadNinja
  7. LoadView
  8. NeoLoad
  9. New Relic
  10. Radview WebLOAD

当然,这并非二选一。许多组织混合使用开源和专有工具来满足其负载测试需求。无论如何,在将任何工具嵌入到您的测试策略之前,请务必计算各种选项的总拥有成本。

用于 API 的负载测试工具

对 API 进行负载测试的团队可以改善加载时间和整体性能。它们还可以通过避免宕机和更高效地运行来降低故障风险并帮助降低成本。有许多工具是专为 API 负载测试设计的,包括 BlazeMeter、Grafana k6、JMeter、Postman 和 Taurus 等等。

通常,API 负载测试始于评估小型、独立的组件。随着每一次相应的迭代,测试范围会扩大,直到获得更完整、端到端的 API 工作流视图,并可能了解它如何与其他 API 交互。

负载测试示例

负载测试的示例有哪些?

负载测试对任何应用都有益,涵盖广泛的用例,以下是一些团队可能进行负载测试的常见应用示例

  1. 电子商务网站。在这种场景下,测试人员模拟用户浏览商品、将商品添加到购物车以及完成购买。他们还考虑到不同类型的用户,例如新用户和回访用户,以及不同类型的浏览行为,例如搜索特定商品或浏览类别。
  2. 银行应用。测试人员模拟用户执行不同类型的交易,例如资金转账、余额查询和贷款申请。他们包括不同类型的用户,例如个人和企业客户,以及不同类型的交易量。
  3. 医疗保健应用。虚拟用户(患者、医护人员等)访问医疗记录、预约和请求处方。测试应解决不同类型的使用模式,例如预约高峰时段。
  4. 视频流平台。在对视频流平台进行负载测试时,团队模拟大量用户观看视频、搜索内容以及与平台功能互动。这可以考虑到免费和付费订阅用户以及不同的观看行为,包括在不同设备和不同分辨率下进行流式传输。

除了这些类型的网站和应用之外,团队还可能对其他系统组件进行负载测试,例如 API

负载测试和压力测试示例

如前所述,负载测试是一种软件测试形式,它对系统(应用、API 或网站)施加模拟工作负载,以查看其性能如何。压力测试是一种特定类型的负载测试,用于评估系统在工作负载高于平时时的表现。

压力测试过程的步骤通常与前面概述的负载测试步骤非常相似——它们只是涉及更高的负载量。以下是在 Grafana k6 中进行压力测试脚本的示例,该脚本逐渐增加到 200 多个模拟用户,并维持该负载量 30 分钟

JavaScript
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  // Key configurations for Stress in this section
  stages: [
    { duration: '10m', target: 200 }, // traffic ramp-up from 1 to a higher 200 users over 10 minutes.
    { duration: '30m', target: 200 }, // stay at higher 200 users for 30 minutes
    { duration: '5m', target: 0 }, // ramp-down to 0 users
  ],
};

export default () => {
  const urlRes = http.get('https://test-api.k6.io');
  sleep(1);
  // MORE STEPS
  // Here you can have more steps or complex script
  // Step1
  // Step2
  // etc.
};

k6 负载测试示例

Grafana k6 是一款开源 (OSS) 负载测试工具。团队可以使用 k6 测试系统的可靠性和性能,并更快速地识别问题。Grafana Cloud k6 是 Grafana k6 的托管和全管理版本。

k6 的一些最大优势在于其基于代码的脚本编写以及它迎合开发者体验的事实。

k6 基于四大支柱构建

  1. 使用户能够编写脚本并配置其工作负载:虽然 k6 是用 Go 编写的,但 k6 用户使用 JavaScript 描述其工作负载,k6 使用其 goja 解释器 运行 JavaScript。k6 还支持各种开源技术、工具和协议,并通过其扩展实现自定义和灵活性。
  2. 规划和执行测试:用户通过可配置选项定义他们希望复制的特定执行场景。然后,k6 创建一个执行计划并执行,以符合用户的要求。
  3. 收集软件性能测量数据,例如响应时间:k6 收集测量数据,然后将其分类并聚合为指标,例如响应时间。
  4. 将结果转发给用户:测试结束时的摘要为用户提供即时且可操作的洞察。

以下是一个基本的 k6 负载测试脚本示例,用于发出 HTTP/2 请求

JavaScript
import http from 'k6/http';
import { check } from 'k6';

export default function () {
  const res = http.get('https://test-api.k6.io/');
  check(res, {
    'status is 200': (r) => r.status === 200,
    'protocol is HTTP/2': (r) => r.proto === 'HTTP/2.0',
  });
}

如何在线进行负载测试

通常,对网站进行负载测试的目标是模拟真实用户流量,以提高可靠性并防止潜在故障。测试团队可以选择各种网站测试方法,例如

  • 后端对比前端性能测试
  • 基于协议、基于浏览器或混合负载测试
  • 组件测试对比端到端测试
Diagram showing frontend and backend performance testing
后端对比前端性能测试

为了说明网站负载测试过程可能是什么样子的,让我们来看一个基于浏览器的负载测试示例。基于浏览器的负载测试通过模拟真实用户通过浏览器访问网站来衡量前端性能。

例如,一个基于浏览器的负载测试脚本可能包括导航到网页、点击按钮以及在表单中输入文本的指令。这些用户操作随后会在协议层触发底层请求。

以下是在 Grafana k6 中使用k6 浏览器模块进行基于浏览器的负载测试脚本示例。该脚本访问主页,然后模拟用户搜索并点击产品页面链接

JavaScript
import { browser } from 'k6/experimental/browser';
import { sleep } from 'k6';

export default async function () {
  const page = browser.newPage();

  // 01. Go to the homepage
  try {
    await page.goto('https://mywebsite.com');

    page.waitForSelector('p[class="woocommerce-result-count"]"]');
    page.screenshot({ path: 'screenshots/01_homepage.png' });

    sleep(4);

    // 02. View products
    const element = page.locator('a[class="woocommerce-LoopProduct-link woocommerce-loop-product__link"]');
    await element.click();
    page.waitForSelector('button[name="add-to-cart"]');
    page.screenshot({ path: 'screenshots/02_view-product.png' });

    sleep(1);
  } finally {
    page.close();
  }
}

如何进行负载测试?

负载测试的目标是在给定情境下模拟系统上的特定用户活动量——无论是平常的一天、预期的活动高峰(例如,在线零售商的假日促销),还是您想了解系统整体能承受的极限。

执行负载测试的具体流程因您要测试的系统或应用以及您的总体目标和要求而异。然而,要进行一个简单的负载测试,您很可能会使用 Grafana k6 或 JMeter 等负载测试工具来创建和运行测试脚本。然后,测试本身通常会遵循以下示例流程

  1. 增加脚本活动,直到达到所需的模拟用户数量和吞吐量。
  2. 在设定的一段时间内保持该负载。
  3. 根据测试用例,可以在设定的时间段后完全停止测试,或让其逐渐降低负载。

负载测试的步骤有哪些?

虽然负载测试过程中的具体步骤可能因情况而异,但测试人员通常会按照一系列步骤进行,其中包括下面示例中概述的步骤

  1. 定义测试需求和范围:这包括选择您想要测试的特定功能、特性或用户旅程。无论他们测试的是哪个系统,团队都应该知道具体的用户数量以及每个流程的典型吞吐量。
  2. 创建测试脚本:使用像 Grafana k6 这样的负载测试工具,团队将构建一个自动化负载测试的脚本。
  3. 运行脚本:脚本将运行直到达到定义的用户数量和吞吐量。然后,该负载将维持一段时间,之后测试停止或逐渐降低负载。
  4. 分析测试结果:根据生成的测试结果,测试团队可以评估他们的系统在满负载期间的性能和资源消耗是否保持稳定。在某些情况下,系统在此期间可能表现不佳或不稳定——这表明可能存在需要识别和解决的潜在问题。另一方面,即使系统性能良好且在典型负载下能够正常运行,团队也可能选择执行进一步的测试,例如压力测试,以评估其在高于平均水平条件下的表现。

负载测试的优势

如果您的公司构建软件、API 或应用——或全部这些——现代负载测试是必要的。

负载测试提高了组织的整体性能,因为团队可以

  • 快速迭代并确保发布质量。
  • 正确评估新的或更改的基础设施。
  • 预防或减少由软件或 API 问题引起的风险。
  • 最大限度地降低故障成本。
  • 为高峰事件和需求激增做好应用准备。
  • 提供快速可靠的出色用户体验。
  • 确保团队能够满足服务级别协议 (SLA)。

您的组织内各个团队都应该采用负载测试,因为更多人参与测试过程意味着更可靠、高性能的产品。当您的产品运行良好时,用户会给予积极响应,这对您的业务和整个组织都有好处。

更轻松的入门方式

Grafana Cloud 是开始使用指标、日志、链路追踪和仪表盘的最简单方式。我们提供了慷慨的永久免费套餐以及适用于各种用例的付费计划。