LoadRunner 中的参数化、函数、事务

⚡ 智能摘要

参数化、事务和运行时设置这三项增强功能,可以将普通的 VuGen 录制变成一个像真实用户一样运行的脚本,并报告您可以真正信任的时间。

  • 🔘 交易方式: 将请求包装在 lr_start_transaction 和 lr_end_transaction 中以计时。
  • ☑️ 状态代码: 使用 LR_AUTO、LR_PASS 或 LR_FAIL 关闭交易。
  • 会合: 将虚拟用户聚集在指定地点,以便他们同时访问服务器。
  • 🧪 参数化: 将硬编码的日期、ID 和登录名替换为每次迭代的值。
  • 🛠️ 运行时设置: 运行逻辑、节奏控制、日志记录、思考时间、带宽、浏览器、代理。
  • 📊 重复性: 设置不一致是导致结果无法重复的常见原因。

LoadRunner VuGen 中的参数化、事务和函数

录制的脚本可以模拟虚拟用户;但是,仅仅录制可能不足以复制真实用户的行为。

录制脚本时,它只涵盖用户在应用程序中的单一、直接的操作流程。而真实用户在退出登录前可能会多次重复操作。点击按钮的延迟(也就是时间)因人而异,而且有些用户通过高速网络连接访问应用程序,而有些用户则不然。因此,为了获得真实的用户体验,我们需要优化脚本,使其行为尽可能接近真实用户。

这是进行“性能测试但虚拟用户脚本远不止于此。在系统负载测试 (SUL) 期间,如何衡量虚拟用户所花费的时间?如何判断虚拟用户在某个特定点是成功还是失败,以及后端进程是否失败或服务器资源是否不足?

我们需要改进脚本,以便更好地回答以上所有问题。

品牌注解: VuGen最初以HP的名义销售,后来又以Micro Focus的名义销售,现在是……的一部分 OpenText 专业性能工程以下功能和设置保持不变。

使用事务

事务衡量服务器对任何操作的响应时间。简单来说,“事务”衡量的是系统处理特定请求所需的时间。它可以小到按钮点击,也可以小到文本框失去焦点时触发的 AJAX 调用。

应用事务非常简单。只需在发出请求前编写一行代码,并在请求结束后关闭事务即可。LoadRunner 只需要一个字符串作为事务名称。

要打开交易,请使用以下代码行:

lr_start_transaction(“Transaction Name”);

要关闭交易,请使用以下代码行:

lr_end_transaction(“Transaction Name”, <status>);

这告诉 LoadRunner 此特定事务是否成功。可能的参数包括:

  • LR_AUTO
  • LR_PASS
  • LR_失败

计费示例:

lr_end_transaction(“My_Login”, LR_AUTO);
lr_end_transaction(“001_Opening_Dashboard Name”, LR_PASS);
lr_end_transaction(“Business_Workflow_Transaction Name”, LR_FAIL);

Code 注意事项: 这些代码片段完全按照原样复制,包括印刷体引号。真正的 VuGen 脚本需要使用纯 ASCII 双引号,因此如果您复制此代码,请重新输入引号。

注意事项:

  • 不要忘记,您正在使用“C”,这是一种区分大小写的语言。
  • 交易名称中不允许使用句点(.)字符,但可以使用空格和下划线。
  • 如果你的代码分支划分得当,并且添加了检查点来验证服务器响应,则可以使用自定义错误处理,例如 LR_PASS 或 LR_FAIL。否则,可以使用 LR_AUTO,LoadRunner 将自动处理服务器错误(HTTP 500、400 等)。
  • 应用交易时,请确保其中没有夹杂思考时间声明,否则您的交易将始终包含该期间。
  • 由于 LoadRunner 要求事务名称必须为固定的字符串,因此应用事务时常见的问题是字符串不匹配。如果在打开和关闭事务时使用不同的名称,则至少会收到两个错误。首先,您打开的事务从未关闭,因此 LoadRunner 会报错;其次,您尝试关闭的事务从未打开,因此会产生第二个错误。
  • 这两个错误都会出现在重放日志中,因此,每当报告其中任何一个错误时,请先检查开账和结账报表上的交易名称。
  • 由于 LoadRunner 会自动处理请求和响应的同步,因此在应用事务时,您不必担心响应。

会合点、注释和脚本函数

三个较小的改进使脚本的行为和可读性更像生产代码:汇合点、注释和 VuGen 内置的函数浏览器。

集合点

