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

一个录制的脚本可以模拟一个虚拟用户;然而,仅仅录制可能不足以复制“真实用户行为”。

当脚本被录制时,它涵盖了目标应用的单一且直接的流程。然而,一个真实的用户在退出之前可能会执行某个过程的多次迭代。点击按钮之间的延迟(思考时间)会因人而异。有些真实用户可能通过DSL访问您的应用,而有些则通过拨号上网访问。因此,为了获得真实用户的真实感受,我们需要增强我们的脚本,使其与真实用户行为完全匹配,或者至少非常接近。

上述是进行“性能测试”时最重要的考虑因素,但VU脚本还有更多内容。当SUL进行性能测试时,您将如何衡量VUser所花费的精确时间?您如何知道VUser是否在某个点通过或失败?失败的原因是什么,是某个后端进程失败还是服务器资源受限?

我们需要增强我们的脚本以帮助回答以上所有问题。

使用事务

事务是衡量任何操作服务器响应时间的机制。简单来说,“事务”的使用有助于衡量系统处理特定请求所需的时间。它可以小到一个按钮的点击,也可以是在文本框失去焦点时进行AJAX调用。

应用事务很简单。只需在向服务器发出请求之前写一行代码,并在请求结束时关闭事务。LoadRunner只需要一个字符串作为事务名称。

要开启事务,请使用此行代码

lr_start_transaction(“Transaction Name”);

要关闭事务,请使用此行代码

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

<status> 告诉 LoadRunner 此特定事务是成功还是不成功。可能的参数可以是:

  • LR_AUTO
  • LR_PASS
  • LR_FAIL

示例

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);

注意事项

  • 别忘了,您正在使用“C”语言,它是一种区分大小写的语言。
  • 事务名称中不允许使用句点(.)字符,但可以使用空格和下划线。
  • 如果您已正确分支代码并添加了检查点以验证服务器响应,则可以使用自定义错误处理,例如 LR_PASS 或 LR_FAIL。否则,您可以使用 LR_AUTO,LoadRunner 将自动处理服务器错误(HTTP 500、400 等)。
  • 在应用事务时,请确保没有夹杂**think_time**语句,否则您的事务将始终包含该时间段。
  • 由于 LoadRunner 要求事务名称为常量字符串,因此在应用事务时常见的问题是字符串不匹配。如果在打开和关闭事务时给出不同的名称,您将至少收到 2 个错误。由于您打开的事务从未关闭,LoadRunner 将产生错误。此外,您尝试关闭的事务从未打开,因此也会产生错误。
  • 您能运用您的智慧并回答自己上述哪个错误会首先被报告吗?为了验证您的答案,为什么不自己犯一个错误呢?如果您的回答正确,那么您就走在正确的轨道上。如果您的回答错误,那么您需要集中精力。
  • 由于LoadRunner会自动处理请求和响应的同步,因此在应用事务时您不必担心响应。

理解思考时间、集合点和注释

集合点

集合点(Rendezvous Points)意为“会合点”。它只是一句简单的语句,告诉LoadRunner引入并发。您将集合点插入VUser脚本中,以模拟服务器上的大量用户负载。

集合点指示虚拟用户在测试执行期间等待多个虚拟用户到达某个特定点,以便它们可以并发地执行任务。例如,为了模拟银行服务器上的高峰负载,您可以插入一个集合点,指示100个虚拟用户同时将现金存入他们的账户。这可以使用集合点轻松实现。

如果集合点放置不正确,即使是相同的脚本,VUser也会访问应用程序的不同部分。这是因为每个VUser获得的响应时间不同,因此一些用户会滞后。

语法:lr_rendesvous(“逻辑名称”);

最佳实践

  • 为了提高代码可读性,在集合点前加上“rdv_”;例如“rdv_Login”
  • 移除任何即时思考时间语句
  • 在脚本视图中(录制后)应用集合点

Rendezvous Points

评论

添加注释以描述活动、代码片段或一行代码。注释有助于使代码在将来被引用时易于理解。它们提供有关特定操作的信息,并分隔两个部分以进行区分。

您可以添加评论

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

最佳实践:在每个脚本文件的顶部标记任何注释

通过菜单插入函数

虽然您可以直接编写简单的代码行,但您可能需要一个线索来回忆某个函数。您也可以使用步骤工具箱(在版本12之前称为插入函数)来查找并将任何函数直接插入到您的脚本中。

您可以在“视图”->“步骤工具箱”下找到步骤工具栏。

Inserting Functions through Menu

这将打开一个侧边窗口,请看快照

Inserting Functions through Menu

什么是参数化?

VUGen 中的**参数**是一个容器,它包含一个录制的值,该值可以替换为各种用户。

在脚本执行期间(在 VUGen 或 Controller 中),来自外部源(如 .txt、XML 或数据库)的值会替换参数的先前值。

参数化在向服务器发送动态(或唯一)值时非常有用,例如:业务流程需要运行 10 次迭代,但每次都选取唯一的用户名称。

它还有助于模拟真实的用户行为到目标系统。请看下面的例子

问题示例

业务流程仅适用于从服务器获取的当前日期,因此不能作为硬编码请求传递。

有时,客户端应用程序会向服务器传递一个唯一的ID(例如session_id)以使进程继续(即使对于单个用户)——在这种情况下,参数化会有所帮助。

通常,客户端应用程序会维护发送到和来自服务器的数据缓存。结果,服务器没有接收到真实的用户行为(如果服务器根据搜索条件运行不同的算法)。虽然VUser脚本将成功执行,但得出的性能统计数据将没有意义。通过参数化使用不同的数据有助于模拟服务器端活动(过程等)并锻炼系统。

