专栏文章 JMeter - 创建可重用和模块化的测试脚本

老马 · 2018年11月27日 · 最后由 老马 回复于 2020年03月26日 · 4022 次阅读

概述

应用程序有许多业务关键流程,我们可以从中提出不同的业务工作流程。当我试图在 JMeter 中提出性能测试脚本时,我需要找到一些方法来创建可重用/模块化的测试脚本。这样我就可以创建不同的工作流程。

样例

让我们考虑一个具有以下功能的示例应用程序。

  • 登录 Login
  • 登出 Logout
  • 用户注册 User Registration
  • 搜索产品 Search for Product
  • 选择产品 Select Product
  • 使用不同的付款方式订购产品 Order Product with different payment methods
  • 编辑订单 Edit Order
  • 取消订单 Cancel Order
  • 搜索用户个人资料 Search for User Profile

使用上述功能,我可以提出不同的工作流程,如下所示。

用户访问应用程序,搜索产品,选择产品,注册,订购产品
User Registration -> Search for Product -> Select Product -> Order Product -> Logout

现有用户登录,搜索产品,选择产品,注册,订购产品
Login -> Search for Product -> Select Product -> Order Product -> Logout

管理员用户登录,搜索用户并取消订单
Login -> Search for User -> Cancel Order -> Logout

由于我有太多组合,我想找到一种合适的方法来设计我的 JMeter 测试脚本。在本文中,我们将使用下面的 JMeter 元素实现这一点。

备注:参数控制器 需要单独安装插件,插件管理器中的插件名为 Parameterized Controller & Set Variables Action

Test Fragment 测试片段:

Test Fragment 元素是一个特殊的控制器,可以直接在线程组等 JMeter 测试计划下添加。但它除了持有其他元素外什么也没做!只有当其他线程组的 Module / Include 控制器引用它时才会执行它。它就像一个可重用的脚本库。

Module Controller 模块控制器:

JMeter 中的模块控制器可用于引用 JMeter 测试计划中的任何逻辑控制器。

例如,我的测试中有 5 个线程组,如下所示。

  • New User Registration
  • User Login & Order Creation
  • User Login & Product View
  • Existing Order Edit/Cancel
  • User Search

某些功能对于这些线程组可能很常见。例如,用户必须登录,创建订单/查看现有产品。

在上面的示例中,您可以看到,两个线程组都必须具有登录功能。每当登录功能发生变化时,我都需要确保在两个线程组中更新脚本。

因此,而不必在这两个线程组登录重复简单的控制器,我可以添加一个测试片段及移动 “用户登录” 简单的控制器下的测试片段。这样它就可以被模块控制器引用。[它不一定是一个简单的控制器。它可以是任何控制器]。


现在,如果登录脚本发生变化,我只需要更新测试片段下的 “用户登录” 。两个线程组都可以正常工作。

Parameterized Controller 参数化控制器:

在上面的示例中,一个 “用户登录” 正由多个线程组访问。有时,这些线程组可能希望在测试片段下使用这些简单 / 事务控制器,就像一个函数,以便它们可以传递不同的数据,并期望控制器根据传递给它的数据执行操作。

例如,我的需求是在订购新产品时使用 VISA 信用卡,并在编辑/升级现有订单时使用万事达卡。
我可以使用 参数化控制器来实现此目的。

我首先添加参数化控制器。然后我在参数化控制器下添加模块控制器。现在模块控制器调用'Checkout'并传递要在'Checkout'中使用的测试数据。

Checkout 控制器将在执行请求时使用传递给它的测试数据。

Include Controller 包括控制器:

由于模块控制器用于调用测试计划中的逻辑控制器,因此 Include Controller 用于引用现有的.jmx 文件本身。
例如,应用程序非常复杂,2 名工程师参与了脚本创建。
开发人员 A 正在为登录和搜索应用程序的产品功能创建测试脚本。
开发人员 B 正在为 Checkout 创建一个测试脚本。
两位工程师都为应用程序的不同模块提供了不同的.jmx 文件。
现在我们创建最终的 JMeter 测试计划,它将引用这些外部'.jmx'文件,如下所示

我可以为登录,订购产品,产品搜索,用户搜索,查看产品,编辑订单,取消订单提供不同的 jmx 文件
现在,我可以通过引用外部 jmx 文件来创建我想要的任何业务流程。[在最终的 JMeter 测试中添加用户定义的变量,Cookie 管理器等。不在包含的文件中。]

  • Login -> Order Product -> View Product
  • Login -> Order Product -> Edit Order
  • Login -> Product Search -> Order Product
  • Login -> Order Product -> Product Search -> Cancel Order

总结

通过如上所示设计我的 JMeter 测试脚本,我可以为不同的业务工作流创建不同的线程组。每当应用程序发生变化时,我只能在一个地方更新脚本。所有工作流程都将保持不变!

良好的 JMeter 脚本目录组织,对重用和模块化非常重要.也便于协同开发.

使用不同的构建 Report 工具生成的测试报告,就将非常清晰,提升了易读性

实际 JMeter 是十分强大和支持齐全的这么一个好的做 API 接口功能和性能测试开源平台
所以 我有了新的想法:
如果 jmeter 支持 这种玩法 那么最后的 包括控制器 玩好了
就可以 功能模块化 A 开发-login B 开发->search product C->开发 logout
这样 每一个功能都是一个 jmx 形式的 testplan , 分别叫 Login.jmx SearchProduct.jmx 和 Logout.jmx
这样 想运行业务功能场景组合测试的时候 ,是否可以 jmeter GUI 工具里利用 包括控制器组合运行或实现 web 界面化的操作形式来自由组合想要的场景了.
这样就可以放心大胆的让手工业务测试人员,玩转接口功能测试了 (接口的组合 手工业务测试人员有先天情景上下文关联意识).
想运行 login 的接口性能的话 也方便单独拎出 login.jmx 进行简单改造去掉接口功能测试属性,添加性能测试配置 然后就丢到 https://github.com/zyanycall/stressTestPlatform 这个平台去测试性能
这样 接口 也可以做 性能也可以 做了 , 模块化开发,和场景 组合化的问题也就解决了 .

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

写得很好

如果测试片段之间有 参数的依赖呢

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册