负载测试
负载测试曾经严格属于指定质量保证团队的职责范围——开发人员编写代码,然后将其交给质量保证团队来查看其在压力下的性能。但如今这种情况很少见,因为开发和运营在更快、更迭代的软件开发周期中变得越来越一致。
因此,您可能会在团队中听到更多关于负载测试的讨论,但您是否了解负载测试的内容以及它如何使您的组织受益?在这里,我们将帮助您了解负载测试并解释为什么它是软件生命周期中一个至关重要的组成部分。
什么是负载测试?
负载测试是一种软件测试形式,它对系统(应用程序、API 或网站)施加模拟工作负载以查看其性能。它帮助组织确保其系统能够处理预期工作负载,同时保持稳定、高质量的用户体验。团队还会执行负载测试以应对可能导致系统速度变慢、崩溃或产生其他类型错误的流量峰值。
负载测试可能有多个目标,但通常您需要了解该系统如何响应正常和峰值使用情况。这包括它如何处理用户数量、事务和数据量的变化。然后,您可以将测试结果与应用程序和系统指标可视化和关联,以全面了解系统性能。
负载测试类型
负载测试属于哪种类型的测试?
负载测试是性能测试的一个子集,通常会查看系统如何响应正常和峰值使用情况。您需要查找响应时间缓慢、错误、崩溃和其他问题,以确定系统在性能下降之前可以容纳多少用户和事务。
如今,测试人员通常依赖于专门的基于云的自动化工具,例如 Grafana Cloud k6,使用虚拟用户和模拟数据量来测试系统,以查看额外负载如何影响性能。他们监控和测量响应时间、吞吐量和资源利用率,以检测潜在的瓶颈或扩展问题,这些问题需要在系统部署到生产环境之前解决。
负载测试与性能测试
虽然负载测试和性能测试相关,但它们是不同的测试类型。
正如我们所讨论的,负载测试模拟用户活动以确定系统在增加流量或负载的情况下能够承受的程度。
性能测试是一个总称,用于衡量应用程序的整体性能。这可能包括测试速度、可扩展性、可靠性和资源利用率,以识别改进的领域。性能测试包括负载测试,但也包含其他类型的测试,例如浏览器性能测试和合成监控。
负载测试有多少种类型?
您可以对应用程序执行几种不同的负载测试。考虑以下测试类型,它们对应于不同的目标和负载配置文件
- 冒烟测试:验证系统在最小负载下的功能。
- “平均”负载测试:了解系统在典型流量下的功能。
- 压力测试:了解系统在峰值流量下的负载下的功能。
- 尖峰测试:了解系统在流量突然大幅增加时的功能。
- 断点测试:逐步增加流量以发现系统断点。
- 浸泡测试: 了解系统在较长时间的负载下是否或何时会降级。
负载测试的总体目标决定了您可能需要的负载测试类型。您选择的测试类型将进一步告知您如何计划和构建负载测试。但每个应用程序、组织和测试项目都不同。
我们对负载测试的建议始终是从简单开始并频繁测试。您可以随时迭代和扩展测试套件。
在负载测试中,压力测试是什么?
压力测试是一种流行的负载测试类型,它评估系统在工作负载比平时更重时的性能。压力测试也可能被称为高峰时段测试、突增测试或扩展测试。
压力测试验证系统在比正常使用更重的使用情况下的稳定性和可靠性。系统可能会在不同寻常的时刻(例如流程截止日期、发薪日、高峰时段、周末结束以及可能导致频繁出现高于平均水平的流量的许多其他场合)收到高于平常的工作负载。
负载测试工具
哪个是最好的负载测试工具?
最佳的负载测试工具是能够最符合您特定需求的工具。也就是说,选择始终是主观的。基础设施和应用程序的需求可能千差万别,而负载测试的重点将影响您的决策。
尽管如此,在选择最佳负载测试工具时,您应该寻找一些关键功能。
- 易于使用的 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 个值得考虑的流行开源负载测试工具。
- ApacheBench
- Apache JMeter
- Artillery
- Gatling
- Grafana k6
- Locust
- Siege
- Taurus
- The Grinder
- Tsung
负载测试工具:免费与商业
一个开源工具可以成为构建概念验证的一种极佳且经济高效的方式。它也适用于在简单、不频繁的测试中工作的较小团队。但是,在为复杂用户场景做准备时进行频繁测试的团队应该考虑超越基本功能的强大解决方案。在一定规模下,管理流程所需的专业知识水平会变得过高。
以下是按字母顺序排列的 10 种最流行的付费负载测试解决方案。
- Akamai CloudTest
- BlazeMeter
- Grafana Cloud k6
- Headspin
- LoadRunner
- LoadNinja
- LoadView
- NeoLoad
- New Relic
- Radview WebLOAD
当然,它不一定是二选一的选择。许多组织使用开源和专有工具的混合来满足其负载测试需求。无论如何,在将任何工具嵌入到您的测试策略中之前,请确保计算各种选项的总拥有成本。
API 的负载测试工具
对 API 进行负载测试的团队可以改善加载时间和整体性能。他们还可以降低故障风险,并通过避免中断和更高效地运行来帮助降低成本。许多工具都是针对 API 负载测试而设计的,包括 BlazeMeter、Grafana k6、JMeter、Postman 和 Taurus,仅举几例。
通常,API 负载测试从评估小型、隔离的组件开始。每次相应的迭代,测试都会扩展,直到它们对 API 的工作流程以及它与其他 API 的交互方式(如果适用)获得更完整的端到端视角。
负载测试示例
负载测试的示例有哪些?
负载测试有利于任何应用程序,并涵盖广泛的用例,但以下是一些团队可能会进行负载测试的常见应用程序示例。
- 电子商务网站。在此场景中,测试人员模拟用户浏览产品、将商品添加到购物车并完成购买。他们还考虑了不同类型的用户,例如新用户和回头客,以及不同类型的浏览行为,例如搜索特定产品或浏览类别。
- 银行应用程序。测试人员模拟用户执行不同类型的交易,例如资金转账、余额查询和贷款申请。他们包括不同类型的用户,例如个人和商业客户,以及不同类型的交易量。
- 医疗保健应用程序。虚拟用户(患者、医疗保健提供者等)访问医疗记录、安排预约和请求处方。测试应解决不同类型的使用模式,例如高峰预约安排时间。
- 视频流媒体平台。在对视频流媒体平台进行负载测试时,团队会模拟大量用户观看视频、搜索内容以及与平台功能进行交互。这可以考虑免费和付费订阅者,以及不同的观看行为,包括在不同设备和不同分辨率下进行流式传输。
除了这些类型的网站和应用程序外,团队还可以对其他系统组件进行负载测试,例如 API。
负载测试和压力测试示例
如前所述,负载测试是一种软件测试形式,它会对系统(应用程序、API 或网站)施加模拟工作负载,以查看其性能。压力测试是一种特殊的负载测试,用于评估系统在工作负载高于平时时的性能。
压力测试过程的步骤通常与之前概述的负载测试步骤非常相似,只是它们涉及更高的负载量。以下是在 Grafana k6 中的压力测试脚本示例,该脚本将模拟用户数量提高到 200 多个,并保持该数量 30 分钟。
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 围绕四个主要支柱构建
- 使用户能够编写脚本和配置其工作负载:虽然 k6 是用 Go 编写的,但 k6 用户使用 JavaScript 来概述其工作负载,k6 使用其goja 解释器运行这些工作负载。k6 还支持各种开源技术、工具和协议,并允许通过其扩展进行自定义和灵活性。
- 计划和执行测试:用户定义他们希望通过可配置选项复制的特定执行场景。然后,k6 创建一个执行计划并执行该计划以符合用户的需求。
- 收集软件性能的测量值,例如响应时间:k6 收集测量值,然后将其分类并聚合到指标中,例如响应时间。
- 将结果转发给用户:测试结束摘要为用户提供即时且可操作的见解。
以下是如何发出 HTTP/2 请求的基本 k6 负载测试脚本示例。
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',
});
}
如何在网上进行负载测试
总的来说,网站负载测试的目标是模拟真实用户流量以提高可靠性并防止潜在的故障。测试团队可以选择各种网站测试方法,例如
- 后端与前端性能测试
- 基于协议、基于浏览器或混合负载测试
- 组件测试与端到端测试
为了说明网站负载测试过程可能是什么样子,让我们来看一个基于浏览器的负载测试示例。基于浏览器的负载测试通过模拟真实用户通过浏览器访问网站来衡量前端性能。
例如,基于浏览器的负载测试脚本可能包括导航到网页、单击按钮以及在表单中输入文本的说明。然后,这些用户操作会触发协议层上的底层请求。
以下是 Grafana k6 中基于浏览器的负载测试脚本示例,具体来说,是使用k6 浏览器模块。该脚本访问主页,然后模拟用户搜索并点击产品页面链接。
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)来创建和运行测试脚本。然后,测试本身通常会遵循以下过程示例。
- 增加脚本的活动,直到达到所需的模拟用户数和吞吐量。
- 在一段时间内保持该负载。
- 根据测试用例,在此设定时间段后完全停止测试,或使其逐渐下降。
负载测试的步骤有哪些?
虽然在负载测试过程中遵循的确切步骤可能会有所不同,但测试人员通常会经历一系列步骤,其中包括以下示例中概述的步骤。
- 定义测试要求和范围:这包括选择要测试的特定功能、函数或用户旅程。对于他们正在测试的任何系统,团队都应了解特定用户数量以及每个流程的典型吞吐量。
- 创建测试脚本:使用 Grafana k6 等负载测试工具,团队将构建一个自动化负载测试的脚本。
- 运行脚本:该脚本将持续运行,直到达到定义的用户数量和吞吐量。然后,该负载将在指定的时间段内保持,之后测试停止或逐渐下降。
- 分析测试结果:根据生成的测试结果,测试团队可以评估其系统的性能和资源消耗在满负荷期间是否保持稳定。在某些情况下,系统在此期间可能会表现不佳或不稳定,这表明可能存在需要识别和解决的潜在问题。另一方面,即使系统运行良好并且能够承受典型负载,团队也可能会选择执行进一步的测试(例如压力测试),以评估其在高于平均水平的条件下的性能。
负载测试优势
如果您的公司构建软件、API 或应用程序(或以上所有),则现代负载测试必不可少。
负载测试可以提高组织的整体性能,因为团队可以
- 快速推进并确保版本的质量。
- 正确评估新的或更改的基础设施。
- 预防或减少由于软件或 API 问题造成的风险。
- 最大程度地降低故障成本。
- 为高峰事件和需求激增做好应用程序准备。
- 提供快速可靠的卓越用户体验。
- 确保团队能够满足服务水平协议 (SLA)。
整个组织的团队都应采用负载测试,因为测试流程中的人员越多,产品就越可靠、性能越高。当您的产品运行良好时,您的用户会做出积极的反应,这对您的业务和整个组织都有利。
更轻松的入门方式
Grafana Cloud 是开始使用指标、日志、跟踪和仪表板的最简单方法。我们提供永久免费的慷慨套餐以及适用于每种用例的计划。