JMeter传递token学习简易教程
2024/12/28 3:03:17
本文主要是介绍JMeter传递token学习简易教程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文详细介绍了如何在JMeter中进行Token传递的配置和使用,包括获取Token、保存Token为变量以及在接口请求中使用Token的过程。通过示例和配置步骤,帮助读者更好地理解和实现JMeter传递Token的学习。JMeter传递token学习涵盖了从获取Token到验证Token传递正确性的全过程。
Apache JMeter 是一个开源的、可跨平台的性能测试工具,主要用于对网站应用进行压力测试、性能测试和负载测试。它支持多种协议,例如HTTP、HTTPS、FTP、Web Services等。JMeter广泛用于测试Web应用,能够模拟多个用户的并发请求,以评估和测试系统的性能。
JMeter的安装过程相对简单,首先需要从Apache JMeter的官方网站下载最新版本的压缩包。以下是具体步骤:
- 下载JMeter:访问 Apache JMeter下载页面,下载最新版本的JMeter压缩包(例如
apache-jmeter-5.4.1.zip
)。 - 解压文件:将下载的压缩包解压到你的硬盘上。例如,可以将文件解压到
C:\JMeter
目录。 - 运行JMeter:双击
bin
目录中的jmeter.bat
(Windows)或jmeter.sh
(Linux和Mac)文件,启动JMeter。
JMeter的界面分为几个主要部分:
- 测试计划:位于左侧树形结构的顶部,是整个测试的容器。通常包括线程组和采样器。
- 线程组:用于模拟多个用户并发访问。线程组中可以设置线程数、循环次数等。
- 采样器:用于定义具体的测试请求,例如HTTP请求、JDBC请求等。
- 监听器:用于查看和分析测试结果。常见的监听器包括查看结果树(View Results Tree)、聚合报告(Aggregate Report)等。
- 断言:用于验证响应是否符合预期。常用的断言包括简单断言(Simple Data Writer)、响应断言(Response Assertion)等。
- 配置元素:用于定义一些全局的配置,如HTTP请求默认值(HTTP Request Defaults)、用户定义的变量(User Defined Variables)等。
- 后置处理器:用于在采样器执行之后进行额外的数据处理,如正则表达式提取器(Regular Expression Extractor)、BeanShell后置处理器(BeanShell PostProcessor)等。
- 打开JMeter,选择菜单栏中的
File
->New Test Plan
,创建一个新的测试计划。 - 在左侧的树形结构中,右键点击
Test Plan
,选择Add
->Threads (Users)
->Thread Group
,添加一个线程组。 - 在线程组中,可以设置线程数、循环次数等参数,例如设置线程数为5,循环次数为10。
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="User Thread Group" enabled="true"> <elementProp guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> </collectionProp> </elementProp> <stringProp name="ThreadGroup.num_threads">5</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> <intProp name="ThreadGroup.num_threads">10</intProp> <intProp name="ThreadGroup.ramp_time">1</intProp> <booleanProp name="ThreadGroup.scheduler">false</booleanProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> <intProp name="ThreadGroup.loops">1</intProp> <elementProp name="ThreadGroup.mainController" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <intProp name="LoopController.loops">1</intProp> </elementProp> </ThreadGroup>
- 在线程组中,右键点击
Thread Group
,选择Add
->Sampler
->HTTP Request
,添加一个HTTP请求。 - 在HTTP请求中,配置请求的URL、方法、参数等信息。例如,请求URL为
http://example.com/api/login
,方法为POST
。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login Request" enabled="true"> <elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="username" elementType="Argument"> <stringProp name="Argument.name">username</stringProp> <stringProp name="Argument.value">admin</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="password" elementType="Argument"> <stringProp name="Argument.name">password</stringProp> <stringProp name="Argument.value">password123</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.path">/api/login</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.useChunking">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy>
在线程组中,可以设置线程数(Thread Count)和循环次数(Loop Count)。
- 线程数:代表模拟多少个用户并发访问。
- 循环次数:代表每个线程重复执行测试的次数。
<intProp name="ThreadGroup.num_threads">5</intProp> <intProp name="ThreadGroup.ramp_time">1</intProp> <intProp name="ThreadGroup.loops">1</intProp>
- 配置好测试计划后,点击工具栏上的绿色播放按钮(
Run
),执行测试计划。 - 在右侧面板中选择监听器,查看执行结果。例如,选择
View Results Tree
,可以查看详细的响应数据。
<HTTPSampleGui> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.protocol"></stringProp> <stringProp name="HTTPSampler.path">/api/login</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="username" elementType="Argument"> <stringProp name="Argument.name">username</stringProp> <stringProp name="Argument.value">admin</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="password" elementType="Argument"> <stringProp name="Argument.name">password</stringProp> <stringProp name="Argument.value">password123</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.useChunking">false</boolProp> <stringProp name="HTTPSampler.bytesThrough"></stringProp> <stringProp name="HTTPSampler.codec"></stringProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> <stringProp name="HTTPSampler.request_timeout"></stringProp> </HTTPSampleGui>
Token(令牌)是一种用于身份验证和授权的机制,通常是一串字符串,代表一个用户会话或状态。在Web应用中,Token通常用于替代传统的Cookie-based登录,具有更好的安全性、可移植性和灵活性。
Token在API测试中扮演重要角色,主要用于测试用户的认证和授权流程。通过模拟用户登录,获取Token并传递到其他接口,可以更真实地模拟用户的操作流程,验证API的安全性和功能性。
使用JMeter传递Token可以更好地模拟实际的用户交互场景。在进行性能测试时,传递Token可以确保测试的真实性和准确性,避免因身份验证问题导致的测试结果偏差。
- 在测试计划中,右键点击
Test Plan
,选择Add
->Config Element
->HTTP Request Defaults
,添加一个HTTP请求默认管理器。 - 在HTTP请求默认管理器中,配置请求的基础信息,例如服务器地址、端口等。
- 在线程组中,添加一个HTTP请求,用来模拟登录请求并获取Token。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login Request" enabled="true"> <elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="username" elementType="Argument"> <stringProp name="Argument.name">username</stringProp> <stringProp name="Argument.value">admin</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="password" elementType="Argument"> <stringProp name="Argument.name">password</stringProp> <stringProp name="Argument.value">password123</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.path">/api/login</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.useChunking">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <!-- HTTP Request Defaults配置代码示例 --> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request Defaults" enabled="true"> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.path"></stringProp> <stringProp name="HTTPSampler.method"></stringProp> </HTTPSamplerProxy>
- 在获取Token的HTTP请求后面,添加一个BeanShell后置处理器。
- 在BeanShell后置处理器中,通过解析响应数据来提取Token,并将其保存为JMeter变量。
- 在其他需要使用Token的接口请求中,通过引用变量名来传递Token。
<BeanShellPostProcessor guiclass="BeanShellTestElementGui" testclass="BeanShellPostProcessor" testname="BeanShell PostProcessor" enabled="true"> <stringProp name="beanshell.postprocessor.filename"></stringProp> <stringProp name="beanshell.postprocessor.parameters"></stringProp> <stringProp name="beanshell.postprocessor.script"> <![CDATA[ import java.util.regex.Matcher; import java.util.regex.Pattern; // 获取响应数据 String response = prev.getResponseDataAsString(); // 正则表达式匹配Token Pattern p = Pattern.compile("token\":\"(.*?)\""); Matcher m = p.matcher(response); if (m.find()) { // 提取Token并保存为变量 vars.put("token", m.group(1)); } else { System.out.println("Token not found"); } ]]> </stringProp> </BeanShellPostProcessor>
- 在测试计划中,添加用户定义的变量(User Defined Variables)。
- 设置变量名为
token
,初始值为空。 - 在BeanShell后置处理器中,将提取到的Token赋值给该变量。
- 在其他接口请求中,通过引用
token
变量来传递Token。
<elementProp name="User Defined Variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="token" elementType="Argument"> <stringProp name="Argument.name">token</stringProp> <stringProp name="Argument.value"></stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp>
- 创建一个HTTP请求来模拟登录,并提取Token。
- 使用BeanShell后置处理器提取Token并保存为变量。
- 在其他接口请求中,通过引用Token变量来传递Token。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Login Request" enabled="true"> <elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="username" elementType="Argument"> <stringProp name="Argument.name">username</stringProp> <stringProp name="Argument.value">admin</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> <elementProp name="password" elementType="Argument"> <stringProp name="Argument.name">password</stringProp> <stringProp name="Argument.value">password123</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.path">/api/login</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.useChunking">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <BeanShellPostProcessor guiclass="BeanShellTestElementGui" testclass="BeanShellPostProcessor" testname="BeanShell PostProcessor" enabled="true"> <stringProp name="beanshell.postprocessor.filename"></stringProp> <stringProp name="beanshell.postprocessor.parameters"></stringProp> <stringProp name="beanshell.postprocessor.script"> <![CDATA[ import java.util.regex.Matcher; import java.util.regex.Pattern; // 获取响应数据 String response = prev.getResponseDataAsString(); // 正则表达式匹配Token Pattern p = Pattern.compile("token\":\"(.*?)\""); Matcher m = p.matcher(response); if (m.find()) { // 提取Token并保存为变量 vars.put("token", m.group(1)); } else { System.out.println("Token not found"); } ]]> </stringProp> </BeanShellPostProcessor> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Protected Request" enabled="true"> <elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="token" elementType="Argument"> <stringProp name="Argument.name">token</stringProp> <stringProp name="Argument.value">${token}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.path">/api/protected</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.useChunking">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy>
在HTTP请求中,可以通过查看响应数据来验证Token是否正确传递。确保响应中包含预期的数据或状态码。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Protected Request" enabled="true"> <elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="token" elementType="Argument"> <stringProp name="Argument.name">token</stringProp> <stringProp name="Argument.value">${token}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.path">/api/protected</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.useChunking">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy>
在HTTP请求中,可以添加断言(Assertion)来验证响应是否符合预期。
- 简单断言:验证响应中是否包含特定字符串。
- 响应断言:验证响应代码是否为200。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Protected Request" enabled="true"> <elementProp name="HTTPsampler.args" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="token" elementType="Argument"> <stringProp name="Argument.name">token</stringProp> <stringProp name="Argument.value">${token}</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">example.com</stringProp> <stringProp name="HTTPSampler.port"></stringProp> <stringProp name="HTTPSampler.path">/api/protected</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.use_keepalive">true</boolProp> <boolProp name="HTTPSampler.follow_redirects">true</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.useChunking">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> <elementProp name="HTTPsampler.assertions" elementType="Assertion" guiclass="AssertionGui" testclass="Assertion" testname="Response Assertion" enabled="true"> <boolProp name="Assertion.runTest">true</boolProp> <boolProp name="Assertion.ignoreBlank">false</boolProp> <stringProp name="Assertion.testType">0</stringProp> <stringProp name="Assertion.responseAssertion.testString">200</stringProp> <collectionProp name="Assertion.responseAssertion.responseCodes"> <stringProp name="47000">200</stringProp> </collectionProp> <boolProp name="Assertion.responseAssertion.successFromParser">true</boolProp> <boolProp name="Assertion.responseAssertion.includeDst">*</boolProp> <boolProp name="Assertion.responseAssertion.includeDst">\</boolProp> <boolProp name="Assertion.responseAssertion.includeDst">/</boolProp> <boolProp name="Assertion.responseAssertion.includeDst">?</boolProp> </elementProp> </HTTPSamplerProxy>
在运行测试计划后,可以通过查看结果树(View Results Tree)或聚合报告(Aggregate Report)来检查测试结果是否符合预期。
- 结果树:查看每个请求的具体响应数据。
- 聚合报告:查看整体性能指标,如响应时间、吞吐量等。
<resultTree> <result> <responseCode>200</responseCode> <responseMessage>OK</responseMessage> <threadName>main</threadName> <dataEncoding>UTF-8</dataEncoding> <responseData> <![CDATA[{"message": "Token validated successfully."}]> </responseData> </result> </resultTree>
- Token未正确提取:检查正则表达式是否正确匹配Token,如果需要,调整正则表达式。
- Token未传递:确保在获取Token的请求中正确配置了后置处理器,并正确引用了变量。
- Token过期或不正确:确认登录请求成功并检查响应数据中的Token是否有效。
- 优化网络请求:减少不必要的网络请求,例如合并多个请求为一个。
- 使用缓存:在测试计划中使用缓存机制,避免重复获取Token。
- 增加线程并发度:适当增加线程并发度,提高测试效率。
- 调整测试计划设置:优化线程组中的线程数和循环次数,确保测试计划合理。
- 错误提示:Token未找到:检查正则表达式是否匹配正确,确保响应数据中包含Token。
- 错误提示:Token传递失败:确保所有需要传递Token的请求中都正确引用了变量。
- 调试技巧:使用结果树(View Results Tree)查看每个请求的详细响应数据,进行逐个排查。
通过以上步骤,你可以在JMeter中顺利传递和验证Token,确保API测试的准确性和稳定性。
这篇关于JMeter传递token学习简易教程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-08给 Postgres 写一个向量插件 - 向量类型
- 2025-01-08高效短剧档期管理技巧,如何选择合适的软件?
- 2025-01-08从杂乱到有序:如何利用看板工具高效管理复杂的项目任务清单
- 2025-01-08短剧演员如何在繁忙档期中高效协作?使用管理软件的优势
- 2025-01-08选择清单管理系统的技巧:帮助团队实现高效协作
- 2025-01-08数字化转型中的清单管理工具:选择与应用指南
- 2025-01-08全面解析SaaS工时管理工具:5大看板工具如何提高工作效率
- 2025-01-07Spring Boot 集成 Easysearch 完整指南
- 2025-01-07需求管理工具的功能盘点:从任务分配到优先级管理的全面解析
- 2025-01-07优秀团队的选择:工时管理软件助力效率提升