汇合点是一个“集合点”。它是一条单独的语句,指示 LoadRunner 引入并发。您可以将汇合点插入虚拟用户脚本中,以模拟服务器上的高用户负载。

汇合点指示虚拟用户在执行过程中等待,直到多个虚拟用户到达特定点,以便它们可以同时执行任务。例如,为了模拟银行服务器的峰值负载,可以插入一个汇合点,指示 100 个虚拟用户同时存入现金。

如果汇合点设置不正确,即使运行同一个脚本,虚拟用户也会访问应用程序的不同部分。这是因为每个虚拟用户的响应时间不同,因此部分用户会出现延迟。

语法:

lr_rendezvous(“Logical Name”);

更正说明: 已发布的页面拼写如下 lr_rendesvous正确的函数名称是 lr_rendezvous拼写错误的版本将无法编译。

最佳实践:

  • 在会合点前面加上“rdv_”以提高代码的可读性;例如“rdv_Login”
  • 删除任何紧邻的思考时间语句
  • 录制完成后,在脚本视图中应用会合点

下面的脚本视图显示了插入到已录制操作中的会合语句:

在脚本视图中,将会合语句插入到已录制的 VuGen 操作中。

备注

添加注释来描述某个操作、一段代码或一行代码。注释有助于让将来查阅代码的人更容易理解。它们提供有关特定操作的信息,并用于分隔不同的代码段。

您可以添加评论

  • 录制时(使用该工具)
  • 录制后(直接写在代码中)

最佳实践:在每个脚本文件的顶部标记所有注释。

通过菜单插入功能

虽然您可以直接编写简单的代码行,但有时您可能需要一些提示才能想起某个函数。您还可以使用“步骤工具箱”(在 12 版本之前称为“插入函数”)来查找任何函数并将其直接插入到脚本中。

您可以在“视图”→“步骤工具箱”下找到“步骤工具箱”,如下图所示。

VuGen 查看菜单中的“步骤工具箱”命令已高亮显示

这将打开一个侧边窗口。请看截图:

步骤工具箱侧面板列出了可供插入的 VuGen 功能

什么是参数化?

VuGen 中的参数是一个容器,用于保存记录的值,该值会根据不同的用户进行替换。

在脚本执行期间(在 VuGen 或 控制器),来自外部源(例如 .txt 文件、XML 或数据库)的值将替换参数的先前值。

参数化对于向服务器发送动态(或唯一)值非常有用。例如,某个业务流程可能需要运行 10 次迭代,每次迭代都选择一个唯一的用户名。

它还有助于模拟真实生活中针对目标系统的行为。请看下面的例子。

问题示例:

  • 业务流程仅对来自服务器的当前日期有效,因此不能将其作为硬编码请求传递。
  • 有时,即使对于单个用户,客户端应用程序也会向服务器传递一个唯一 ID(例如 session_id)以继续进程。在这种情况下,参数化就显得尤为重要。
  • 客户端应用程序通常会缓存与服务器之间收发的数据。因此,服务器无法接收到真实的用户行为(即服务器根据搜索条件运行不同的算法)。VUser 脚本虽然能够成功执行,但获取的性能统计数据却毫无意义。通过参数化使用不同的数据有助于模拟服务器端活动(例如存储过程),从而有效测试系统性能。
  • 在录制过程中硬编码到虚拟用户 (VUser) 中的日期,一旦过了该日期,可能就失效了。将日期参数化,并通过替换硬编码的日期,可以使虚拟用户执行成功。这类字段或请求非常适合参数化。

您可以通过在脚本视图中右键单击已记录的值,然后选择“替换为参数”来创建参数。VuGen 随后会询问值是由哪种类型提供的:

参数类型 它所提供的价值
文件 从 .dat 文件中的某一列读取的值。
同时处理多行多列的数据块。
日期/时间 以选定的格式显示当前日期和时间。
随机数 来自您设定的范围的数字。
唯一编号 每个虚拟用户都有一个不同的编号,该编号由起始值和块大小决定。
迭代次数 当前迭代次数。
虚拟用户 ID 重放时分配的标识符。
分组/加载 Generator 姓名 VUser 组或生成器计算机。
XML XML 数据集片段。
用户自定义函数 由您自己的库函数返回的值。

另外两个选项决定了数据在迭代过程中的消费方式:

附加选项 选择 它控制什么
选择下一行 顺序、随机、唯一 VUser接下来读取哪一行?
更新值 每次迭代,每次发生,一次 当数值刷新时。

以下示例展示了如何对录制的脚本应用参数化:

点击 开始 如果视频无法访问。

运行时设置及其对虚拟用户仿真的影响

运行时设置与 VuGen 脚本同样重要。不同的配置会导致完全不同的测试设计,因此,不一致的运行时设置通常是造成结果无法复现的原因。让我们逐一讨论每个属性。

运行逻辑

运行逻辑定义了除 vuser_init 和 vuser_end 之外的所有操作的执行次数。

这或许能更清楚地解释为什么 LoadRunner 建议保留ping vuser_init 中的所有登录代码和 vuser_end 中的所有注销代码,两者均不包含。

如果您创建了多个操作——例如登录、打开屏幕、计算租金、提交资金、查询余额和注销——那么以下场景将针对每个虚拟用户发生:

所有虚拟用户将登录,执行“打开屏幕”、“计算租金”、“提交资金”和“检查余额”,然后再次执行“打开屏幕”、“计算租金”等操作,如此循环 10 次,然后注销(一次)。

VuGen 运行时设置的“运行逻辑”窗格显示迭代次数

这是一个强大的设置,可以让脚本的行为更像真实用户。请记住,真实用户不会每次都登录和注销;他们通常会重复相同的步骤。

在退出登录之前,你查看电子邮件时会点击“收件箱”多少次?

起搏

这一点很重要。大多数人无法理解步频和思考时间之间的区别。唯一的区别在于,步频指的是迭代之间的延迟,而思考时间指的是任意两个步骤之间的延迟。

推荐设置取决于测试设计。但是,如果您希望施加较大的负载,请考虑选择“上一次迭代结束后立即执行”,如下所示。

运行时设置的“速度”窗格,其中包含迭代延迟选项

历史记录

通常来说,日志记录的是运行 LoadRunner 期间发生的所有事件。您可以启用日志功能,了解应用程序和服务器之间发生的情况。

LoadRunner 提供了一个强大的日志记录机制,该机制本身就具有很强的稳健性和可扩展性。它允许您仅保留“标准日志”,或保留详细且可配置的扩展日志,或者完全禁用日志记录。

标准日志内容翔实,易于理解。它包含了您通常排查虚拟用户脚本故障所需的适量信息。

对于扩展日志,所有标准日志信息都是其子集。此外,您还可以进行参数替换。这会指示 LoadRunner 组件包含所有参数(来自参数化)的完整信息,包括请求和响应数据。

如果包含“服务器返回的数据”,日志文件会变得非常大。它会将所有 HTML 代码、标签、资源和非资源信息都直接包含在日志中。只有在需要进行深入的故障排除时,这个选项才比较合适。通常情况下,这会导致日志文件非常大,难以理解。

正如您现在可能已经猜到的那样,如果您选择“高级” Trac你的日志文件会非常大。你必须尝试一下。你会注意到 VuGen 的运行时间也显著增加,但这不会影响 VuGen 报告的事务响应时间。这是非常高级的信息,只有在你了解目标应用程序、应用程序与硬件之间的客户端到服务器通信以及协议层面的细节时才有用。通常,阅读和排查这些信息需要花费大量精力。

运行时设置的日志窗格,包含标准日志和扩展日志选项

提示:

  • 无论启用日志后 VuGen 需要多少时间,都不会影响事务响应时间——日志开销已从测量时间中排除。
  • 如果不需要,请禁用日志记录。
  • 脚本运行完毕后,请禁用日志记录。启用日志记录的脚本会导致控制器运行速度变慢,并不断弹出烦人的错误消息。
  • 禁用日志将增加您可以使用 LoadRunner 模拟的最大用户数。
  • 考虑使用“仅在发生错误时发送消息”——这样可以屏蔽不必要的信息消息,只报告与错误相关的消息。

思考时刻

思考时间只是两个步骤之间的延迟。

思考时间有助于模拟用户行为,因为真实用户无法像机器一样使用应用程序。VuGen 会自动生成思考时间。您仍然可以完全控制思考时间的长短,例如移除、增加或调整思考时间。

为了更好地理解:用户可能会打开一个屏幕(响应后紧接着一个请求),然后在按下回车键之前输入用户名和密码。应用程序与服务器之间的下一次交互发生在用户点击“登录”按钮时。用户输入用户名和密码所花费的时间就是 LoadRunner 中的思考时间。

运行时设置的“思考时间”窗格,其中包含回放思考时间选项。

如果您希望模拟应用程序上的激进负载,请考虑完全禁用思考时间。

