Jmeter其二

组件

线程组:

线程组元素是任何测试计划的起始点。所有控制器和采样器都必须置于线程组之下。其他元素(如监听器)可直接置于测试计划下,在这种情况下,它们将适用于所有线程组。顾名思义,线程组元素控制着 JMeter 用来执行测试的线程数。通过线程组的控制,您可以

设置线程数
设置爬升周期(ramp-up period)
设置执行测试的次数
每个线程将完整执行测试计划,完全独立于其他测试线程。多个线程用于模拟服务器应用程序的并发连接。

爬升周期告诉 JMeter 需要多长时间才能 “爬升 ”到所选的全部线程数。如果使用 10 个线程,上升期为 100 秒,那么 JMeter 将花费 100 秒来启动所有 10 个线程。每个线程将在前一个线程启动 10 (100/10) 秒后启动。如果有 30 个线程,上升期为 120 秒,那么每个连续线程将延迟 4 秒。

斜坡上升期需要足够长,以避免测试开始时工作量过大,同时也要足够短,以免最后一个线程在第一个线程结束前开始运行(除非希望发生这种情况)相当于没压到。

开始时使用 Ramp-up = 线程数,然后根据需要向上或向下调整。

默认情况下,线程组的配置是在其元素中循环一次。

线程组还允许指定线程寿命。您可以配置持续时间(秒)和启动延迟(秒),以控制每个线程组的持续时间和启动延迟。启动测试时,JMeter 会等待启动延迟(秒),然后再启动线程组的线程,并在配置的持续时间(秒)内运行。

10个线程,ramp-up时间为20s ,持续时间为60s,他会每2s启动一个线程。也就是说A线程启动后立即执行接口,在60s内持续执行该接口,达到60s后,停止线程。B线程会在A线程启动后2s启动,再执行接口,持续60s。那这么算B线程会比A线程晚结束2s

setUp 线程组

  • 用途:用于执行测试前的准备工作,如初始化数据、登录、配置环境等。
  • 特点
    • 在普通线程组之前执行。
    • 通常只运行一次或少量迭代。
    • 如果其中某个请求失败,测试可能会终止(取决于配置)。

tearDown 线程组

  • 用途:用于执行测试后的清理工作,如删除测试数据、登出、释放资源等。
  • 特点
    • 在普通线程组之后执行。
    • 无论普通线程组是否失败,都会运行(除非手动停止测试)。

开放模型线程组

  • 用途:一种动态调整负载的线程组,模拟真实用户行为(如按需增减并发用户数)。
  • 特点
    • 基于“开放系统模型”(用户行为独立,不受系统响应时间影响)。
    • 适用于模拟突发流量或渐进式负载变化。
    • 需配合吞吐量定时器(Throughput Shaping Timer)等使用。

线程组(普通线程组)

  • 用途:定义主要的测试逻辑,模拟用户的实际操作(如API调用、页面浏览等)。
  • 特点
    • 可配置并发用户数、循环次数、启动延迟等。
    • 支持多种调度策略(如固定时长、循环次数)。

总结

  • setUptearDown 是测试的生命周期钩子,分别处理初始化和清理。
  • 开放模型线程组 提供更灵活的负载模拟,适合复杂场景。
  • 普通线程组 是默认的测试主体,负责核心业务逻辑的压测。

作用

  • 当勾选 “Same user on each iteration” 时,JMeter会在同一个线程(虚拟用户)的每次循环迭代中,保持相同的用户会话(如Cookie、Session等)。
  • 如果取消勾选,则每次迭代可能会被视为一个新用户(会话不保留)。

在JMeter中,“在取样器错误后要执行的动作”(Action to be taken after a Sampler error)是一个重要的配置选项,用于控制当某个请求(Sampler)失败时,测试脚本的后续行为。以下是每个选项的详细解释:

1. 继续(Continue)

  • 含义:即使当前请求失败,测试脚本也会继续执行下一个请求或迭代。
  • 适用场景
    • 测试中允许部分请求失败(如监控系统稳定性)。
    • 需要统计错误率,但不希望因个别失败中断整体测试。