在录制过程中硬编码在 VUser 中的日期,当该日期过去后可能不再有效。参数化日期允许 VUser 通过替换硬编码日期来成功执行。此类字段或请求是参数化的合适候选对象。

如果视频无法访问,请点击此处

运行时设置及其对VU模拟的影响

运行时设置与您的 VUGen 脚本同等重要。通过不同的配置,您可以获得不同的测试设计。这就是为什么,如果运行时设置不一致,您最终可能会得到不可重复的结果。让我们逐一讨论每个属性。

运行逻辑

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

这可能更清楚地解释了为什么LoadRunner建议将所有登录代码单独放在vuser_init中,将注销部分放在vuser_end中。

如果您创建了多个动作,比如:登录、打开屏幕、计算租金、提交资金、检查余额和退出,那么,每个VUser都会发生以下情况

所有虚拟用户将登录,执行“打开屏幕”、“计算租金”、“提交资金”、“检查余额”——然后——再次“打开屏幕”、“计算租金”……依此类推——迭代10次——然后退出(一次)。

Run Logic

这是一个强大的设置,可以更像真实用户一样行动。请记住,真实用户并不是每次都登录和退出——他通常会重复相同的步骤。

在退出之前,您检查电子邮件时会点击多少次“收件箱”?

步调

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

推荐设置取决于测试设计。但是,如果您希望有更积极的负载,请考虑选择“当前迭代结束后立即开始”。

Pacing

日志

日志(通常理解为)是您运行LoadRunner时所有事件的记录。您可以启用日志以了解您的应用程序和服务器之间发生的情况。

LoadRunner 提供了强大的日志记录机制,该机制本身就健壮且可扩展。它允许您只保留“标准日志”或详细、可配置的扩展日志,或者完全禁用它。

标准日志信息量大且易于理解。它包含的知识量恰到好处,通常是您解决VUser脚本故障所需的。

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

如果您包含“服务器返回的数据”,那么您的日志将非常冗长。这将包括所有HTML、标签、资源、非资源信息,全部包含在日志中。此选项仅在您需要进行严重故障排除时才好用。通常,这会使日志文件非常大,并且不易理解。

正如您现在可能已经猜到的那样,如果您选择“高级跟踪”,您的日志文件将会非常庞大。您一定要尝试一下。您会注意到VUGen花费的时间也显著增加了,尽管这不会对VUGen报告的事务响应时间产生任何影响。然而,这是非常高级的信息,如果您了解目标应用程序、应用程序和硬件之间的客户端到服务器通信以及协议级别详细信息,则可能有用。通常,这些信息本质上是无用的,因为它需要极大的努力才能理解和排除故障。

Log

提示

  • 无论VUGen在启用日志时花费多少时间,它都不会影响事务响应时间。惠普称这种现象为“尖端技术”。
  • 如果不需要日志,请禁用它。
  • 完成脚本后禁用日志。启用日志的脚本会导致控制器运行变慢并报告烦人的消息。
  • 禁用日志将增加LoadRunner可模拟的最大用户容量。
  • 考虑使用“仅在发生错误时发送消息”——这将静默不必要的信息消息,并仅报告与错误相关的消息。

思考时间

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

思考时间有助于复制用户行为,因为没有哪个真实用户能够像机器(VUGen)一样使用任何应用程序。VUGen会自动生成思考时间。您仍然可以完全控制移除、倍增或波动思考时间的持续时间。

为了更好地理解,例如,一个用户可能打开一个屏幕(这是请求后的响应),然后提供用户名和密码,最后点击回车。应用程序与服务器的下一次交互将发生在他点击“登录”时。用户输入用户名和密码所花费的时间在LoadRunner中就是思考时间。

Think Times

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

然而,为了模拟真实的行为,您可以“使用随机思考时间”并根据需要设置百分比。

考虑将思考时间限制在一个合理的时间段内。通常,30秒就足够了。

速度模拟

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

由于我们通过LoadRunner模拟数千个VUser,LoadRunner控制带宽/网络速度模拟的简单程度令人惊叹。

如果您的客户以128 Kbps的速度访问您的应用程序,您可以从这里控制它。您将模拟“真实的用户行为”,这应该有助于获得正确的性能统计数据。

Speed Simulation

最佳建议是设置为使用最大带宽。这将有助于忽略任何与网络相关的性能瓶颈,并首先关注应用程序中潜在的问题。您始终可以多次运行测试,以查看在不同情况下的不同行为。

浏览器仿真

用户体验不取决于最终用户使用的浏览器。显然,这超出了性能衡量的范围。但是,您可以选择要模拟的浏览器。

Browser Emulation

您能回答自己,在这种配置下,何时选择正确的浏览器对您来说才是真正重要的吗?

如果您的目标应用程序是Web应用程序,并且对不同的浏览器返回不同的响应(例如,IE和Firefox等显示不同的图像和内容),您将使用此配置。

另一个重要设置是模拟浏览器缓存。如果您想在启用缓存的情况下衡量响应时间,请勾选此框。如果您正在寻找最坏情况,这显然不是一个考虑因素。

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

代理

最好完全从您的测试环境中删除代理——这会使测试结果不可靠。但是,您可能会遇到不可避免的情况。在这种情况下,LoadRunner确实为您提供了代理设置。

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

Proxy

如果您正在使用代理并且它需要身份验证(或脚本),那么您可以点击“身份验证”按钮,这将导向一个新窗口。请参阅下面的屏幕截图。

Proxy

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

恭喜您。您已完成VUGen脚本的配置。不要忘记为所有VUser脚本配置它。