Jmeter 怎样只用登陆一次(所有线程中使用同一个登陆后的token)

JMeter全局变量设置与应用

参考文档2)jmeter 跨线程组调用变量

一、beanshell自带方法

props.put("变量名","值"); //全局变量赋值

props.get("变量名") ; //获取全局变量

二、jmeter自带函数__setProperty

${__setProperty(变量名,值})};   // 全局变量赋值

${__property(变量名)};   //全局变量提取

${__P(变量名)};    //基本等同于${__property(变量名)}

 

三、调用java方法

JMeterUtils.setProperty("变量名", "值") 全局变量赋值

四、使用jmeter插件

利用两个前置跟后置处理器的插件,可以使上下两个线程组传递某一个变量。

通过后置处理器把对应的一个变量值放到FIFO Queue里,然后下个线程组加上前置处理器,再从Queue里把这个变量值重新再赋值给另外一个变量名。

最后,可以通过在工作台添加Property Display元件来查看是否设置成功了全局变量,也可以直接用debugsampler来看,都是可以的。如下图(但是第四种方法并不设置全局变量,所以是看不到的

仓考文档1)Jmeter 接口获取登录态


Jmeter 接口测试过程中,我们会遇到登录token 的问题。 
如果我们要使用同一个账号登录,然后对其他接口进行并发测试。 
那么这个时候问题来了,我们怎样在所有线程中使用同一个token? 
Jmeter 的仅一次控制器,仅对同一个线程有效,如果有多个线程,那么还是要登录多次,产生不同的token. 
这些token 中只有一个是有效的,那么其他的就肯定失败了。

这里说一下我的解决方案: 
把登录模块放到一个线程里面(这个线程组设置只运行一次),然后获取token, 
把这个token 保存到一个全局变量里面${__setProperty(key,${val},)}, 
其他线程组也可以访问到${__property(key)}。

登录模块里面获取token

添加一个 Bean Shell Sampler, 里面设置全局变量

在另外一个线程组中引用: 
这个时候,无论你有多少个线程,使用的全部都是同一个账号的token了