2. 启动下一进程循环(Start Next Loop)

  • 含义:当前请求失败后,跳过当前迭代的剩余请求,直接开始下一次循环(Iteration)。
  • 适用场景
    • 当某个请求失败时,当前迭代已无意义(如登录失败后无需执行后续操作)。
    • 希望快速进入下一轮测试,节省时间。

3. 停止线程(Stop Thread)

  • 含义:当前请求失败后,停止当前线程(虚拟用户),但其他线程(用户)继续运行。
  • 适用场景
    • 模拟用户因错误退出系统(如支付失败后用户离开)。
      ️- 需要保留其他线程的并发压力测试。

4. 停止测试(Stop Test)

  • 含义:当前请求失败后,优雅地停止整个测试计划(等待所有线程当前迭代完成后停止)。
  • 适用场景
    • 关键请求失败时(如认证接口不可用),后续测试无意义。
    • 避免因持续错误产生无效数据(如垃圾测试记录)。

5. 立即停止测试(Stop Test Now)

  • 含义:当前请求失败后,强制立即终止整个测试(所有线程立刻停止,不等待完成当前迭代)。
  • 适用场景
    • 紧急情况(如服务器崩溃、数据库连接耗尽)。
    • 需要快速止损,避免进一步资源浪费。

控制器:

JMeter 有两种控制器: 采样器和逻辑控制器。它们驱动测试的处理过程。

采样器:

采样器告诉 JMeter 向服务器发送请求。例如,如果希望 JMeter 发送 HTTP 请求,可添加 HTTP 请求采样器。您还可以通过向采样器添加一个或多个配置元素来定制请求。

逻辑控制器可让您自定义 JMeter 用来决定何时发送请求的逻辑。例如,您可以添加一个交错逻辑控制器,在两个 HTTP 请求采样器之间交替使用。

如果要向同一服务器发送多个相同类型的请求(如 HTTP 请求),请考虑使用 Defaults 配置元素。每个控制器都有一个或多个 Defaults 元素(见下文)。

记得在测试计划中添加监听器,以查看和/或将请求结果存储到磁盘中。

逻辑控制器

关于这个测试的第一点是,登录请求只会在第一次执行。随后的迭代将跳过它。这是由于只执行一次控制器的作用。

登录后,下一个采样器将加载搜索页面(想象一个网络应用程序,用户登录后进入搜索页面进行搜索)。这只是一个简单的请求,没有经过任何逻辑控制器的过滤。

加载搜索页面后,我们要进行搜索。实际上,我们要进行两次不同的搜索。但是,我们希望在每次搜索之间重新加载搜索页面本身。我们可以通过 4 个简单的 HTTP 请求元素(加载搜索、搜索 “A”、加载搜索、搜索 “B”)来实现这一目的。相反,我们使用 Interleave Controller(交错控制器),它每次通过测试时都会传递一个子请求。它会保持子元素的顺序(即不会随意传递,而是 “记住 ”其位置)。交错处理 2 个子请求可能有些矫枉过正,但很可能会有 8 个或 20 个子请求。

线程组有一个内置的逻辑控制器,它可以填补通过的任何请求的空白。在网络测试中,将所有 HTTP 采样器元素中的 DOMAIN 字段留空,并将该信息放入添加到线程组的 HTTP 默认请求元素中,是非常有用的。这样,只需更改测试计划中的一个字段,就能在不同的服务器上测试应用程序。否则,您就必须编辑每一个采样器。

最后一个元素是 HTTP Cookie 管理器。所有网络测试都应添加 Cookie 管理器,否则 JMeter 将忽略 Cookie。通过在线程组级别添加 Cookie 管理器,我们可以确保所有 HTTP 请求共享相同的 Cookie。

吞吐量控制器

JMeter 提供两种主要的吞吐量控制器:

2.1 基于百分比的控制器

  • Target throughput (in samples per minute)

    :直接设置每分钟执行的请求数(采样数)。

    • 例如:设置为 60,表示每分钟执行 60 次请求,即每秒 1 次。
  • Percent Executions

    :设置当前控制器下的采样器占总请求的百分比。

    • 例如:设置为 50%,表示该控制器下的请求将占所有请求的一半。