但是,为了模拟现实生活中的行为,您可以选择“使用随机思考时间”,并根据需要设置百分比。

可以考虑使用“限制思考时间”功能,将思考时间限制在一个合理的范围内。通常来说,30 秒就足够了。

速度模拟

速度模拟指的是每台客户端机器的带宽容量。

由于我们通过 LoadRunner 模拟了数千个虚拟用户,LoadRunner 使带宽和网络速度模拟变得如此简单,这令人惊叹。

如果您的客户以超过 128 Kbps 的速度访问您的应用程序,您可以从这里进行控制。您将能够模拟真实场景,这将有助于您获得准确的性能统计数据。

速度模拟面板提供最大带宽或固定连接速度。

最佳建议是设置“使用最大带宽”。这有助于您忽略任何网络相关的性能瓶颈,并首先专注于应用程序本身可能存在的问题。您可以多次运行测试,以查看不同情况下的运行结果。

浏览器模拟

用户体验并不取决于最终用户使用的浏览器,因此这在很大程度上超出了性能指标的范畴。但是,您可以选择要模拟的浏览器,如下方窗格所示。

浏览器模拟窗格,包含用户代理和缓存模拟选项

在这种配置下,选择哪个浏览器究竟何时才真正重要?

如果您的应用是 Web 应用,并且针对不同的浏览器返回不同的响应,则需要使用此配置。例如,您可能会在 Internet Explorer 和 Windows 系统中看到不同的图像和内容。 Firefox.

另一个重要的设置是“模拟浏览器缓存”。如果您想在启用缓存的情况下评估响应时间,请选中此复选框。如果您想要了解最坏情况下的响应时间,显然无需考虑此设置。

下载非 HTML 资源将允许 LoadRunner 下载任何 CSS、JS 和其他富媒体文件。此选项应保持选中状态。但是,如果您希望从性能测试设计中移除此功能,可以取消选中它。

代理

最好完全从你的设备中移除代理。 测试环境 — 路径中存在代理会导致测试结果不可靠。然而,有时这种情况不可避免。在这种情况下,LoadRunner 提供了代理设置。

您将(或应该)使用“无代理”设置。您可以从默认浏览器中获取此设置。但是,请务必检查哪个浏览器被设置为默认浏览器,以及该浏览器的代理配置是什么。

运行时设置的代理面板,其中包含“无代理”和“手动代理”选项。

如果您正在使用代理服务器且需要身份验证(或脚本),则可以单击“身份验证”按钮,这将打开一个新窗口。请参考下面的屏幕截图。

代理身份验证窗口要求输入用户名和密码

使用此屏幕提供用户名和密码,以便在代理服务器上进行身份验证。单击“确定”关闭屏幕。

恭喜!您已完成 VuGen 脚本的配置。请不要忘记为所有虚拟用户脚本进行配置。

接下来来 相关在场景中运行 控制器并且读取结果 LoadRunner 分析。 请参阅 LoadRunner架构负载测试 指南。

常见问题

在脚本视图中选择该值,右键单击并选择“替换为参数”。为其命名,选择类型,VuGen 将替换所有您批准的匹配项。

日期/时间、随机数、唯一编号、迭代次数、虚拟用户 ID、组名称和负载 Generator 名称在回放时生成。只有文件、表和 XML 参数需要您提供数据源。

机器学习可以推荐相关性候选对象,标记应用程序更改后失效的脚本,并生成真实的测试数据。VuGen 最新版本加入了 AI 辅助脚本生成功能,但生成的语句仍需审核。

GitHub 副驾驶 由于 VuGen 脚本是用 C 语言编写的,因此它能很好地处理 C 语言脚手架——循环、字符串处理、事务包装器等等。但它在处理特定协议的 Web 函数方面比较薄弱,所以需要检查每个生成的函数调用是否符合函数引用。

它指示虚拟用户在某个步骤失败后继续执行剩余步骤,而不是结束迭代。这在早期探索性运行中很有用,但如果启用此功能,则会掩盖真正的失败。

在请求之前添加内容检查,以便重放程序在响应中查找预期文本。仅凭 HTTP 状态码通过并不能说明任何问题,因为错误页面也可能返回 200。

不。该产品已从惠普转移到Micro Focus,现在 OpenText 专业性能工程VuGen 保留了其名称、函数库和运行时设置面板。

lr_rendezvous 语句仅标记集合点。需要到达的虚拟用户数量以及运行等待时间是在 Controller 的集合选项中设置的,而不是在 VuGen 中设置的。

总结一下这篇文章: