负载测试示例
负载测试是一种软件测试类型,旨在确保应用程序能够处理预期的工作负载,同时保持稳定的性能并提供良好的最终用户体验。虽然团队在进行负载测试时可能有多个目标,但主要目的是模拟系统在生产环境典型一天中的平均活动量。
本文将介绍负载测试过程中的一些常见步骤,并详细讲解一些具体的负载测试示例。
如何执行负载测试?
执行负载测试的具体过程可能因您要测试的系统或应用程序以及您的总体目标和要求而异。不过,要执行简单的负载测试,您很可能需要使用 Grafana k6 等负载测试工具来创建和运行测试脚本。
然后,测试本身通常包括以下步骤:
- 增加脚本活动,直到达到模拟用户数和吞吐量的预期值。这有时被称为预热期(ramp-up period),通常占总测试时长的 5% 到 15%。此预热期让您的系统有时间预热或自动伸缩以处理流量。
- 在设定的时间内维持预期负载。通常,最佳实践是平均持续时间至少比预热期长五倍,以便您可以在足够长的时间窗口内评估性能。
- 根据测试用例,在设定的时间段后完全停止测试,或者让其逐渐减少负载(ramp down)。

负载测试的步骤有哪些?
同样,负载测试过程中的具体步骤可能有所不同,但测试人员通常会经历一系列步骤,包括:
- 定义测试要求和范围:这包括选择您要测试的特定功能、函数或用户旅程。无论您测试哪个系统,都要确保了解特定的用户数量和每个进程的典型吞吐量。要找到这些信息,请查看提供来自生产环境信息的应用程序性能监控 (APM) 或分析工具。如果您找不到这些信息,请尽力估算这些数字。
- 创建测试脚本:使用 Grafana k6 等负载测试工具,您将构建一个自动化负载测试的脚本。
- 运行脚本:脚本将运行直到达到定义的用户数和吞吐量。然后,该负载将保持指定的时长,之后测试会停止或逐渐减少负载。
- 分析测试结果:查看生成的测试结果,了解系统在满负载期间的性能和资源消耗是否保持稳定。在某些情况下,系统在此期间可能表现不佳——这表明可能存在您需要识别和解决的潜在问题。另一方面,即使系统在负载下表现良好,您可能也想进行进一步的测试,例如压力测试,以评估其在高于平均负载下的表现。
负载测试有哪些示例?
负载测试适用于任何应用程序,涵盖广泛的用例,但以下是一些您可能进行负载测试的常见应用程序或系统示例:
- 电子商务网站。在此场景中,测试人员模拟用户浏览产品、将商品添加到购物车和完成购买。他们还会考虑不同类型的用户,例如新客户和回访客户,以及不同类型的浏览行为,例如搜索特定产品或浏览分类。
- 银行应用程序。测试人员模拟用户执行不同类型的交易,例如资金转账、余额查询和贷款申请。他们会包括不同类型的用户,例如个人客户和商业客户,以及不同类型的交易量。
- 医疗保健应用程序。虚拟用户(代表患者或医疗保健提供者)访问医疗记录、安排预约和申请处方。测试应涵盖不同类型的使用模式,例如预约安排的高峰时段。
- 视频流平台。在对视频流平台进行负载测试时,团队会模拟大量用户观看视频、搜索内容以及与平台功能交互。测试还可以模拟不同的观看行为,包括在不同设备和不同分辨率下的流媒体。
除了这些类型的网站和应用程序,团队可能还会对其他系统组件进行负载测试,例如 API。
如何在线进行负载测试
一般来说,负载测试网站的目的是模拟真实用户流量,以确保可靠性并防止故障。您可以选择各种网站测试方法,包括:
- 后端与前端性能测试:后端性能测试针对托管网站的服务器,而前端测试更侧重于用户界面层面的最终用户体验。
- 基于协议、基于浏览器或混合负载测试:基于协议的负载测试模拟支持用户操作的请求(如 HTTP 请求),而基于浏览器的测试模拟用户通过浏览器访问网站的方式。混合负载测试则结合了这两种方法。
- 组件测试与端到端测试:组件测试侧重于特定网站组件或功能的性能,而端到端测试则跟踪用户行为对整个技术栈的影响。