2.2 基于执行次数的控制器

  • Total executions

    :指定控制器下的采样器总共执行的次数。

    • 例如:设置为 10,表示该控制器下的所有请求只会执行 10 次,无论线程数多少。

3. 核心配置项

配置项 描述
Calculate Throughput Based On - All active threads:基于所有活跃线程计算吞吐量。 - This thread only:仅基于当前线程计算。
Percent Executions 指定控制器下的请求占总请求的百分比(0-100)。
Target throughput 直接设置每分钟的请求数(采样数)。
Total executions 设置控制器下的请求总共执行的次数。

4. 使用场景

4.1 按比例分配请求

假设你需要模拟以下用户行为:

  • 80% 的用户访问首页。
  • 20% 的用户访问登录页。

配置方法:

- 线程组 (100线程)
  ├─ 吞吐量控制器1 (Percent Executions = 80%)
  │   └─ HTTP请求 (首页)
  └─ 吞吐量控制器2 (Percent Executions = 20%)
      └─ HTTP请求 (登录页)

4.2 限制请求总数

如果你只想测试某个接口执行 100 次:

- 线程组 (50线程)
  └─ 吞吐量控制器 (Total executions = 100)
      └─ HTTP请求 (目标接口)

4.3 精确控制吞吐量

若需要模拟每秒 100 次请求:

- 线程组 (足够多的线程)
  └─ 吞吐量控制器 (Target throughput = 6000)  # 6000次/分钟 = 100次/秒
      └─ HTTP请求 (目标接口)

测试片段:

测试片段元素是一种特殊类型的控制器,与线程组元素存在于测试计划树的同一层次。它与线程组的区别在于,除非被模块控制器(Module Controller)或包含控制器(Include_Controller)引用,否则不会被执行。

该元素纯粹用于测试计划中的代码重用。

监听器:

监听器可在 JMeter 运行时访问 JMeter 收集的测试用例信息。图形结果 "监听器在图形上绘制响应时间。查看结果树 "监听器显示采样器请求和响应的详细信息,并可显示响应的基本 HTML 和 XML 表示形式。其他监听器可提供摘要或汇总信息。

此外,监听器还能将数据导入文件,以供日后使用。JMeter 中的每个监听器都提供了一个字段,用于指示将数据存储到哪个文件。还有一个配置按钮,可用于选择保存哪些字段,以及使用 CSV 还是 XML 格式。

请注意,所有监听器保存的数据都是一样的;唯一的区别在于数据在屏幕上的显示方式。
监听器可添加到测试的任何位置,包括直接添加到测试计划下。它们只能从其级别或低于其级别的元素中收集数据。

JMeter 自带了几种监听器。

定时器

默认情况下,JMeter 线程会依次执行采样器,不会暂停。我们建议您在线程组中添加一个可用的定时器来指定延迟。如果不添加延迟,JMeter 可能会在很短的时间内发出过多请求,使服务器不堪重负。

定时器会使 JMeter 在其范围内的每个采样器之前延迟一定时间。

如果您选择在线程组中添加多个计时器,JMeter 会获取计时器的总和,并在执行计时器适用的采样器之前暂停一段时间。定时器可作为采样器或控制器的子节点添加,以限制应用定时器的采样器。

要在测试计划中的某个位置提供暂停,可以使用流量控制动作采样器。

断言:

断言允许您断言从被测服务器收到的响应的事实。使用断言,您基本上可以 “测试 ”您的应用程序是否会返回您所期望的结果。

例如,您可以断言对查询的响应将包含某些特定文本。您指定的文本可以是 Perl 风格的正则表达式,您可以指出响应将包含该文本,也可以指出该文本应与整个响应相匹配。

您可以向任何采样器添加断言。例如,您可以在 HTTP 请求中添加断言,检查文本“”。然后,JMeter 将检查 HTTP 响应中是否存在该文本。如果 JMeter 无法找到该文本,则会将其标记为请求失败。