--------------------- 
作者:assless 
来源:CSDN 
原文:https://blog.csdn.net/jasonliujintao/article/details/74427832 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>首先,用户的问题是:在使用JMeter进行接口测试时,如何在提取到token后为后续每个请求分配不同的token。意思是,用户希望每个后续的请求使用不同的token,而不是同一个token。 回顾系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用,但用户提供的引用是关于JMeter提取token的,并没有直接提到为每个请求分配不同的token。引用[1]讨论了两种方式提取token,但都是关于如何提取和共享token,而不是使用不同的token。引用[2]类似,是关于提取token并设置为全局变量。 用户的问题核心是“为每个后续请求使用不同的token”,这暗示了token需要是动态变化的,或者从多个来源获取。 可能的解决方案: 1. **动态生成token**:如果token是动态生成的,比如每次请求登录接口时生成一个新的token,那么我们需要在JMeter中模拟登录多次,为每个后续请求分配一个独立的token。 2. **从多个响应中提取token**:如果有多个登录响应,每个响应提供一个token,我们需要提取这些token并分配给不同的请求。 3. **使用CSV文件或其他数据源**:如果token是预先生成的,我们可以使用CSV文件存储多个token,并在JMeter中读取这些token分配给不同的请求。 在JMeter中实现: - **使用CSV Data Set Config**:读取一个CSV文件,其中包含多个token。然后,在后续请求中使用这些token。 - **多个登录请求**:在测试计划中,有多个线程或循环,每个线程执行登录一次,提取token,然后用于该线程的后续请求。 - **使用变量和计数器**:结合计数器来索引不同的token。 用户提到的引用中: - 引用[1]讨论了如何提取token并设置为全局变量或线程变量,但全局变量是共享的,所有请求使用同一个token。用户想要不同的token。 - 引用[2]提到使用正则表达式提取器提取token,并设置为全局变量,但同样,全局变量是共享的。 所以,我需要提供一个方法,使每个请求(或每组请求)使用不同的token。 步骤: 1. **准备多个token的来源**: - 如果token是动态的,通过执行登录请求多次。 - 使用CSV文件存储多个token。 2. **在JMeter中配置**: - 使用CSV Data Set Config来读取token文件。 - 或者,在登录请求后提取token,并存储在一个变量中,然后用于后续请求。 3. **确保每个请求使用不同的token**: - 在HTTP请求中,引用变量如${token}。 - 对于多个线程,每个线程有自己的token变量。 具体方法: - **方法1:使用CSV Data Set Config** - 创建一个CSV文件,每行一个token。 - 在JMeter中添加CSV Data Set Config,指定文件路径和变量名,如token。 - 在后续请求中,使用${token}引用,JMeter会自动为每个线程或迭代使用不同的行。 - **方法2:通过循环执行登录** - 添加一个线程组,设置多个线程(用户数)。 - 每个线程执行一个登录请求,提取token线程局部变量。 - 然后执行后续请求,使用该变量。 - 这确保每个用户(线程)有自己的token。 - **方法3:使用计数器** - 如果有固定数量的token,可以添加一个计数器,然后使用索引访问数组或列表,但JMeter变量是线程局部的,所以最好结合CSV或循环。 在用户的问题中,提到“为每个后续请求使用不同的token”,可能意味着在同一个线程中,每个请求使用不同的token。但通常,在接口测试中,token是用于身份验证的,每个用户(线程)有自己的token,而不是每个请求都不同。除非是特殊情况,如每个请求都需要新token。 但用户说“后续每个请求”,所以可能是在一个线程中,多个请求使用不同的token。 在JMeter中,一个线程代表一个虚拟用户。每个线程有自己的变量空间。所以,如果每个线程有自己的token,那么在该线程内的所有请求使用同一个token。但用户想要每个请求不同。 所以,我需要澄清: - 如果用户意思是每个请求使用不同的token,那么我们需要在每次请求前获取新token,或者从池中获取。 - 但token通常用于会话,一个会话使用一个token。 或许用户误解了。token是用于认证的,通常一个用户会话使用一个token。但用户说“为每个后续请求分配不同的token”,这很奇怪。 看用户问题:"如何在提取到token后为后续每个请求分配不同的token" – 可能是个错误,或者是特定场景。 在引用中,没有提到不同token。所以,我应该基于标准实践回答。 可能的解释: - 用户可能有一个测试场景,其中每个请求需要独立的认证token。 - 或者,用户想模拟多个用户,每个用户有自己的token。 我认为后者更合理:为每个虚拟用户分配不同的token。 在回答中,我应该: 1. 确认需求。 2. 提供解决方案。 3. 生成相关问题。 结构回答: - 介绍:解释问题。 - 步骤:如何实现。 - 代码示例:JMeter配置。 - 相关问题。 使用中文。 引用站内内容:用户提供了引用[1]和[2],但它们不直接相关,所以我可以在回答中提及,但不要强制引用。 系统指令说:“回答中引用的段落末尾自然地添加引用标识”,所以我如果在回答中引用用户提供的文本,就添加[^1]或[^2]。 但在这种情况下,用户引用不直接相关,所以我可能不需要引用。 生成相关问题。 最终回答结构: 1. 理解需求。 2. 解决方案。 3. 实现步骤。 4. 示例。 5. 相关问题。</think>### JMeter 中为每个后续请求分配不同 Token 的解决方案 在使用 JMeter 进行接口测试时,token 通常用于身份验证(如 API 令牌)。如果您的需求是**为每个后续请求分配不同的 token**(而不是共享同一个 token),这意味着您可能需要在测试中模拟多个独立用户或动态获取新 token。例如: - 每个虚拟用户(线程使用唯一的 token。 - 或每个请求(在同一个线程内)使用token(这较少见,因为 token 通常用于会话级别)。 在 JMeter 中,token 是变量,您可以通过以下方法实现“每个请求使用不同 token”: - **数据驱动方法**:使用 CSV 文件存储多个 tokenJMeter 读取并分配给不同请求。 - **动态生成方法**:通过循环或线程执行登录请求,每次提取新 token。 - **关键点**:确保 token 变量是线程局部的(thread-local),避免全局共享导致所有请求使用相同 token。 下面我将逐步解释实现步骤,并提供示例。参考您提供的引用[^1][^2],JMeter 支持通过正则表达式提取器或 JSON 提取器获取 token,但需注意: - 引用[1] 提到,token 提取通常局限于线程组内,或通过 Beanshell 设置为全局变量,但全局变量会导致所有请求共享同一个 token[^1]。 - 引用[2] 建议使用正则表达式提取器提取 token,并通过 Beanshell 后置处理器设置为全局变量,但这同样不适合“不同 token”需求[^2]。 因此,我们需要避免全局变量,改用线程局部变量或外部数据源。 --- ### 步骤 1: 准备多个 Token 的来源 要为每个请求分配不同的 token,首先需要多个 token 的输入源: - **从动态登录响应中提取**:如果 token登录接口生成,则通过 JMeter 多次执行登录请求,每次提取一个token。 - **从外部文件读取**:如果 token 是预先生成的(如从数据库导出),创建一个 CSV 文件(例如 `tokens.csv`),每行一个 token: ``` token1 token2 token3 ... ``` - **推荐方法**:使用 CSV 文件更灵活,适合大规模测试。 --- ### 步骤 2: 在 JMeter 中配置数据驱动测试 以下是两种常见方法,确保**每个后续请求使用不同的 token**。假设您的测试计划结构为: - 一个线程组(Thread Group)。 - 后续请求(如 HTTP 请求)。 #### 方法 1: 使用 CSV Data Set Config(推荐,简单高效) 此方法从 CSV 文件读取 tokenJMeter 自动为每个线程或迭代分配不同 token。 1. **添加 CSV Data Set Config**: - 右键点击线程组 → 添加 → 配置元件 → CSV Data Set Config。 - 配置参数: - Filename: 指定 CSV 文件路径(如 `C:/tokens.csv`)。 - Variable Names: 输入变量名,如 `token`(JMeter 将读取每行值赋给此变量)。 - 其他设置:保持默认(如 Delimiter 为逗号,Recycle on EOF? 选择 False 以用尽后停止)。 - 这样,每个线程(或迭代)会读取 CSV 中的一行 token。 2. **在后续请求中使用 token**: - 在 HTTP 请求中,添加 HTTP 头管理器(Header Manager)。 - 设置 Authorization 头,例如:`Authorization: Bearer ${token}`。 - JMeter 会自动为每个请求分配 CSV 中的不同 token。 3. **优点**:简单,支持高并发;每个线程使用独立 token,适合模拟多个用户。 #### 方法 2: 通过循环登录动态提取 token 如果 token 需动态生成(如每次请求前调用登录接口),使用循环控制器多次执行登录。 1. **设置线程组**: - 线程数(Number of Threads):设置为需要的用户数(例如 10)。 - 循环次数(Loop Count):设置为 1(每个线程执行一次登录)。 2. **添加登录请求和 token 提取**: - 添加 HTTP 请求 → 登录接口。 - 添加后置处理器(如 JSON 提取器或正则表达式提取器)提取 token 到变量(如 `local_token`)。 - 例如,使用 JSON 提取器:变量名设为 `local_token`,JSON Path 设为 `$.access_token`。 3. **在后续请求中使用变量**: - 添加后续 HTTP 请求。 - 在 HTTP 头管理器中,设置 `Authorization: Bearer ${local_token}`。 - 由于 `local_token` 是线程局部变量,每个线程的请求使用自己的 token。 4. **如果需要在同一个线程内每个请求使用token**: - 添加循环控制器(Loop Controller)到线程组。 - 在循环控制器内: - 先添加登录请求提取 token。 - 然后添加后续请求使用 `${local_token}`。 - 设置循环次数(如 5),这样每个迭代(请求)会重新登录获取新 token。 - 优点:灵活,适合 token 短期有效场景;缺点:性能开销大,因为每次请求都需登录。 --- ### 示例:使用 CSV Data Set Config 的 JMeter 测试计划 以下是一个简单的 JMeter 测试计划配置示例。假设您有 `tokens.csv` 文件包含多个 token。 ```plaintext 线程组(Thread Group) ├─ CSV Data Set Config │ - Filename: tokens.csv │ - Variable Names: token ├─ HTTP 请求 (登录接口,可选,如果 token 从文件读取则不需要) ├─ HTTP 请求 (后续请求 1) │ └─ HTTP 头管理器 │ - Authorization: Bearer ${token} ├─ HTTP 请求 (后续请求 2) │ └─ HTTP 头管理器 │ - Authorization: Bearer ${token} ... ``` - **工作原理**:JMeter 为每个线程(用户)分配 CSV 中的一行 token。例如: - 线程 1 使用 token1。 - 线程 2 使用 token2。 - 以此类推,每个后续请求自动使用对应 token。 --- ### 注意事项 - **避免全局变量**:如引用[1][^1]和[2][^2]所述,全局变量(通过 Beanshell 设置)会使所有请求共享 token,不符合“不同 token”需求。始终使用线程局部变量(如 CSV 或局部提取器)。 - **性能优化**:如果测试规模大,优先使用 CSV 方法,减少登录调用开销。 - **错误处理**:添加断言(Assertion)检查 token 是否有效,避免因无效 token 导致请求失败。 - **数据独立性**:确保每个 token 对应独立的用户会话,避免测试数据污染。 如果您有更多细节(如 token 来源或测试场景),我可以进一步优化方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值