为了说明网站负载测试过程可能是什么样子,我们来看一个基于浏览器的负载测试示例。同样,基于浏览器的测试目标是通过模拟真实用户通过浏览器访问网站来评估前端性能。
例如,一个基于浏览器的负载测试脚本可能包含导航到网页、点击按钮和在表单中输入文本的指令。这些用户操作会触发协议层面的底层请求。
以下是一个使用 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();
}
}
负载测试和压力测试示例
如前所述,负载测试是一种软件测试类型,它将模拟工作负载施加到系统(应用程序、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 是一款开源负载测试工具。团队可以使用 k6 测试系统的可靠性和性能,并更快地识别问题。Grafana Cloud k6 是 Grafana k6 的托管和完全管理版本。
k6 的一些最大优势在于其基于代码的脚本编写以及它满足开发者体验的需求。
k6 主要围绕四个核心支柱构建:
- 使用户能够编写脚本和配置其工作负载:虽然 k6 是用 Go 编写的,但 k6 用户使用 JavaScript 编写其工作负载,k6 通过其 goja 解释器运行。k6 还支持各种开源技术、工具和协议,并通过其扩展提供了定制和灵活性。
- 规划和执行测试:用户通过可配置选项定义他们想要复现的特定执行场景。然后,k6 创建一个执行计划并执行,以符合用户的要求。
- 收集软件性能测量数据,例如响应时间:k6 收集测量数据,然后将其分类并聚合成指标,例如响应时间。
- 将结果转发给用户:测试结束摘要为用户提供即时且可操作的洞察。
现在,让我们来看一个简短简单的 k6 负载测试示例(注意:本示例假设您已经安装了 k6)。
假设您的团队刚刚创建了一个新的登录端点,但在发布之前,想测试其功能性。在 k6 中,您可以编写一个测试,向新端点发送一个 POST 请求,并创建一个响应状态检查。
首先,您需要为该端点添加逻辑。为此,您需要发出一个 HTTP 请求:
- 导入 HTTP 模块。
- 创建一个用于认证用户的负载。
- 使用 `http.post` 方法将带有负载的请求发送到端点。
要测试,请复制此文件并将其保存为 `api-test.js`
// import necessary module
import http from 'k6/http';
export default function () {
// define URL and payload
const url = 'https://test-api.k6.io/auth/basic/login/';
const payload = JSON.stringify({
username: 'test_case',
password: '1234',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
// send a post request and save response as a variable
const res = http.post(url, payload, params);
}
使用 `k6 run` 命令运行脚本:
k6 run api-test.js
测试完成后,k6 会报告默认结果摘要。
/\ |‾‾| /‾‾/ /‾‾/
/\ / \ | |/ / / /
/ \/ \ | ( / ‾‾\
/ \ | |\ \ | (‾) |
/ __________ \ |__| \__\ \_____/ .io
execution: local
script: api-test.js
output: -
...
可选步骤是,您可以将响应体记录到控制台,以确保您获得了正确的响应。
export default function () {
...
const res = http.post(url, payload, params);
// Log the request body
console.log(res.body);
}
添加响应检查
验证请求格式正确后,添加一个检查以验证系统是否返回了预期的状态码。
更新您的脚本,使其包含以下检查函数:
// Import necessary modules
import { check } from 'k6';
import http from 'k6/http';
export default function () {
// define URL and request body
const url = 'https://test-api.k6.io/auth/basic/login/';
const payload = JSON.stringify({
username: 'test_case',
password: '1234',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
// send a post request and save response as a variable
const res = http.post(url, payload, params);
// check that response is 200
check(res, {
'response code was 200': (res) => res.status == 200,
});
}
再次运行脚本
k6 run api-test.js
检查您的检查结果输出。它应该看起来像这样:
✓ response code was 200
JMeter 负载测试示例
与 Grafana k6 类似,JMeter 是一款开源负载测试工具。它由 Apache 基金会完全用 Java 构建。与 Grafana k6 类似,JMeter 支持多种协议,并提供详细的测试结果摘要,帮助用户分析系统性能并确定后续步骤。
Grafana k6 和 JMeter 之间的主要区别之一是,虽然 JMeter 用户可以使用代码扩展测试脚本,但大多数脚本编写是通过 GUI 完成的。GUI 模型最大的优势之一是入门门槛低;对于习惯于使用 Postman 或 SoapUI 等无代码 UI 的测试人员来说,带有 GUI 的负载测试工具更容易学习。话虽如此,GUI 模型的一个潜在缺点是它可能会给应用程序增加更多的资源开销。
这里有一个简单的示例,说明如何在 JMeter 与 k6 中测试预期的 404 响应。在 JMeter 中,您将通过 GUI 点击并填写值输入字段。您将在测试下创建一个新的响应断言(Response Assertion)。在断言的“要测试的响应字段”(Response Field to Test)部分,您将勾选“忽略状态”(Ignore Status)复选框。
然后,您可以根据需要添加其他断言,例如将“要测试的响应字段”(Response Field to Test)中的单选按钮设置为“响应代码”(Response Code),并将“要测试的模式”(Patterns to Test)设置为“404”。
在 k6 中,您将使用以下脚本代码:
let response = http.get("http://some.url/”);
check(res, {
"Status is 404": (r) => r.status === 404
});
总的来说,JMeter 非常适合传统的软件测试团队或偏爱 GUI 驱动测试工具的团队。同时,Grafana k6 专为跨职能工程团队以及希望将负载测试集成到 DevOps 工作流程或 CI/CD 管道中的团队设计。
更多负载测试示例
负载测试是一种重要的软件测试类型,用于确保您的系统能够处理预期的工作负载,同时保持高质量的用户体验。在开始之前,回顾一些常见的负载测试示例可能会有所帮助。
我们提供以下资源来指导您:
如果您想探索更多负载测试用例,请查看我们的 Grafana k6 文档中的更多示例。
更轻松的入门方式
Grafana Cloud 是开始使用指标、日志、跟踪和仪表盘的最简单方式。我们提供了慷慨的永久免费套餐以及适用于各种用例的付费方案。