请注意,断言适用于其作用域内的所有采样器。要将断言限制在单个采样器中,可将断言添加为采样器的子节点。
要查看断言结果,请在线程组中添加断言监听器。失败的断言也会显示在树形视图和表监听器中,并计入错误百分比,例如在汇总和摘要报告中。

配置元素

配置元素与采样器密切配合。虽然它不发送请求(HTTP(S) 测试脚本记录器除外),但可以添加或修改请求。

配置元素只能从放置该元素的树分支内部访问。例如,如果把 HTTP Cookie 管理器放在简单逻辑控制器内,那么只有放在简单逻辑控制器内的 HTTP 请求控制器才能访问 Cookie 管理器(见图 1)。HTTP 请求 “网页 1 ”和 “网页 2 ”可以访问 Cookie 管理器,但 “网页 3 ”则无法访问。

此外,树状分支中的配置元素比 “父 ”分支中的相同元素具有更高的优先级。例如,我们定义了两个 HTTP Request Defaults 元素,即 “Web Defaults 1 ”和 “Web Defaults 2”。由于我们把 “Web Defaults 1 ”放在了循环控制器中,因此只有 “网页 2 ”可以访问它。其他 HTTP 请求将使用 “Web Defaults 2”,因为我们把它放在了线程组(所有其他分支的 “父分支”)中。

Figure 1 -     Test Plan Showing Accessibility of Configuration Elements
显示配置元素可访问性的测试计划
图 1 - 显示配置元素可访问性的测试计划
用户自定义变量配置元素则不同。无论它放在哪里,都要在测试开始时进行处理。为简单起见,建议只将该元素放在线程组的起始位置。

新建测试计划

web测试计划

阶梯式加压

Stepping Thread Group 比较老,不推荐

This group will start N threads:设置线程组启动的线程总数为N个;
First,wait for N seconds:启动第一个线程之前,需要等待N秒;
Then start N threads:设置最开始时启动N个线程;Z
Next,add X threads every Y seconds,using ramXp-up Z seconds:每隔Y秒,启动X个线程,在Z秒内启动X个线程;
Then hold load for N seconds:启动的线程总数达到最大值之后,再持续运行N秒;
Finally,stop X threads every Y seconds:每Y秒停止X个线程;

Ultimate Thread Group 官方推荐

Start Threads Count:当前行启动的线程总数
Initial Delay/sec:延时启动当前行的线程,单位:秒
Startup Time/sec:启动当前行所有线程达峰值所需时间,单位:秒
Hold Load For/sec:当前行线程达到峰值后的稳定加载时间,单位:秒
Shutdown Time:停止当前行所有线程所需时间,单位:秒

生成仪表板报告

仪表盘生成器是 JMeter 的模块化扩展。其默认行为是从 CSV 文件中读取并处理样本,生成包含图表视图的 HTML 文件。它可以在负载测试结束时或按需生成报告。

该报告提供以下指标:

  • 各事务随时间变化的响应时间

    img

  • 错误率 响应时间 网络

    img

  • 错误详情

    img

  • 传输字符数

    img

  • 随时间变化的延迟(延迟(Latency)是指从发送请求到收到响应之间的时间间隔),响应时间是指从发送请求到收到完整响应的整个过程所花费的时间,包括了延迟以及响应数据传输回客户端的时间。

    img

  • 响应时间数量

    img

  • 响应时间vs进程数

    img

  • 响应时间分布

    img

所有报告生成器属性均可在 reportgenerator.properties 文件中找到。 要自定义这些属性,应将它们复制到 user.properties 文件中并进行修改。

其他

通过url重写保存会话信息

URL 重写是一种在 Web 应用中保存会话信息的方法,当客户端浏览器不支持或禁用了 Cookie 时,就可以采用这种方式。它的核心原理是把会话 ID 附加到 URL 后面,这样服务器在接收到请求时就能识别出是哪个会话。

命令行启动脚本

jmeter -n -t test.jmx
//输出报告
jmeter -n -t test.jmx -l result.jtl -e -o report
posted @ 2025-05-29 09:09  疯啦吧你  阅读(105)  评论(0)    收藏  举报